[
  {
    "path": ".babelrc",
    "content": "{\n  \"presets\": [\n    [\n      \"@babel/preset-env\", {\n        \"targets\": {\n          \"node\": \"current\"\n        }\n      }\n    ]\n  ]\n}\n"
  },
  {
    "path": ".editorconfig",
    "content": "# EditorConfig is awesome: http://EditorConfig.org\n\nroot = true;\n\n[*]\n#  Ensure there's no lingering whitespace\ntrim_trailing_whitespace = true\n# Ensure a newline at the end of each file\ninsert_final_newline = true\n\n[*.js]\n# Unix-style newlines\nend_of_line = lf\ncharset = utf-8\nindent_style = space\nindent_size = 2"
  },
  {
    "path": ".eslintrc",
    "content": "{\n  \"parserOptions\": {\n    \"ecmaVersion\": 6,\n    \"sourceType\": \"module\"\n  },\n  \"rules\": {},\n  \"env\": {\n    \"browser\": true,\n    \"node\": true\n  }\n}\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: marcandre\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "content": "What kind of issue is this? (put 'x' between the square brackets)\n\n - [ ] Question. This issue tracker is not the place for questions. If you want to ask how to do\n       something, or to understand why something isn't working the way you expect it to, use\n       http://stackoverflow.com/questions/ask .\n       Provide working code, starting from http://codepen.io/marcandre/pen/jqbzyN?editors=101.\n       We monitor the tag `parsley.js`.\n\n - [ ] Bug report. If you’ve found a bug, you must provide a minimal example in a CodePen,\n       starting from http://codepen.io/marcandre/pen/jqbzyN?editors=101 .\n\n - [ ] Feature Request. Make sure there's no good way to do what you want first;\n       consider asking on http://stackoverflow.com/questions/ask first.\n\n\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\n\n# Logs\nlogs\n*.log\n\n# Runtime data\npids\n*.pid\n*.seed\n\n# Directory for instrumented libs generated by jscoverage/JSCover\nlib-cov\n\n# Coverage directory used by tools like istanbul\ncoverage\n\n# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)\n.grunt\n\n# Compiled binary addons (http://nodejs.org/api/addons.html)\nbuild/Release\n\n# Dependency directory\nnode_modules\ncoverage\ntmp\n\n# Users Environment Variables\n.lock-wscript\n\ndoc/assets/spec-build.js.map\n"
  },
  {
    "path": ".npmignore",
    "content": "/.github/\n/bower_components/\n/doc/\n/test/\n\n/CONTRIBUTING.md\n/gulpfile.babel.js\n/CNAME\n/yarn.lock\n/index.html\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: node_js\nnode_js:\n  - \"8\"\nsudo: false\nscript: \"gulp test\"\nenv:\n  - JQUERY=1.11\n  - JQUERY=1.12\n  - JQUERY=2.1\n  - JQUERY=2.2\n  - JQUERY=3.0.0\n  - JQUERY=3.1.1\ninstall:\n  - npm install --save-dev gulp@>=4\n  - npm install --save-dev \"rollup@>=0.66.0 <2\"\n  - npm install\n  - npm install jquery@$JQUERY\nmatrix:\n  allow_failures:\n    - env: JQUERY=3.0.0-beta1\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Parsley 2.x changelog\n\nParsley follows [semver](https://semver.org/). This lists new features only. For bug fixes and small changes, check the commit list.\n\n## 2.9\n\n- Added `euvatin` (European Union Value Added Tax Identification Number) validator.\n\n## 2.8\n\n- Added `refresh` method. Parsley automatically refreshes before validating, but `refresh` is there if one needs to insure that some fields are rebound/unbound, or triggers are updated, etc...\n\n- `Parsley.hasValidator` makes it easy to check if a validator exists or not [#1216]\n\n- `classHandler` now supports global functions, `errorWrapper` too. [#1101]\n\n## 2.7\n\n- Support for Date type (#1158)\n\n## 2.6.1\n\n- Avoid min/max/range validators for date type, until this is actually supported (#1158)\n\n## 2.6.0\n\n- While input with `type=\"number\"` must have a default step of 1, the default for\n  `data-parsley-type=\"number\"` has been changed to `'any'` as an hopeless attempt\n  to minimize the confusion around this validator. (#1129)\n\n## 2.5.1\n\n- An input with class 'required' will no longer be required; only having an attribute `'required'`\n  or `'data-parsley-required'` makes an input being required (#1138)\n\n## 2.5.0\n\n- New option `debounce` to minimize validation (#1103)\n\n## 2.4.2\n\n- `$('...').parsley({someOption: 'value'})` will always set the option `someOptions`. Previously if the field/form was already initialized, options were ignored.\n\n## 2.3.1\n\n- Parsley now relies on `input` events instead of `change` and `keyup` events\n  to revalidate after the first failure. This is now customizable with the\n  `triggerAfterFailure` option. Triggers specified with the `trigger` option\n  are unbound once a field has failed.\n- Parsley updates the UI before firing success/error/validated events\n- Deprecated uses of ParsleyUI. Methods are now instance methods of ParsleyField,\n  with modernized interfaces.\n\n## 2.2.0\n\n- type=\"number\" now follows HTML5 spec. In particular, commas are no longer accepted. (#1037)\n- Calls to validate, isValid, whenValidate, whenValid use named arguments\n  (e.g. validate({force: true, group: 'foo'})). Previous API is supported for\n  isValid/validate but is deprecated.\n- Drop support for undocumented option `eventValidate`.\n\n## 2.2.0-rc3\n\n- Merged both versions (remote and basic) of Parsley.\n  There is now a single version that is remote & promise aware.\n- Converted src/ and test/ to ECMAScript 6.\n  Requires es5-shim if you need compatibility with IE8.\n\n## 2.2.0-rc2\n\n- A custom validator may specify an error message by simply passing it as first argument\n  when rejecting the promise. (#560)\n- Submit buttons: data now included in the submitted form (#826) and\n  attribute 'formnovalidate' is supported (#972)\n- Remote: use HTTP status code for what is considered valid or not (#956)\n- Remote: allow RESTful urls where \"{value}\" is replaced by the value to validate\n- Remote: add field:ajaxoptions to allow customizing of the ajax parameters (#894)\n- pattern validator is now anchored, unless it looks like /pattern/flag (#861)\n- Parsley won't try to correct names with caps (#990)\n\n## 2.2.0-rc1\n\n- Major validators refactor:\n  - Compatible with promises from the ground up. Previous API (e.g. `isValid`)\n    remains, but promise-aware API is now recommended (e.g. `whenValid`).\n  - New API to define custom validators (old API is still there but deprecated).\n  - Shorter code, removed dependency on `validators` lib.\n  - The `remote` validator is much smaller now, will probably be merged in the future.\n\n- Deprecated `data-parsley-trim-value` in favour of new `whitespace` API\n- Added `whitespace` API with two options: `trim` and `squish`\n\n## 2.1.2\n\n- fix custom triggers after a `reset()` (#926)\n- fix documentation and generated dist files\n\n## 2.1.1\n\n- Bug fix for reentrant validations\n\n## 2.1.0\n\n- Event remodel\n  - New API `on` and `off` to register for events\n  - Global listeners added with `Parsley.on`\n  - Using the new API, event names no longer have their \".parsley\" ending\n  - Compatibility with previous API is maintained, but `$.emit`, `$.listen`,\n    etc. are now deprecated  (#899)\n\n- New features\n  - New event 'form:submit' fired before a form is submitted.\n  - The `value` option can now be a function\n  - Parsley.version is now the best way to get the current version\n  - Additional translations\n\n- Changes\n  - Error containers are created only the first time they are needed.\n  - [BC Break] `isValid()` field method now returns just a boolean, `[]` is no\n  more returned when field is optional and empty. `needsValidation()` appears\n  now to indicate if a valid field needed a validation.\n\n- Bug fixes\n  - Speed optimization (#855)\n  - Eemote cache now cleared after form submission (#813)\n  - Event 'field:reset' now fired if a field is no longer validated (because it\n    is excluded, or removed) (#841)\n  - Support for validators with compound names by restoring full case\n    sensitivity to error messages. (#805)\n  - Fix conflict between different forms on the same page (#888)\n  - Handles checkbox names containing spaces (#881)\n  - Detects name conflicts between validators and regular options\n  - Compatible with jQuery.noConflict() (#859)\n\n## 2.0.7\n\n- support of html5 `maxlength` and `minlength` (#731)\n- various doc updates\n- improved test suite\n- various small code simplifications\n- updated TLD range for URL validator (#829)\n\n## 2.0.6\n\n- removed buggy special char in remote.js plugin (#755)\n- fixed bug where isValid returned old errors on field with no constraints\n  anymore (#776)\n- fix a lot of tests\n\n## 2.0.5\n\n  - fixed AMD\n\n## 2.0.4\n\n  - added ParsleyField context to asyncValidator callback functions (#702)\n  - fixed AMD loading of Validator.js (#691, #693)\n  - added extra/words.js validators (#700)\n  - added support of multiple groups (#706)\n\n## 2.0.3\n\n  - fix not AMD loading for Wordpress case (#685)\n\n## 2.0.2\n\n  - proper version number in `dist/` files\n\n## 2.0.1\n\n  - fixed \"attr.specified is deprecated.\" console warning (#608)\n  - fixed package.json config with main dep (#617)\n  - fixed `addValidator()` method\n  - added support for `requirementsTransformer` for custom validators\n  - updated jQuery needed version from README and doc\n  - fixed case when a multiple item were dynamically removed from DOM (#634)\n  - added proper `type=\"range\"` support (#668)\n\n## 2.0.0\n\n  - fixed remote re-entering already validated value (#576)\n  - added `stopImmediatePropagation()` un `onSubmit()` method to avoid conflicts\n    with other libraries (#561)\n  - fixed parsleyFieldMultiple behavior that tried to bind non radio or checkbox\n    fields as a multiple field (#589)\n  - `input[type=hidden]` are now excluded by default (#589)\n  - fixed constraints unicity on fields belonging to same multiple group\n  - added `data-parsley-remote-validator` feature (#587)\n  - now support custom messages placeholders (#602)\n  - fix exception when ParsleyField or ParsleyFieldMultiple value is null or\n    undefined (#598)\n  - fixed `destroy()` method + added test (#555)\n  - added requirejs AMD support for `dist/parsley.js` and `dist/parsley.min.js`\n    versions (#606)\n  - fixed custom namespace -multiple that didn't re-evaluated correctly (#595)\n  - added `ParsleyUI.getErrorsMessages()` (Closes #607)\n\n## 2.0.0-rc5\n\n  - totally reworked multiple fields (#542):\n    - created a new Class: `ParsleyFieldMultiple`\n    - multiple fields returns now same `ParsleyFieldMultiple` instance\n  - `dist/parsley+remote.js` and `dist/parsley+remote.min.js` have been renamed\n    to `dist/parsley.remote.js` and `dist/parsley.remote.min.js`\n  - changed the way `asyncValidate` handle events\n  - fix warning if parsley called on a page without elements to validate (#562)\n  - fixed `ParsleyUtils.attr()` attribute checking (#564)\n  - updated `ParsleyUtils.get()` method. Do not support anymore placeholder\n    feature since `ParsleyUtils.get() || placeholder` writing is more readable\n  - select and select multiple elements both handle the `parsley-success` and\n    `parsley-error` classes directly and not their parent.\n  - added pattern flags support (#566, #550)\n  - fixed ParsleyFieldMultiple optional fields if not explicitely required\n  - fixed ParsleyFieldMultiple trigger\n  - fixed select UI auto-bind change on error (#537)\n  - fixed `asyncIsValid()` and `asyncValidate()` API to support `force` option\n\n## 2.0.0-rc4\n\n  - fixed js error if wrong data-parsley-errors-container is given\n  - fixed js error if `name=\"\"` or `id=\"\"` for parlsey multiple fields (#533)\n  - fixed dynamically added fields form inheritance (#532)\n  - fixed parsley-remote.js remote validator registration that overrided\n    other extra validators.\n  - added multiple xhr queries aborting in parsley.remote to avoid unneeded\n    server overload with keyup trigger\n  - fixed excluded fields option and added some doc for it (#546)\n  - fixed `range` validator with `0` value (#543)\n  - added `data-parsley-trim-value` option\n  - updated validator.js\n  - added `this.submitEvent.preventDefault()` support for parsley.remote\n    call twice form / field tests with parsley.remote for better support (#552)\n  - fixed global leaks shown by test suite\n  - new $ Parsley API behavior:\n    - returns `undefined` if called on non existing DOM element\n      + console warn (#548)\n    - returns an array of instances if called on selector with multiple\n      elements (#547)\n  - fixed `min`, `max`, `range` validators (#556)\n\n## 2.0.0-rc3\n\n  - fixed $ conflict (#525)\n  - added `force` validation for `isValid()` and `validate()`\n  - added doc events example\n  - added doc Help section\n  - added `data-parsley-errors-messages-disabled` option\n\n## 2.0.0-rc2\n\n  - added `data-parsley-validate-if-empty` field option (#489)\n  - fixed select multiple bug (#522)\n  - allowed checkbox, radio and select multiple inputs to have either a `name`\n    or an `id` to be binded (instead of just a name)\n\n## 2.0.0-rc1\n\n  - initial 2.x public release\n"
  },
  {
    "path": "CNAME",
    "content": "parsleyjs.org\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\nHi there.\n\nThanks for your interest in Parsley and your will to contribute. You're welcome!\n\nFirst thing: make sure you are using the **latest official release**.\n\n## Questions?\n\nPlease ask questions on [StackOverflow](http://stackoverflow.com/questions/ask) and be sure to include the `parsley.js` tag. Please **provide an example**, starting for example from [this jsfiddle](http://jsfiddle.net/marcandre/58vnaqur/)\n\n## Issues?\n\nIf you believe you have found a bug in `parsley`, please **provide an example**, starting for example from [this jsfiddle](http://jsfiddle.net/marcandre/58vnaqur/).\n\nThis makes it possible for you to be sure you have isolated the issue to a minimal case. It also makes it much easier for us to understand your issue. Sometimes the issue is [completely different than what you would expect](https://github.com/guillaumepotier/Parsley.js/issues/711) and only an actual example can lead to a solution.\n\n## Pull requests?\n\nTo run tests locally:\n\n    npm install\t          # needed only the very first time!\n    gulp test             # runs tests in the console\n    # or to run them in the browser:\n    gulp test-browser    \t# starts a local server\n    open test/runner.html # open in your favorite browser\n\n*Note:* Parsley is written in EcmaScript 6.\n\n*Note:* There's currently a test that fails on some system, a beer to you if you can fix that, see https://github.com/guillaumepotier/Parsley.js/issues/1095\n\n**More tips general to any open source projects**\n\nHere are a few simple rules you'll have to follow in order to ease code reviews,\ndiscussions and PR merging.\n\n1) You MUST follow Parsley coding standard. It basically follows\n[these popular rules](http://sideeffect.kr/popularconvention#javascript) except that\nfunctions are followed by one space on Parsley. Use two spaces as tabs.\n\n2) You MUST write / update tests for each code contribution you do\n\n3) You MUST commit a passing test-suite\n\n4) You SHOULD write documentation\n\n5) You MUST NOT modify `/dist`. Changes are made only to `/src`, `/test`, etc...\n\nPlease, write [commit messages that make\nsense](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html),\nand [rebase your branch](http://git-scm.com/book/en/Git-Branching-Rebasing)\nbefore submitting your Pull Request.\n\nOne may ask you to [squash your\ncommits](http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html)\ntoo. This is used to \"clean\" your Pull Request before merging it (we don't want\ncommits such as `fix tests`, `fix 2`, `fix 3`, etc.). Good rule of thumb: the test-suite must pass at each commit point.\n\nAlso, while creating your Pull Request on GitHub, you MUST write a description\nwhich gives the context and/or explains why you are creating it.\n\nThank you!\n\n\nInspired by http://williamdurand.fr/2013/07/04/on-open-sourcing-libraries/\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2013-2020 Guillaume Potier, Marc-André Lafortune and contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Parsley\n\n[![Build Status](https://travis-ci.org/guillaumepotier/Parsley.js.svg?branch=master)](https://travis-ci.org/guillaumepotier/Parsley.js)\n\nJavaScript form validation, without actually writing a single line of JavaScript!\n\n## Maintenance status\n\nThis project is considered stable, no new features are planned.\n\nMinimal maintenance by @marcandre. Good quality PRs fixing bugs will be merged. Enquire before working on new features.\n\n## Version\n\n2.9.2\n\n## Doc\n\nSee `index.html` and `doc/`\n\n## Requirements\n\n[jQuery](https://jquery.com/) >= 1.8 (compatible with 2.x and 3.0)\n[es5-shim](https://github.com/es-shims/es5-shim) if you want need to support IE8\n\n## Questions?\n\nPlease ask questions on [StackOverflow](https://stackoverflow.com/questions/ask) and be sure to include the `parsley.js` tag. Please **provide an example**, starting for example from [this jsfiddle](https://jsfiddle.net/marcandre/58vnaqur/)\n\n## Contributing\n\nSee the [`CONTRIBUTING.md` file](https://github.com/guillaumepotier/Parsley.js/blob/master/CONTRIBUTING.md)\n\n## Integrations\n\nCreate integration with other framework as a separate Github repo and send a pull request for including here.\nSome integrations are\n\n- [CakePHP](https://github.com/Codaxis/parsley-helper)\n- [Django](https://github.com/agiliq/django-parsley)\n- [Rails](https://github.com/mekishizufu/parsley-rails)\n- [OSSCDN by MaxCDN](https://osscdn.com/#/parsleyjs)\n- [Drupal](https://www.drupal.org/project/parsley)\n\n## Install dev environment and running tests\n\nFirst time: install `npm` and:\n\n```\nnpm install -g gulp\n```\n\nthen\n\n```\nnpm install\ngulp test\n```\n\n## Build `dist/` and `doc/annotated-source`\n\n```\ngulp build\n```\n\n## Run tests\n\nIn the browser: run a server with `gulp test-browser`, then open `test/runner.html`\n\nIn the terminal: `gulp test`\n\n## License\n\nReleased under the MIT License. See the bundled `LICENSE` file for\ndetails.\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Security Policy\n\n## Supported Versions\n\nLatest release\n\n## Reporting a Vulnerability\n\nContact Marc-André Lafortune (follow link from Github profile or @malafortune on Twitter)\n"
  },
  {
    "path": "UPGRADE-2.0.md",
    "content": "# UPGRADE FROM 1.x to 2.0\n\n## General\n\n- default namespace is now `data-parsley-` for DOM-API\n  (not anymore 1.2.x `parsley-` or 1.1.x `data-`)\n- there is only one global `ParsleyValidator` instance. Adding / removing\n  validators is not made on `ParsleyForm` or `ParsleyField` instances anymore,\n  but directly against `ParsleyValidator`. Same goes for errors messages.\n\n\n## Options / Configuration\n\n- `options` is now a flat 1 dim depth object.\n- These options have been removed:\n    - `listeners`\n    - `validators`\n    - `useHtml5Constraints`\n    - `messages`\n    - `validateIfUnchanged`\n- These options have been renamed:\n    - `validationMinlength` into `validationTreshold`\n    - `errors.classHandler` into `classHandler`\n    - `errors.container` into `errorsContainer`\n    - `errors.errorsWrapper` into `errorsWrapper`\n    - `errors.errorEleme` into `errorTemplate`\n\n\n## Validators\n\n  - `required` validator now accepts `false` value and becomes inactive.\n  - `rangelength` validator is now renamed as `length`. Same requirements.\n  - `rangecheck` validator is now renamed as `check`. Same requirements.\n  - `notnull`, `type=\"urlstrict\"`, `type=\"tel\"` have disappeared from built-in\n    validators.\n  - types `phone`, `urlstrict`, `dateIso` have been removed. They could be\n    crafted and submitted by someone in `extra/`\n\n\n## UI/UX\n\n  - `.parsley-validated` class is not added anymore on bound fields\n  - `novalidate` attr is now automatically added to `<form>`\n  - `.parsley-error-list` is now `.parsley-errors-list`\n  - to customize `type` validator error message, you do not need to add\n    the precise type anymore.\n    eg: `parsley-type-email-message=\"msg\"` becomes\n    `data-parsley-type-message=\"msg\"`\n\n\n## Javascript\n\n  - `.parsley('method')` API is deprecated. Use .parsley().method() now\n    eg: `$('#form').parsley('validate')` is now `$('#form').parsley().validate()`\n\n\n## Listeners\n\n  - can now be global with `$.listen()` and listen for every Parsley instance\n    firing it (the way `ParsleyUI` works)\n  - can be Field / Form specific by using `.subscribe()` and `.unsubscribe()`\n    on a Parsley instance.\n\n\n## Misc\n\n  - parsley `remote` validator is shipped now in parsley.remote.js\n  - parsley.extend is no more. Instead, extra validators are now placed in a\n    dir and can be built with a script into a single file.\n"
  },
  {
    "path": "UPGRADE-2.1.md",
    "content": "# UPGRADE FROM 2.0.x to 2.1.0\n\n## General\n\n2.1.0 version introduced some minor BC Breaks. Here is the list:\n\n### `isValid()` field methods returns boolean. If you had a test case like this:\n\n```javascript\nif ('object' === typeof $('#field').parsley().isValid() && !$('#field').parsley().isValid().length) {\n    // field is optional and empty, nor valid, nor invalid\n}\n```\n\nbecomes\n\n```javascript\nif ($('#field').parsley().isValid() && !$('#field').parsley().needsValidation()) {\n    // field is optional and empty, nor valid, nor invalid\n}\n```\n"
  },
  {
    "path": "UPGRADE-2.2.md",
    "content": "# UPGRADE FROM 2.1.x to 2.2.0\n\n## Where's parsley.remote?\n\nBoth versions (remote and basic) of Parsley have been merged. There is now a single version that is remote & promise aware, and it is lighter than both of the 2.1.x versions.\n\n## Compatibility\n\n2.2.0 version should be compatible with 2.1.x except that you need to include `es5-shim` if you need compatibility with IE8.\n\nPlease check the console for **deprecation notices** and adapt your code accordingly.\n\nNote that `type=\"number\"` now follows HTML5 spec. In particular, commas are no longer accepted. (#1037)\n\n## Source changes\n\nParsley's source is now in EcmaScript 6.\n\nThe `i18n` folder is now part of the `dist` folder.\n"
  },
  {
    "path": "bower.json",
    "content": "{\n  \"name\": \"parsleyjs\",\n  \"ignore\": [\n    \"**/.*\",\n    \"build\",\n    \"test\",\n    \"doc\",\n    \"*.md\",\n    \".json\",\n    \"*.html\",\n    \"AUTHORS.txt\",\n    \"Gruntfile.js\",\n    \"package.json\"\n  ],\n  \"dependencies\": {\n    \"jquery\": \">1.8\"\n  },\n  \"devDependencies\": {\n    \"expect.js\": \"*\",\n    \"mocha\": \"*\",\n    \"bootstrap\": \"~3.0.3\",\n    \"sinonjs\": \"~1.7.3\",\n    \"uwidget\": \"~0.0.1\"\n  },\n  \"keywords\": [\n    \"parsley\",\n    \"form\",\n    \"validation\",\n    \"html5\",\n    \"polyfill\"\n  ],\n  \"author\": {\n    \"name\": \"Guillaume Potier\",\n    \"email\": \"guillaume@wisembly.com\",\n    \"url\": \"http://guillaumepotier.com/\"\n  },\n  \"license\": \"MIT\",\n  \"main\": \"dist/parsley.js\"\n}\n"
  },
  {
    "path": "bower_components/bootstrap/.bower.json",
    "content": "{\n  \"name\": \"bootstrap\",\n  \"version\": \"3.0.3\",\n  \"main\": [\n    \"./dist/js/bootstrap.js\",\n    \"./dist/css/bootstrap.css\",\n    \"./dist/fonts/glyphicons-halflings-regular.eot\",\n    \"./dist/fonts/glyphicons-halflings-regular.svg\",\n    \"./dist/fonts/glyphicons-halflings-regular.ttf\",\n    \"./dist/fonts/glyphicons-halflings-regular.woff\"\n  ],\n  \"ignore\": [\n    \"**/.*\",\n    \"_*\",\n    \"docs-assets\",\n    \"examples\",\n    \"/fonts\",\n    \"js/tests\",\n    \"CNAME\",\n    \"CONTRIBUTING.md\",\n    \"Gruntfile.js\",\n    \"browserstack.json\",\n    \"composer.json\",\n    \"package.json\",\n    \"*.html\"\n  ],\n  \"dependencies\": {\n    \"jquery\": \">= 1.9.0\"\n  },\n  \"homepage\": \"https://github.com/twbs/bootstrap\",\n  \"_release\": \"3.0.3\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"v3.0.3\",\n    \"commit\": \"6d03173a1aad98e75f7d33e65b411c519176c59a\"\n  },\n  \"_source\": \"git://github.com/twbs/bootstrap.git\",\n  \"_target\": \"~3.0.3\",\n  \"_originalSource\": \"bootstrap\"\n}"
  },
  {
    "path": "bower_components/bootstrap/DOCS-LICENSE",
    "content": "Creative Commons Legal Code\n\nAttribution 3.0 Unported\n\n    CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE\n    LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN\n    ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS\n    INFORMATION ON AN \"AS-IS\" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES\n    REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR\n    DAMAGES RESULTING FROM ITS USE.\n\nLicense\n\nTHE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE\nCOMMONS PUBLIC LICENSE (\"CCPL\" OR \"LICENSE\"). THE WORK IS PROTECTED BY\nCOPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS\nAUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.\n\nBY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE\nTO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY\nBE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS\nCONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND\nCONDITIONS.\n\n1. Definitions\n\n a. \"Adaptation\" means a work based upon the Work, or upon the Work and\n    other pre-existing works, such as a translation, adaptation,\n    derivative work, arrangement of music or other alterations of a\n    literary or artistic work, or phonogram or performance and includes\n    cinematographic adaptations or any other form in which the Work may be\n    recast, transformed, or adapted including in any form recognizably\n    derived from the original, except that a work that constitutes a\n    Collection will not be considered an Adaptation for the purpose of\n    this License. For the avoidance of doubt, where the Work is a musical\n    work, performance or phonogram, the synchronization of the Work in\n    timed-relation with a moving image (\"synching\") will be considered an\n    Adaptation for the purpose of this License.\n b. \"Collection\" means a collection of literary or artistic works, such as\n    encyclopedias and anthologies, or performances, phonograms or\n    broadcasts, or other works or subject matter other than works listed\n    in Section 1(f) below, which, by reason of the selection and\n    arrangement of their contents, constitute intellectual creations, in\n    which the Work is included in its entirety in unmodified form along\n    with one or more other contributions, each constituting separate and\n    independent works in themselves, which together are assembled into a\n    collective whole. A work that constitutes a Collection will not be\n    considered an Adaptation (as defined above) for the purposes of this\n    License.\n c. \"Distribute\" means to make available to the public the original and\n    copies of the Work or Adaptation, as appropriate, through sale or\n    other transfer of ownership.\n d. \"Licensor\" means the individual, individuals, entity or entities that\n    offer(s) the Work under the terms of this License.\n e. \"Original Author\" means, in the case of a literary or artistic work,\n    the individual, individuals, entity or entities who created the Work\n    or if no individual or entity can be identified, the publisher; and in\n    addition (i) in the case of a performance the actors, singers,\n    musicians, dancers, and other persons who act, sing, deliver, declaim,\n    play in, interpret or otherwise perform literary or artistic works or\n    expressions of folklore; (ii) in the case of a phonogram the producer\n    being the person or legal entity who first fixes the sounds of a\n    performance or other sounds; and, (iii) in the case of broadcasts, the\n    organization that transmits the broadcast.\n f. \"Work\" means the literary and/or artistic work offered under the terms\n    of this License including without limitation any production in the\n    literary, scientific and artistic domain, whatever may be the mode or\n    form of its expression including digital form, such as a book,\n    pamphlet and other writing; a lecture, address, sermon or other work\n    of the same nature; a dramatic or dramatico-musical work; a\n    choreographic work or entertainment in dumb show; a musical\n    composition with or without words; a cinematographic work to which are\n    assimilated works expressed by a process analogous to cinematography;\n    a work of drawing, painting, architecture, sculpture, engraving or\n    lithography; a photographic work to which are assimilated works\n    expressed by a process analogous to photography; a work of applied\n    art; an illustration, map, plan, sketch or three-dimensional work\n    relative to geography, topography, architecture or science; a\n    performance; a broadcast; a phonogram; a compilation of data to the\n    extent it is protected as a copyrightable work; or a work performed by\n    a variety or circus performer to the extent it is not otherwise\n    considered a literary or artistic work.\n g. \"You\" means an individual or entity exercising rights under this\n    License who has not previously violated the terms of this License with\n    respect to the Work, or who has received express permission from the\n    Licensor to exercise rights under this License despite a previous\n    violation.\n h. \"Publicly Perform\" means to perform public recitations of the Work and\n    to communicate to the public those public recitations, by any means or\n    process, including by wire or wireless means or public digital\n    performances; to make available to the public Works in such a way that\n    members of the public may access these Works from a place and at a\n    place individually chosen by them; to perform the Work to the public\n    by any means or process and the communication to the public of the\n    performances of the Work, including by public digital performance; to\n    broadcast and rebroadcast the Work by any means including signs,\n    sounds or images.\n i. \"Reproduce\" means to make copies of the Work by any means including\n    without limitation by sound or visual recordings and the right of\n    fixation and reproducing fixations of the Work, including storage of a\n    protected performance or phonogram in digital form or other electronic\n    medium.\n\n2. Fair Dealing Rights. Nothing in this License is intended to reduce,\nlimit, or restrict any uses free from copyright or rights arising from\nlimitations or exceptions that are provided for in connection with the\ncopyright protection under copyright law or other applicable laws.\n\n3. License Grant. Subject to the terms and conditions of this License,\nLicensor hereby grants You a worldwide, royalty-free, non-exclusive,\nperpetual (for the duration of the applicable copyright) license to\nexercise the rights in the Work as stated below:\n\n a. to Reproduce the Work, to incorporate the Work into one or more\n    Collections, and to Reproduce the Work as incorporated in the\n    Collections;\n b. to create and Reproduce Adaptations provided that any such Adaptation,\n    including any translation in any medium, takes reasonable steps to\n    clearly label, demarcate or otherwise identify that changes were made\n    to the original Work. For example, a translation could be marked \"The\n    original work was translated from English to Spanish,\" or a\n    modification could indicate \"The original work has been modified.\";\n c. to Distribute and Publicly Perform the Work including as incorporated\n    in Collections; and,\n d. to Distribute and Publicly Perform Adaptations.\n e. For the avoidance of doubt:\n\n     i. Non-waivable Compulsory License Schemes. In those jurisdictions in\n        which the right to collect royalties through any statutory or\n        compulsory licensing scheme cannot be waived, the Licensor\n        reserves the exclusive right to collect such royalties for any\n        exercise by You of the rights granted under this License;\n    ii. Waivable Compulsory License Schemes. In those jurisdictions in\n        which the right to collect royalties through any statutory or\n        compulsory licensing scheme can be waived, the Licensor waives the\n        exclusive right to collect such royalties for any exercise by You\n        of the rights granted under this License; and,\n   iii. Voluntary License Schemes. The Licensor waives the right to\n        collect royalties, whether individually or, in the event that the\n        Licensor is a member of a collecting society that administers\n        voluntary licensing schemes, via that society, from any exercise\n        by You of the rights granted under this License.\n\nThe above rights may be exercised in all media and formats whether now\nknown or hereafter devised. The above rights include the right to make\nsuch modifications as are technically necessary to exercise the rights in\nother media and formats. Subject to Section 8(f), all rights not expressly\ngranted by Licensor are hereby reserved.\n\n4. Restrictions. The license granted in Section 3 above is expressly made\nsubject to and limited by the following restrictions:\n\n a. You may Distribute or Publicly Perform the Work only under the terms\n    of this License. You must include a copy of, or the Uniform Resource\n    Identifier (URI) for, this License with every copy of the Work You\n    Distribute or Publicly Perform. You may not offer or impose any terms\n    on the Work that restrict the terms of this License or the ability of\n    the recipient of the Work to exercise the rights granted to that\n    recipient under the terms of the License. You may not sublicense the\n    Work. You must keep intact all notices that refer to this License and\n    to the disclaimer of warranties with every copy of the Work You\n    Distribute or Publicly Perform. When You Distribute or Publicly\n    Perform the Work, You may not impose any effective technological\n    measures on the Work that restrict the ability of a recipient of the\n    Work from You to exercise the rights granted to that recipient under\n    the terms of the License. This Section 4(a) applies to the Work as\n    incorporated in a Collection, but this does not require the Collection\n    apart from the Work itself to be made subject to the terms of this\n    License. If You create a Collection, upon notice from any Licensor You\n    must, to the extent practicable, remove from the Collection any credit\n    as required by Section 4(b), as requested. If You create an\n    Adaptation, upon notice from any Licensor You must, to the extent\n    practicable, remove from the Adaptation any credit as required by\n    Section 4(b), as requested.\n b. If You Distribute, or Publicly Perform the Work or any Adaptations or\n    Collections, You must, unless a request has been made pursuant to\n    Section 4(a), keep intact all copyright notices for the Work and\n    provide, reasonable to the medium or means You are utilizing: (i) the\n    name of the Original Author (or pseudonym, if applicable) if supplied,\n    and/or if the Original Author and/or Licensor designate another party\n    or parties (e.g., a sponsor institute, publishing entity, journal) for\n    attribution (\"Attribution Parties\") in Licensor's copyright notice,\n    terms of service or by other reasonable means, the name of such party\n    or parties; (ii) the title of the Work if supplied; (iii) to the\n    extent reasonably practicable, the URI, if any, that Licensor\n    specifies to be associated with the Work, unless such URI does not\n    refer to the copyright notice or licensing information for the Work;\n    and (iv) , consistent with Section 3(b), in the case of an Adaptation,\n    a credit identifying the use of the Work in the Adaptation (e.g.,\n    \"French translation of the Work by Original Author,\" or \"Screenplay\n    based on original Work by Original Author\"). The credit required by\n    this Section 4 (b) may be implemented in any reasonable manner;\n    provided, however, that in the case of a Adaptation or Collection, at\n    a minimum such credit will appear, if a credit for all contributing\n    authors of the Adaptation or Collection appears, then as part of these\n    credits and in a manner at least as prominent as the credits for the\n    other contributing authors. For the avoidance of doubt, You may only\n    use the credit required by this Section for the purpose of attribution\n    in the manner set out above and, by exercising Your rights under this\n    License, You may not implicitly or explicitly assert or imply any\n    connection with, sponsorship or endorsement by the Original Author,\n    Licensor and/or Attribution Parties, as appropriate, of You or Your\n    use of the Work, without the separate, express prior written\n    permission of the Original Author, Licensor and/or Attribution\n    Parties.\n c. Except as otherwise agreed in writing by the Licensor or as may be\n    otherwise permitted by applicable law, if You Reproduce, Distribute or\n    Publicly Perform the Work either by itself or as part of any\n    Adaptations or Collections, You must not distort, mutilate, modify or\n    take other derogatory action in relation to the Work which would be\n    prejudicial to the Original Author's honor or reputation. Licensor\n    agrees that in those jurisdictions (e.g. Japan), in which any exercise\n    of the right granted in Section 3(b) of this License (the right to\n    make Adaptations) would be deemed to be a distortion, mutilation,\n    modification or other derogatory action prejudicial to the Original\n    Author's honor and reputation, the Licensor will waive or not assert,\n    as appropriate, this Section, to the fullest extent permitted by the\n    applicable national law, to enable You to reasonably exercise Your\n    right under Section 3(b) of this License (right to make Adaptations)\n    but not otherwise.\n\n5. Representations, Warranties and Disclaimer\n\nUNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR\nOFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY\nKIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,\nINCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,\nFITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF\nLATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,\nWHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION\nOF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.\n\n6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE\nLAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR\nANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES\nARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS\nBEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\n\n7. Termination\n\n a. This License and the rights granted hereunder will terminate\n    automatically upon any breach by You of the terms of this License.\n    Individuals or entities who have received Adaptations or Collections\n    from You under this License, however, will not have their licenses\n    terminated provided such individuals or entities remain in full\n    compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will\n    survive any termination of this License.\n b. Subject to the above terms and conditions, the license granted here is\n    perpetual (for the duration of the applicable copyright in the Work).\n    Notwithstanding the above, Licensor reserves the right to release the\n    Work under different license terms or to stop distributing the Work at\n    any time; provided, however that any such election will not serve to\n    withdraw this License (or any other license that has been, or is\n    required to be, granted under the terms of this License), and this\n    License will continue in full force and effect unless terminated as\n    stated above.\n\n8. Miscellaneous\n\n a. Each time You Distribute or Publicly Perform the Work or a Collection,\n    the Licensor offers to the recipient a license to the Work on the same\n    terms and conditions as the license granted to You under this License.\n b. Each time You Distribute or Publicly Perform an Adaptation, Licensor\n    offers to the recipient a license to the original Work on the same\n    terms and conditions as the license granted to You under this License.\n c. If any provision of this License is invalid or unenforceable under\n    applicable law, it shall not affect the validity or enforceability of\n    the remainder of the terms of this License, and without further action\n    by the parties to this agreement, such provision shall be reformed to\n    the minimum extent necessary to make such provision valid and\n    enforceable.\n d. No term or provision of this License shall be deemed waived and no\n    breach consented to unless such waiver or consent shall be in writing\n    and signed by the party to be charged with such waiver or consent.\n e. This License constitutes the entire agreement between the parties with\n    respect to the Work licensed here. There are no understandings,\n    agreements or representations with respect to the Work not specified\n    here. Licensor shall not be bound by any additional provisions that\n    may appear in any communication from You. This License may not be\n    modified without the mutual written agreement of the Licensor and You.\n f. The rights granted under, and the subject matter referenced, in this\n    License were drafted utilizing the terminology of the Berne Convention\n    for the Protection of Literary and Artistic Works (as amended on\n    September 28, 1979), the Rome Convention of 1961, the WIPO Copyright\n    Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996\n    and the Universal Copyright Convention (as revised on July 24, 1971).\n    These rights and subject matter take effect in the relevant\n    jurisdiction in which the License terms are sought to be enforced\n    according to the corresponding provisions of the implementation of\n    those treaty provisions in the applicable national law. If the\n    standard suite of rights granted under applicable copyright law\n    includes additional rights not granted under this License, such\n    additional rights are deemed to be included in the License; this\n    License is not intended to restrict the license of any rights under\n    applicable law.\n\n\nCreative Commons Notice\n\n    Creative Commons is not a party to this License, and makes no warranty\n    whatsoever in connection with the Work. Creative Commons will not be\n    liable to You or any party on any legal theory for any damages\n    whatsoever, including without limitation any general, special,\n    incidental or consequential damages arising in connection to this\n    license. Notwithstanding the foregoing two (2) sentences, if Creative\n    Commons has expressly identified itself as the Licensor hereunder, it\n    shall have all rights and obligations of Licensor.\n\n    Except for the limited purpose of indicating to the public that the\n    Work is licensed under the CCPL, Creative Commons does not authorize\n    the use by either party of the trademark \"Creative Commons\" or any\n    related trademark or logo of Creative Commons without the prior\n    written consent of Creative Commons. Any permitted use will be in\n    compliance with Creative Commons' then-current trademark usage\n    guidelines, as may be published on its website or otherwise made\n    available upon request from time to time. For the avoidance of doubt,\n    this trademark restriction does not form part of this License.\n\n    Creative Commons may be contacted at http://creativecommons.org/.\n"
  },
  {
    "path": "bower_components/bootstrap/LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n"
  },
  {
    "path": "bower_components/bootstrap/LICENSE-MIT",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2013 Twitter, Inc\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "bower_components/bootstrap/README.md",
    "content": "# [Bootstrap](http://getbootstrap.com) [![Build Status](https://secure.travis-ci.org/twbs/bootstrap.png)](http://travis-ci.org/twbs/bootstrap) [![devDependency Status](https://david-dm.org/twbs/bootstrap/dev-status.png)](https://david-dm.org/twbs/bootstrap#info=devDependencies)\n[![Selenium Test Status](https://saucelabs.com/browser-matrix/bootstrap.svg)](https://saucelabs.com/u/bootstrap)\n\nBootstrap is a sleek, intuitive, and powerful front-end framework for faster and easier web development, created and maintained by [Mark Otto](http://twitter.com/mdo) and [Jacob Thornton](http://twitter.com/fat).\n\nTo get started, check out <http://getbootstrap.com>!\n\n\n\n## Quick start\n\nThree quick start options are available:\n\n* [Download the latest release](https://github.com/twbs/bootstrap/archive/v3.0.3.zip).\n* Clone the repo: `git clone https://github.com/twbs/bootstrap.git`.\n* Install with [Bower](http://bower.io): `bower install bootstrap`.\n\nRead the [Getting Started page](http://getbootstrap.com/getting-started/) for information on the framework contents, templates and examples, and more.\n\n### What's included\n\nWithin the download you'll find the following directories and files, logically grouping common assets and providing both compiled and minified variations. You'll see something like this:\n\n```\nbootstrap/\n├── css/\n│   ├── bootstrap.css\n│   ├── bootstrap.min.css\n│   ├── bootstrap-theme.css\n│   └── bootstrap-theme.min.css\n├── js/\n│   ├── bootstrap.js\n│   └── bootstrap.min.js\n└── fonts/\n    ├── glyphicons-halflings-regular.eot\n    ├── glyphicons-halflings-regular.svg\n    ├── glyphicons-halflings-regular.ttf\n    └── glyphicons-halflings-regular.woff\n```\n\nWe provide compiled CSS and JS (`bootstrap.*`), as well as compiled and minified CSS and JS (`bootstrap.min.*`). Fonts from Glyphicons are included, as is the optional Bootstrap theme.\n\n\n\n## Bugs and feature requests\n\nHave a bug or a feature request? [Please open a new issue](https://github.com/twbs/bootstrap/issues). Before opening any issue, please search for existing issues and read the [Issue Guidelines](https://github.com/necolas/issue-guidelines), written by [Nicolas Gallagher](https://github.com/necolas/).\n\nYou may use [this JS Bin](http://jsbin.com/aKiCIDO/1/edit) as a template for your bug reports.\n\n\n\n## Documentation\n\nBootstrap's documentation, included in this repo in the root directory, is built with [Jekyll](http://jekyllrb.com) and publicly hosted on GitHub Pages at <http://getbootstrap.com>. The docs may also be run locally.\n\n### Running documentation locally\n\n1. If necessary, [install Jekyll](http://jekyllrb.com/docs/installation) (requires v1.x).\n2. From the root `/bootstrap` directory, run `jekyll serve` in the command line.\n  - **Windows users:** run `chcp 65001` first to change the command prompt's character encoding ([code page](http://en.wikipedia.org/wiki/Windows_code_page)) to UTF-8 so Jekyll runs without errors.\n3. Open <http://localhost:9001> in your browser, and voilà.\n\nLearn more about using Jekyll by reading its [documentation](http://jekyllrb.com/docs/home/).\n\n### Documentation for previous releases\n\nDocumentation for v2.3.2 has been made available for the time being at <http://getbootstrap.com/2.3.2/> while folks transition to Bootstrap 3.\n\n[Previous releases](https://github.com/twbs/bootstrap/releases) and their documentation are also available for download.\n\n\n\n## Compiling CSS and JavaScript\n\nBootstrap uses [Grunt](http://gruntjs.com/) with convenient methods for working with the framework. It's how we compile our code, run tests, and more. To use it, install the required dependencies as directed and then run some Grunt commands.\n\n### Install Grunt\n\nFrom the command line:\n\n1. Install `grunt-cli` globally with `npm install -g grunt-cli`.\n2. Navigate to the root `/bootstrap` directory, then run `npm install`. npm will look at [package.json](package.json) and automatically install the necessary local dependencies listed there.\n\nWhen completed, you'll be able to run the various Grunt commands provided from the command line.\n\n**Unfamiliar with `npm`? Don't have node installed?** That's a-okay. npm stands for [node packaged modules](http://npmjs.org/) and is a way to manage development dependencies through node.js. [Download and install node.js](http://nodejs.org/download/) before proceeding.\n\n### Available Grunt commands\n\n#### Build - `grunt`\nRun `grunt` to run tests locally and compile the CSS and JavaScript into `/dist`. **Uses [recess](http://twitter.github.io/recess/) and [UglifyJS](http://lisperator.net/uglifyjs/).**\n\n#### Only compile CSS and JavaScript - `grunt dist`\n`grunt dist` creates the `/dist` directory with compiled files. **Uses [recess](http://twitter.github.io/recess/) and [UglifyJS](http://lisperator.net/uglifyjs/).**\n\n#### Tests - `grunt test`\nRuns [JSHint](http://jshint.com) and [QUnit](http://qunitjs.com/) tests headlessly in [PhantomJS](http://phantomjs.org/) (used for CI).\n\n#### Watch - `grunt watch`\nThis is a convenience method for watching just Less files and automatically building them whenever you save.\n\n### Troubleshooting dependencies\n\nShould you encounter problems with installing dependencies or running Grunt commands, uninstall all previous dependency versions (global and local). Then, rerun `npm install`.\n\n\n\n## Contributing\n\nPlease read through our [contributing guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md). Included are directions for opening issues, coding standards, and notes on development.\n\nMore over, if your pull request contains JavaScript patches or features, you must include relevant unit tests. All HTML and CSS should conform to the [Code Guide](http://github.com/mdo/code-guide), maintained by [Mark Otto](http://github.com/mdo).\n\nEditor preferences are available in the [editor config](.editorconfig) for easy use in common text editors. Read more and download plugins at <http://editorconfig.org>.\n\nWith v3.1, we're moving from the Apache 2 to the MIT license for the Bootstrap code (not the docs). Please see the [contributing guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md) for more information.\n\n\n## Community\n\nKeep track of development and community news.\n\n* Follow [@twbootstrap on Twitter](http://twitter.com/twbootstrap).\n* Read and subscribe to [The Official Bootstrap Blog](http://blog.getbootstrap.com).\n* Have a question that's not a feature request or bug report? [Ask on the mailing list.](http://groups.google.com/group/twitter-bootstrap)\n* Chat with fellow Bootstrappers in IRC. On the `irc.freenode.net` server, in the `##twitter-bootstrap` channel.\n\n\n\n\n## Versioning\n\nFor transparency and insight into our release cycle, and for striving to maintain backward compatibility, Bootstrap will be maintained under the Semantic Versioning guidelines as much as possible.\n\nReleases will be numbered with the following format:\n\n`<major>.<minor>.<patch>`\n\nAnd constructed with the following guidelines:\n\n* Breaking backward compatibility bumps the major (and resets the minor and patch)\n* New additions without breaking backward compatibility bumps the minor (and resets the patch)\n* Bug fixes and misc changes bumps the patch\n\nFor more information on SemVer, please visit <http://semver.org/>.\n\n\n\n## Authors\n\n**Mark Otto**\n\n+ <http://twitter.com/mdo>\n+ <http://github.com/mdo>\n\n**Jacob Thornton**\n\n+ <http://twitter.com/fat>\n+ <http://github.com/fat>\n\n\n\n## Copyright and license\n\nCopyright 2013 Twitter, Inc under [the Apache 2.0 license](LICENSE).\n"
  },
  {
    "path": "bower_components/bootstrap/bower.json",
    "content": "{\n  \"name\": \"bootstrap\",\n  \"version\": \"3.0.3\",\n  \"main\": [\n    \"./dist/js/bootstrap.js\", \n    \"./dist/css/bootstrap.css\", \n    \"./dist/fonts/glyphicons-halflings-regular.eot\",\n    \"./dist/fonts/glyphicons-halflings-regular.svg\",\n    \"./dist/fonts/glyphicons-halflings-regular.ttf\",\n    \"./dist/fonts/glyphicons-halflings-regular.woff\"\n  ],\n  \"ignore\": [\n    \"**/.*\",\n    \"_*\",\n    \"docs-assets\",\n    \"examples\",\n    \"/fonts\",\n    \"js/tests\",\n    \"CNAME\",\n    \"CONTRIBUTING.md\",\n    \"Gruntfile.js\",\n    \"browserstack.json\",\n    \"composer.json\",\n    \"package.json\",\n    \"*.html\"\n  ],\n  \"dependencies\": {\n    \"jquery\": \">= 1.9.0\"\n  }\n}\n"
  },
  {
    "path": "bower_components/bootstrap/dist/css/bootstrap-theme.css",
    "content": "/*!\n * Bootstrap v3.0.3 (http://getbootstrap.com)\n * Copyright 2013 Twitter, Inc.\n * Licensed under http://www.apache.org/licenses/LICENSE-2.0\n */\n\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, 0.2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn:active,\n.btn.active {\n  background-image: none;\n}\n\n.btn-default {\n  text-shadow: 0 1px 0 #fff;\n  background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n  background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%);\n  background-repeat: repeat-x;\n  border-color: #dbdbdb;\n  border-color: #ccc;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.btn-default:hover,\n.btn-default:focus {\n  background-color: #e0e0e0;\n  background-position: 0 -15px;\n}\n\n.btn-default:active,\n.btn-default.active {\n  background-color: #e0e0e0;\n  border-color: #dbdbdb;\n}\n\n.btn-primary {\n  background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%);\n  background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%);\n  background-repeat: repeat-x;\n  border-color: #2b669a;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.btn-primary:hover,\n.btn-primary:focus {\n  background-color: #2d6ca2;\n  background-position: 0 -15px;\n}\n\n.btn-primary:active,\n.btn-primary.active {\n  background-color: #2d6ca2;\n  border-color: #2b669a;\n}\n\n.btn-success {\n  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n  background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n  background-repeat: repeat-x;\n  border-color: #3e8f3e;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.btn-success:hover,\n.btn-success:focus {\n  background-color: #419641;\n  background-position: 0 -15px;\n}\n\n.btn-success:active,\n.btn-success.active {\n  background-color: #419641;\n  border-color: #3e8f3e;\n}\n\n.btn-warning {\n  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n  background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n  background-repeat: repeat-x;\n  border-color: #e38d13;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.btn-warning:hover,\n.btn-warning:focus {\n  background-color: #eb9316;\n  background-position: 0 -15px;\n}\n\n.btn-warning:active,\n.btn-warning.active {\n  background-color: #eb9316;\n  border-color: #e38d13;\n}\n\n.btn-danger {\n  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n  background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n  background-repeat: repeat-x;\n  border-color: #b92c28;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.btn-danger:hover,\n.btn-danger:focus {\n  background-color: #c12e2a;\n  background-position: 0 -15px;\n}\n\n.btn-danger:active,\n.btn-danger.active {\n  background-color: #c12e2a;\n  border-color: #b92c28;\n}\n\n.btn-info {\n  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n  background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n  background-repeat: repeat-x;\n  border-color: #28a4c9;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.btn-info:hover,\n.btn-info:focus {\n  background-color: #2aabd2;\n  background-position: 0 -15px;\n}\n\n.btn-info:active,\n.btn-info.active {\n  background-color: #2aabd2;\n  border-color: #28a4c9;\n}\n\n.thumbnail,\n.img-thumbnail {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  background-color: #e8e8e8;\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  background-color: #357ebd;\n  background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);\n  background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);\n}\n\n.navbar-default {\n  background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n  background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n  background-repeat: repeat-x;\n  border-radius: 4px;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n\n.navbar-default .navbar-nav > .active > a {\n  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);\n  background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n\n.navbar-brand,\n.navbar-nav > li > a {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n\n.navbar-inverse {\n  background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n  background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.navbar-inverse .navbar-nav > .active > a {\n  background-image: -webkit-linear-gradient(top, #222222 0%, #282828 100%);\n  background-image: linear-gradient(to bottom, #222222 0%, #282828 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n          box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  border-radius: 0;\n}\n\n.alert {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n\n.alert-success {\n  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n  background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n  background-repeat: repeat-x;\n  border-color: #b2dba1;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n}\n\n.alert-info {\n  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n  background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n  background-repeat: repeat-x;\n  border-color: #9acfea;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n}\n\n.alert-warning {\n  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n  background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n  background-repeat: repeat-x;\n  border-color: #f5e79e;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n}\n\n.alert-danger {\n  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n  background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n  background-repeat: repeat-x;\n  border-color: #dca7a7;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n}\n\n.progress {\n  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n  background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n\n.progress-bar {\n  background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%);\n  background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);\n}\n\n.progress-bar-success {\n  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n  background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n\n.progress-bar-info {\n  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n  background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n\n.progress-bar-warning {\n  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n  background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n\n.progress-bar-danger {\n  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n  background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n\n.list-group {\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  text-shadow: 0 -1px 0 #3071a9;\n  background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%);\n  background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%);\n  background-repeat: repeat-x;\n  border-color: #3278b3;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);\n}\n\n.panel {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n\n.panel-default > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n\n.panel-primary > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);\n  background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);\n}\n\n.panel-success > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n  background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n\n.panel-info > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n  background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n\n.panel-warning > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n  background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n\n.panel-danger > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n  background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n\n.well {\n  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n  background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n  background-repeat: repeat-x;\n  border-color: #dcdcdc;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n          box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}"
  },
  {
    "path": "bower_components/bootstrap/dist/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v3.0.3 (http://getbootstrap.com)\n * Copyright 2013 Twitter, Inc.\n * Licensed under http://www.apache.org/licenses/LICENSE-2.0\n */\n\n/*! normalize.css v2.1.3 | MIT License | git.io/normalize */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n}\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n[hidden],\ntemplate {\n  display: none;\n}\n\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\n\nbody {\n  margin: 0;\n}\n\na {\n  background: transparent;\n}\n\na:focus {\n  outline: thin dotted;\n}\n\na:active,\na:hover {\n  outline: 0;\n}\n\nh1 {\n  margin: 0.67em 0;\n  font-size: 2em;\n}\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\nb,\nstrong {\n  font-weight: bold;\n}\n\ndfn {\n  font-style: italic;\n}\n\nhr {\n  height: 0;\n  -moz-box-sizing: content-box;\n       box-sizing: content-box;\n}\n\nmark {\n  color: #000;\n  background: #ff0;\n}\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, serif;\n  font-size: 1em;\n}\n\npre {\n  white-space: pre-wrap;\n}\n\nq {\n  quotes: \"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\";\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nimg {\n  border: 0;\n}\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\nfigure {\n  margin: 0;\n}\n\nfieldset {\n  padding: 0.35em 0.625em 0.75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\n\nlegend {\n  padding: 0;\n  border: 0;\n}\n\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: 100%;\n}\n\nbutton,\ninput {\n  line-height: normal;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  cursor: pointer;\n  -webkit-appearance: button;\n}\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  padding: 0;\n  box-sizing: border-box;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\n\ntextarea {\n  overflow: auto;\n  vertical-align: top;\n}\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\n@media print {\n  * {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  a[href^=\"javascript:\"]:after,\n  a[href^=\"#\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  @page  {\n    margin: 2cm .5cm;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  select {\n    background: #fff !important;\n  }\n  .navbar {\n    display: none;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n\n*,\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\nhtml {\n  font-size: 62.5%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #333333;\n  background-color: #ffffff;\n}\n\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\na {\n  color: #428bca;\n  text-decoration: none;\n}\n\na:hover,\na:focus {\n  color: #2a6496;\n  text-decoration: underline;\n}\n\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\nimg {\n  vertical-align: middle;\n}\n\n.img-responsive {\n  display: block;\n  height: auto;\n  max-width: 100%;\n}\n\n.img-rounded {\n  border-radius: 6px;\n}\n\n.img-thumbnail {\n  display: inline-block;\n  height: auto;\n  max-width: 100%;\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\n.img-circle {\n  border-radius: 50%;\n}\n\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n}\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\n\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n  font-weight: normal;\n  line-height: 1;\n  color: #999999;\n}\n\nh1,\nh2,\nh3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\n\nh1 small,\nh2 small,\nh3 small,\nh1 .small,\nh2 .small,\nh3 .small {\n  font-size: 65%;\n}\n\nh4,\nh5,\nh6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n\nh4 small,\nh5 small,\nh6 small,\nh4 .small,\nh5 .small,\nh6 .small {\n  font-size: 75%;\n}\n\nh1,\n.h1 {\n  font-size: 36px;\n}\n\nh2,\n.h2 {\n  font-size: 30px;\n}\n\nh3,\n.h3 {\n  font-size: 24px;\n}\n\nh4,\n.h4 {\n  font-size: 18px;\n}\n\nh5,\n.h5 {\n  font-size: 14px;\n}\n\nh6,\n.h6 {\n  font-size: 12px;\n}\n\np {\n  margin: 0 0 10px;\n}\n\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 200;\n  line-height: 1.4;\n}\n\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\n\nsmall,\n.small {\n  font-size: 85%;\n}\n\ncite {\n  font-style: normal;\n}\n\n.text-muted {\n  color: #999999;\n}\n\n.text-primary {\n  color: #428bca;\n}\n\n.text-primary:hover {\n  color: #3071a9;\n}\n\n.text-warning {\n  color: #8a6d3b;\n}\n\n.text-warning:hover {\n  color: #66512c;\n}\n\n.text-danger {\n  color: #a94442;\n}\n\n.text-danger:hover {\n  color: #843534;\n}\n\n.text-success {\n  color: #3c763d;\n}\n\n.text-success:hover {\n  color: #2b542c;\n}\n\n.text-info {\n  color: #31708f;\n}\n\n.text-info:hover {\n  color: #245269;\n}\n\n.text-left {\n  text-align: left;\n}\n\n.text-right {\n  text-align: right;\n}\n\n.text-center {\n  text-align: center;\n}\n\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee;\n}\n\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\n\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\n\n.list-inline > li:first-child {\n  padding-left: 0;\n}\n\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\n\ndt,\ndd {\n  line-height: 1.428571429;\n}\n\ndt {\n  font-weight: bold;\n}\n\ndd {\n  margin-left: 0;\n}\n\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n}\n\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #999999;\n}\n\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  border-left: 5px solid #eeeeee;\n}\n\nblockquote p {\n  font-size: 17.5px;\n  font-weight: 300;\n  line-height: 1.25;\n}\n\nblockquote p:last-child {\n  margin-bottom: 0;\n}\n\nblockquote small,\nblockquote .small {\n  display: block;\n  line-height: 1.428571429;\n  color: #999999;\n}\n\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\n\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n}\n\nblockquote.pull-right p,\nblockquote.pull-right small,\nblockquote.pull-right .small {\n  text-align: right;\n}\n\nblockquote.pull-right small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n\nblockquote.pull-right small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\n\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\n\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.428571429;\n}\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\n\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  white-space: nowrap;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\n\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.428571429;\n  color: #333333;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: #f5f5f5;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\n\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border-radius: 0;\n}\n\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n\n.container {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .container {\n    width: 750px;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    width: 970px;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px;\n  }\n}\n\n.row {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.col-xs-1,\n.col-sm-1,\n.col-md-1,\n.col-lg-1,\n.col-xs-2,\n.col-sm-2,\n.col-md-2,\n.col-lg-2,\n.col-xs-3,\n.col-sm-3,\n.col-md-3,\n.col-lg-3,\n.col-xs-4,\n.col-sm-4,\n.col-md-4,\n.col-lg-4,\n.col-xs-5,\n.col-sm-5,\n.col-md-5,\n.col-lg-5,\n.col-xs-6,\n.col-sm-6,\n.col-md-6,\n.col-lg-6,\n.col-xs-7,\n.col-sm-7,\n.col-md-7,\n.col-lg-7,\n.col-xs-8,\n.col-sm-8,\n.col-md-8,\n.col-lg-8,\n.col-xs-9,\n.col-sm-9,\n.col-md-9,\n.col-lg-9,\n.col-xs-10,\n.col-sm-10,\n.col-md-10,\n.col-lg-10,\n.col-xs-11,\n.col-sm-11,\n.col-md-11,\n.col-lg-11,\n.col-xs-12,\n.col-sm-12,\n.col-md-12,\n.col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12 {\n  float: left;\n}\n\n.col-xs-12 {\n  width: 100%;\n}\n\n.col-xs-11 {\n  width: 91.66666666666666%;\n}\n\n.col-xs-10 {\n  width: 83.33333333333334%;\n}\n\n.col-xs-9 {\n  width: 75%;\n}\n\n.col-xs-8 {\n  width: 66.66666666666666%;\n}\n\n.col-xs-7 {\n  width: 58.333333333333336%;\n}\n\n.col-xs-6 {\n  width: 50%;\n}\n\n.col-xs-5 {\n  width: 41.66666666666667%;\n}\n\n.col-xs-4 {\n  width: 33.33333333333333%;\n}\n\n.col-xs-3 {\n  width: 25%;\n}\n\n.col-xs-2 {\n  width: 16.666666666666664%;\n}\n\n.col-xs-1 {\n  width: 8.333333333333332%;\n}\n\n.col-xs-pull-12 {\n  right: 100%;\n}\n\n.col-xs-pull-11 {\n  right: 91.66666666666666%;\n}\n\n.col-xs-pull-10 {\n  right: 83.33333333333334%;\n}\n\n.col-xs-pull-9 {\n  right: 75%;\n}\n\n.col-xs-pull-8 {\n  right: 66.66666666666666%;\n}\n\n.col-xs-pull-7 {\n  right: 58.333333333333336%;\n}\n\n.col-xs-pull-6 {\n  right: 50%;\n}\n\n.col-xs-pull-5 {\n  right: 41.66666666666667%;\n}\n\n.col-xs-pull-4 {\n  right: 33.33333333333333%;\n}\n\n.col-xs-pull-3 {\n  right: 25%;\n}\n\n.col-xs-pull-2 {\n  right: 16.666666666666664%;\n}\n\n.col-xs-pull-1 {\n  right: 8.333333333333332%;\n}\n\n.col-xs-pull-0 {\n  right: 0;\n}\n\n.col-xs-push-12 {\n  left: 100%;\n}\n\n.col-xs-push-11 {\n  left: 91.66666666666666%;\n}\n\n.col-xs-push-10 {\n  left: 83.33333333333334%;\n}\n\n.col-xs-push-9 {\n  left: 75%;\n}\n\n.col-xs-push-8 {\n  left: 66.66666666666666%;\n}\n\n.col-xs-push-7 {\n  left: 58.333333333333336%;\n}\n\n.col-xs-push-6 {\n  left: 50%;\n}\n\n.col-xs-push-5 {\n  left: 41.66666666666667%;\n}\n\n.col-xs-push-4 {\n  left: 33.33333333333333%;\n}\n\n.col-xs-push-3 {\n  left: 25%;\n}\n\n.col-xs-push-2 {\n  left: 16.666666666666664%;\n}\n\n.col-xs-push-1 {\n  left: 8.333333333333332%;\n}\n\n.col-xs-push-0 {\n  left: 0;\n}\n\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n\n.col-xs-offset-11 {\n  margin-left: 91.66666666666666%;\n}\n\n.col-xs-offset-10 {\n  margin-left: 83.33333333333334%;\n}\n\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n\n.col-xs-offset-8 {\n  margin-left: 66.66666666666666%;\n}\n\n.col-xs-offset-7 {\n  margin-left: 58.333333333333336%;\n}\n\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n\n.col-xs-offset-5 {\n  margin-left: 41.66666666666667%;\n}\n\n.col-xs-offset-4 {\n  margin-left: 33.33333333333333%;\n}\n\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n\n.col-xs-offset-2 {\n  margin-left: 16.666666666666664%;\n}\n\n.col-xs-offset-1 {\n  margin-left: 8.333333333333332%;\n}\n\n.col-xs-offset-0 {\n  margin-left: 0;\n}\n\n@media (min-width: 768px) {\n  .col-sm-1,\n  .col-sm-2,\n  .col-sm-3,\n  .col-sm-4,\n  .col-sm-5,\n  .col-sm-6,\n  .col-sm-7,\n  .col-sm-8,\n  .col-sm-9,\n  .col-sm-10,\n  .col-sm-11,\n  .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666666666666%;\n  }\n  .col-sm-10 {\n    width: 83.33333333333334%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666666666666%;\n  }\n  .col-sm-7 {\n    width: 58.333333333333336%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666666666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.666666666666664%;\n  }\n  .col-sm-1 {\n    width: 8.333333333333332%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-sm-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-sm-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-sm-pull-0 {\n    right: 0;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-sm-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-sm-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-sm-push-0 {\n    left: 0;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0;\n  }\n}\n\n@media (min-width: 992px) {\n  .col-md-1,\n  .col-md-2,\n  .col-md-3,\n  .col-md-4,\n  .col-md-5,\n  .col-md-6,\n  .col-md-7,\n  .col-md-8,\n  .col-md-9,\n  .col-md-10,\n  .col-md-11,\n  .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666666666666%;\n  }\n  .col-md-10 {\n    width: 83.33333333333334%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666666666666%;\n  }\n  .col-md-7 {\n    width: 58.333333333333336%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666666666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.666666666666664%;\n  }\n  .col-md-1 {\n    width: 8.333333333333332%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-md-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-md-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-md-pull-0 {\n    right: 0;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-md-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-md-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-md-push-0 {\n    left: 0;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0;\n  }\n}\n\n@media (min-width: 1200px) {\n  .col-lg-1,\n  .col-lg-2,\n  .col-lg-3,\n  .col-lg-4,\n  .col-lg-5,\n  .col-lg-6,\n  .col-lg-7,\n  .col-lg-8,\n  .col-lg-9,\n  .col-lg-10,\n  .col-lg-11,\n  .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666666666666%;\n  }\n  .col-lg-10 {\n    width: 83.33333333333334%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666666666666%;\n  }\n  .col-lg-7 {\n    width: 58.333333333333336%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666666666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.666666666666664%;\n  }\n  .col-lg-1 {\n    width: 8.333333333333332%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-lg-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-lg-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-lg-pull-0 {\n    right: 0;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-lg-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-lg-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-lg-push-0 {\n    left: 0;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0;\n  }\n}\n\ntable {\n  max-width: 100%;\n  background-color: transparent;\n}\n\nth {\n  text-align: left;\n}\n\n.table {\n  width: 100%;\n  margin-bottom: 20px;\n}\n\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.428571429;\n  vertical-align: top;\n  border-top: 1px solid #dddddd;\n}\n\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dddddd;\n}\n\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n  border-top: 0;\n}\n\n.table > tbody + tbody {\n  border-top: 2px solid #dddddd;\n}\n\n.table .table {\n  background-color: #ffffff;\n}\n\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n  padding: 5px;\n}\n\n.table-bordered {\n  border: 1px solid #dddddd;\n}\n\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #dddddd;\n}\n\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n\n.table-striped > tbody > tr:nth-child(odd) > td,\n.table-striped > tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9;\n}\n\n.table-hover > tbody > tr:hover > td,\n.table-hover > tbody > tr:hover > th {\n  background-color: #f5f5f5;\n}\n\ntable col[class*=\"col-\"] {\n  position: static;\n  display: table-column;\n  float: none;\n}\n\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  display: table-cell;\n  float: none;\n}\n\n.table > thead > tr > .active,\n.table > tbody > tr > .active,\n.table > tfoot > tr > .active,\n.table > thead > .active > td,\n.table > tbody > .active > td,\n.table > tfoot > .active > td,\n.table > thead > .active > th,\n.table > tbody > .active > th,\n.table > tfoot > .active > th {\n  background-color: #f5f5f5;\n}\n\n.table-hover > tbody > tr > .active:hover,\n.table-hover > tbody > .active:hover > td,\n.table-hover > tbody > .active:hover > th {\n  background-color: #e8e8e8;\n}\n\n.table > thead > tr > .success,\n.table > tbody > tr > .success,\n.table > tfoot > tr > .success,\n.table > thead > .success > td,\n.table > tbody > .success > td,\n.table > tfoot > .success > td,\n.table > thead > .success > th,\n.table > tbody > .success > th,\n.table > tfoot > .success > th {\n  background-color: #dff0d8;\n}\n\n.table-hover > tbody > tr > .success:hover,\n.table-hover > tbody > .success:hover > td,\n.table-hover > tbody > .success:hover > th {\n  background-color: #d0e9c6;\n}\n\n.table > thead > tr > .danger,\n.table > tbody > tr > .danger,\n.table > tfoot > tr > .danger,\n.table > thead > .danger > td,\n.table > tbody > .danger > td,\n.table > tfoot > .danger > td,\n.table > thead > .danger > th,\n.table > tbody > .danger > th,\n.table > tfoot > .danger > th {\n  background-color: #f2dede;\n}\n\n.table-hover > tbody > tr > .danger:hover,\n.table-hover > tbody > .danger:hover > td,\n.table-hover > tbody > .danger:hover > th {\n  background-color: #ebcccc;\n}\n\n.table > thead > tr > .warning,\n.table > tbody > tr > .warning,\n.table > tfoot > tr > .warning,\n.table > thead > .warning > td,\n.table > tbody > .warning > td,\n.table > tfoot > .warning > td,\n.table > thead > .warning > th,\n.table > tbody > .warning > th,\n.table > tfoot > .warning > th {\n  background-color: #fcf8e3;\n}\n\n.table-hover > tbody > tr > .warning:hover,\n.table-hover > tbody > .warning:hover > td,\n.table-hover > tbody > .warning:hover > th {\n  background-color: #faf2cc;\n}\n\n@media (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-x: scroll;\n    overflow-y: hidden;\n    border: 1px solid #dddddd;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    -webkit-overflow-scrolling: touch;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  /* IE8-9 */\n\n  line-height: normal;\n}\n\ninput[type=\"file\"] {\n  display: block;\n}\n\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\nselect optgroup {\n  font-family: inherit;\n  font-size: inherit;\n  font-style: inherit;\n}\n\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\ninput[type=\"number\"]::-webkit-outer-spin-button,\ninput[type=\"number\"]::-webkit-inner-spin-button {\n  height: auto;\n}\n\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #555555;\n  vertical-align: middle;\n}\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #555555;\n  vertical-align: middle;\n  background-color: #ffffff;\n  background-image: none;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n          transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n\n.form-control:-moz-placeholder {\n  color: #999999;\n}\n\n.form-control::-moz-placeholder {\n  color: #999999;\n  opacity: 1;\n}\n\n.form-control:-ms-input-placeholder {\n  color: #999999;\n}\n\n.form-control::-webkit-input-placeholder {\n  color: #999999;\n}\n\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  background-color: #eeeeee;\n}\n\ntextarea.form-control {\n  height: auto;\n}\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n.radio,\n.checkbox {\n  display: block;\n  min-height: 20px;\n  padding-left: 20px;\n  margin-top: 10px;\n  margin-bottom: 10px;\n  vertical-align: middle;\n}\n\n.radio label,\n.checkbox label {\n  display: inline;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -20px;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  vertical-align: middle;\n  cursor: pointer;\n}\n\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\n\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\n.radio[disabled],\n.radio-inline[disabled],\n.checkbox[disabled],\n.checkbox-inline[disabled],\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"],\nfieldset[disabled] .radio,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\n\ntextarea.input-sm {\n  height: auto;\n}\n\n.input-lg {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\nselect.input-lg {\n  height: 46px;\n  line-height: 46px;\n}\n\ntextarea.input-lg {\n  height: auto;\n}\n\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline {\n  color: #8a6d3b;\n}\n\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #8a6d3b;\n}\n\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline {\n  color: #a94442;\n}\n\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-error .form-control:focus {\n  border-color: #843534;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n\n.has-error .input-group-addon {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #a94442;\n}\n\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline {\n  color: #3c763d;\n}\n\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-success .form-control:focus {\n  border-color: #2b542c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n\n.has-success .input-group-addon {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #3c763d;\n}\n\n.form-control-static {\n  margin-bottom: 0;\n}\n\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n  }\n  .form-inline select.form-control {\n    width: auto;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n\n.form-horizontal .control-label,\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n.form-horizontal .form-control-static {\n  padding-top: 7px;\n}\n\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n  }\n}\n\n.btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.428571429;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  cursor: pointer;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n       -o-user-select: none;\n          user-select: none;\n}\n\n.btn:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n.btn:hover,\n.btn:focus {\n  color: #333333;\n  text-decoration: none;\n}\n\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  pointer-events: none;\n  cursor: not-allowed;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-default {\n  color: #333333;\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n\n.btn-default:hover,\n.btn-default:focus,\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  color: #333333;\n  background-color: #ebebeb;\n  border-color: #adadad;\n}\n\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  background-image: none;\n}\n\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n\n.btn-default .badge {\n  color: #ffffff;\n  background-color: #fff;\n}\n\n.btn-primary {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  color: #ffffff;\n  background-color: #3276b1;\n  border-color: #285e8e;\n}\n\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n\n.btn-primary .badge {\n  color: #428bca;\n  background-color: #fff;\n}\n\n.btn-warning {\n  color: #ffffff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  color: #ffffff;\n  background-color: #ed9c28;\n  border-color: #d58512;\n}\n\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n\n.btn-warning .badge {\n  color: #f0ad4e;\n  background-color: #fff;\n}\n\n.btn-danger {\n  color: #ffffff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  color: #ffffff;\n  background-color: #d2322d;\n  border-color: #ac2925;\n}\n\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n\n.btn-danger .badge {\n  color: #d9534f;\n  background-color: #fff;\n}\n\n.btn-success {\n  color: #ffffff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n\n.btn-success:hover,\n.btn-success:focus,\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  color: #ffffff;\n  background-color: #47a447;\n  border-color: #398439;\n}\n\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  background-image: none;\n}\n\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n\n.btn-success .badge {\n  color: #5cb85c;\n  background-color: #fff;\n}\n\n.btn-info {\n  color: #ffffff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n\n.btn-info:hover,\n.btn-info:focus,\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  color: #ffffff;\n  background-color: #39b3d7;\n  border-color: #269abc;\n}\n\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  background-image: none;\n}\n\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n\n.btn-info .badge {\n  color: #5bc0de;\n  background-color: #fff;\n}\n\n.btn-link {\n  font-weight: normal;\n  color: #428bca;\n  cursor: pointer;\n  border-radius: 0;\n}\n\n.btn-link,\n.btn-link:active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n\n.btn-link:hover,\n.btn-link:focus {\n  color: #2a6496;\n  text-decoration: underline;\n  background-color: transparent;\n}\n\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #999999;\n  text-decoration: none;\n}\n\n.btn-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\n.btn-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-xs {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n          transition: opacity 0.15s linear;\n}\n\n.fade.in {\n  opacity: 1;\n}\n\n.collapse {\n  display: none;\n}\n\n.collapse.in {\n  display: block;\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height 0.35s ease;\n          transition: height 0.35s ease;\n}\n\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg');\n}\n\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  -webkit-font-smoothing: antialiased;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n.glyphicon:empty {\n  width: 1em;\n}\n\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n\n.glyphicon-euro:before {\n  content: \"\\20ac\";\n}\n\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px solid;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n}\n\n.dropdown {\n  position: relative;\n}\n\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  font-size: 14px;\n  list-style: none;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n          box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box;\n}\n\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.428571429;\n  color: #333333;\n  white-space: nowrap;\n}\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #262626;\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #428bca;\n  outline: 0;\n}\n\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #999999;\n}\n\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.open > .dropdown-menu {\n  display: block;\n}\n\n.open > a {\n  outline: 0;\n}\n\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.428571429;\n  color: #999999;\n}\n\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 990;\n}\n\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0;\n  border-bottom: 4px solid;\n  content: \"\";\n}\n\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto;\n  }\n}\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus {\n  outline: none;\n}\n\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar .btn-group {\n  float: left;\n}\n\n.btn-toolbar > .btn + .btn,\n.btn-toolbar > .btn-group + .btn,\n.btn-toolbar > .btn + .btn-group,\n.btn-toolbar > .btn-group + .btn-group {\n  margin-left: 5px;\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group > .btn-group {\n  float: left;\n}\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn-group:last-child > .btn:first-child {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n.btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn .caret {\n  margin-left: 0;\n}\n\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-right-radius: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:first-child > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:last-child > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  border-collapse: separate;\n  table-layout: fixed;\n}\n\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  display: table-cell;\n  float: none;\n  width: 1%;\n}\n\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  display: none;\n}\n\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n\n.input-group[class*=\"col-\"] {\n  float: none;\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.input-group .form-control {\n  width: 100%;\n  margin-bottom: 0;\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  line-height: 46px;\n}\n\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\n\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #555555;\n  text-align: center;\n  background-color: #eeeeee;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\n\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group-addon:first-child {\n  border-right: 0;\n}\n\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n.input-group-btn {\n  position: relative;\n  white-space: nowrap;\n}\n\n.input-group-btn:first-child > .btn {\n  margin-right: -1px;\n}\n\n.input-group-btn:last-child > .btn {\n  margin-left: -1px;\n}\n\n.input-group-btn > .btn {\n  position: relative;\n}\n\n.input-group-btn > .btn + .btn {\n  margin-left: -4px;\n}\n\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n\n.nav {\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav > li {\n  position: relative;\n  display: block;\n}\n\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.nav > li.disabled > a {\n  color: #999999;\n}\n\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #999999;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #428bca;\n}\n\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.nav > li > a > img {\n  max-width: none;\n}\n\n.nav-tabs {\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.428571429;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n\n.nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #dddddd;\n}\n\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555555;\n  cursor: default;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-bottom-color: transparent;\n}\n\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n\n.nav-tabs.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-tabs.nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n  border: 1px solid #dddddd;\n}\n\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #dddddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs.nav-justified > .active > a,\n  .nav-tabs.nav-justified > .active > a:hover,\n  .nav-tabs.nav-justified > .active > a:focus {\n    border-bottom-color: #ffffff;\n  }\n}\n\n.nav-pills > li {\n  float: left;\n}\n\n.nav-pills > li > a {\n  border-radius: 4px;\n}\n\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #ffffff;\n  background-color: #428bca;\n}\n\n.nav-stacked > li {\n  float: none;\n}\n\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n\n.nav-justified {\n  width: 100%;\n}\n\n.nav-justified > li {\n  float: none;\n}\n\n.nav-justified > li > a {\n  margin-bottom: 5px;\n  text-align: center;\n}\n\n.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n  border: 1px solid #dddddd;\n}\n\n@media (min-width: 768px) {\n  .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #dddddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs-justified > .active > a,\n  .nav-tabs-justified > .active > a:hover,\n  .nav-tabs-justified > .active > a:focus {\n    border-bottom-color: #ffffff;\n  }\n}\n\n.tab-content > .tab-pane {\n  display: none;\n}\n\n.tab-content > .active {\n  display: block;\n}\n\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n\n.navbar-collapse {\n  max-height: 340px;\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n  -webkit-overflow-scrolling: touch;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-static-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n.container > .navbar-header,\n.container > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n\n.navbar-brand {\n  float: left;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n}\n\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand {\n    margin-left: -15px;\n  }\n}\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n  .navbar-nav.navbar-right:last-child {\n    margin-right: -15px;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n  }\n}\n\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n  }\n  .navbar-form select.form-control {\n    width: auto;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n  .navbar-form.navbar-right:last-child {\n    margin-right: -15px;\n  }\n}\n\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.navbar-nav.pull-right > li > .dropdown-menu,\n.navbar-nav > li > .dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n\n.navbar-btn.btn-sm {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n\n.navbar-btn.btn-xs {\n  margin-top: 14px;\n  margin-bottom: 14px;\n}\n\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n\n@media (min-width: 768px) {\n  .navbar-text {\n    float: left;\n    margin-right: 15px;\n    margin-left: 15px;\n  }\n  .navbar-text.navbar-right:last-child {\n    margin-right: 0;\n  }\n}\n\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n\n.navbar-default .navbar-brand {\n  color: #777777;\n}\n\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-text {\n  color: #777777;\n}\n\n.navbar-default .navbar-nav > li > a {\n  color: #777777;\n}\n\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333333;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #555555;\n  background-color: #e7e7e7;\n}\n\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #cccccc;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-toggle {\n  border-color: #dddddd;\n}\n\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #dddddd;\n}\n\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #cccccc;\n}\n\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e7e7e7;\n}\n\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  color: #555555;\n  background-color: #e7e7e7;\n}\n\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777777;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #333333;\n    background-color: transparent;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #555555;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #cccccc;\n    background-color: transparent;\n  }\n}\n\n.navbar-default .navbar-link {\n  color: #777777;\n}\n\n.navbar-default .navbar-link:hover {\n  color: #333333;\n}\n\n.navbar-inverse {\n  background-color: #222222;\n  border-color: #080808;\n}\n\n.navbar-inverse .navbar-brand {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-text {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-nav > li > a {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #ffffff;\n  background-color: #080808;\n}\n\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444444;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-toggle {\n  border-color: #333333;\n}\n\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333333;\n}\n\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #ffffff;\n}\n\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  color: #ffffff;\n  background-color: #080808;\n}\n\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #999999;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #ffffff;\n    background-color: transparent;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #ffffff;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444444;\n    background-color: transparent;\n  }\n}\n\n.navbar-inverse .navbar-link {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-link:hover {\n  color: #ffffff;\n}\n\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n\n.breadcrumb > li {\n  display: inline-block;\n}\n\n.breadcrumb > li + li:before {\n  padding: 0 5px;\n  color: #cccccc;\n  content: \"/\\00a0\";\n}\n\n.breadcrumb > .active {\n  color: #999999;\n}\n\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n\n.pagination > li {\n  display: inline;\n}\n\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  margin-left: -1px;\n  line-height: 1.428571429;\n  text-decoration: none;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\n\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 4px;\n}\n\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  background-color: #eeeeee;\n}\n\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 2;\n  color: #ffffff;\n  cursor: default;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\n  border-color: #dddddd;\n}\n\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\n\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-bottom-left-radius: 6px;\n  border-top-left-radius: 6px;\n}\n\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-top-right-radius: 6px;\n  border-bottom-right-radius: 6px;\n}\n\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\n\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-bottom-left-radius: 3px;\n  border-top-left-radius: 3px;\n}\n\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager li {\n  display: inline;\n}\n\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 15px;\n}\n\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\n}\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\n\n.label[href]:hover,\n.label[href]:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.label:empty {\n  display: none;\n}\n\n.btn .label {\n  position: relative;\n  top: -1px;\n}\n\n.label-default {\n  background-color: #999999;\n}\n\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #808080;\n}\n\n.label-primary {\n  background-color: #428bca;\n}\n\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #3071a9;\n}\n\n.label-success {\n  background-color: #5cb85c;\n}\n\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n\n.label-info {\n  background-color: #5bc0de;\n}\n\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n\n.label-warning {\n  background-color: #f0ad4e;\n}\n\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n\n.label-danger {\n  background-color: #d9534f;\n}\n\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  background-color: #999999;\n  border-radius: 10px;\n}\n\n.badge:empty {\n  display: none;\n}\n\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\na.badge:hover,\na.badge:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #428bca;\n  background-color: #ffffff;\n}\n\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n\n.jumbotron {\n  padding: 30px;\n  margin-bottom: 30px;\n  font-size: 21px;\n  font-weight: 200;\n  line-height: 2.1428571435;\n  color: inherit;\n  background-color: #eeeeee;\n}\n\n.jumbotron h1,\n.jumbotron .h1 {\n  line-height: 1;\n  color: inherit;\n}\n\n.jumbotron p {\n  line-height: 1.4;\n}\n\n.container .jumbotron {\n  border-radius: 6px;\n}\n\n.jumbotron .container {\n  max-width: 100%;\n}\n\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .jumbotron {\n    padding-right: 60px;\n    padding-left: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 63px;\n  }\n}\n\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\n.thumbnail > img,\n.thumbnail a > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n  margin-right: auto;\n  margin-left: auto;\n}\n\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #428bca;\n}\n\n.thumbnail .caption {\n  padding: 9px;\n  color: #333333;\n}\n\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n\n.alert .alert-link {\n  font-weight: bold;\n}\n\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n\n.alert > p + p {\n  margin-top: 5px;\n}\n\n.alert-dismissable {\n  padding-right: 35px;\n}\n\n.alert-dismissable .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n\n.alert-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n\n.alert-success .alert-link {\n  color: #2b542c;\n}\n\n.alert-info {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n\n.alert-info .alert-link {\n  color: #245269;\n}\n\n.alert-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n\n.alert-warning .alert-link {\n  color: #66512c;\n}\n\n.alert-danger {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n\n.alert-danger .alert-link {\n  color: #843534;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n.progress-bar {\n  float: left;\n  width: 0;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #ffffff;\n  text-align: center;\n  background-color: #428bca;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-transition: width 0.6s ease;\n          transition: width 0.6s ease;\n}\n\n.progress-striped .progress-bar {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 40px 40px;\n}\n\n.progress.active .progress-bar {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n          animation: progress-bar-stripes 2s linear infinite;\n}\n\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n\n.progress-striped .progress-bar-success {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n\n.progress-striped .progress-bar-info {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n\n.media,\n.media .media {\n  margin-top: 15px;\n}\n\n.media:first-child {\n  margin-top: 0;\n}\n\n.media-object {\n  display: block;\n}\n\n.media-heading {\n  margin: 0 0 5px;\n}\n\n.media > .pull-left {\n  margin-right: 10px;\n}\n\n.media > .pull-right {\n  margin-left: 10px;\n}\n\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\n}\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\n\n.list-group-item:first-child {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n}\n\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n.list-group-item > .badge {\n  float: right;\n}\n\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n\na.list-group-item {\n  color: #555555;\n}\n\na.list-group-item .list-group-item-heading {\n  color: #333333;\n}\n\na.list-group-item:hover,\na.list-group-item:focus {\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n\na.list-group-item.active,\na.list-group-item.active:hover,\na.list-group-item.active:focus {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\na.list-group-item.active .list-group-item-heading,\na.list-group-item.active:hover .list-group-item-heading,\na.list-group-item.active:focus .list-group-item-heading {\n  color: inherit;\n}\n\na.list-group-item.active .list-group-item-text,\na.list-group-item.active:hover .list-group-item-text,\na.list-group-item.active:focus .list-group-item-text {\n  color: #e1edf7;\n}\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n\n.panel {\n  margin-bottom: 20px;\n  background-color: #ffffff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.panel-body {\n  padding: 15px;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel > .list-group {\n  margin-bottom: 0;\n}\n\n.panel > .list-group .list-group-item {\n  border-width: 1px 0;\n}\n\n.panel > .list-group .list-group-item:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.panel > .list-group .list-group-item:last-child {\n  border-bottom: 0;\n}\n\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n\n.panel > .table,\n.panel > .table-responsive > .table {\n  margin-bottom: 0;\n}\n\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive {\n  border-top: 1px solid #dddddd;\n}\n\n.panel > .table > tbody:first-child th,\n.panel > .table > tbody:first-child td {\n  border-top: 0;\n}\n\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\n\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n  border-left: 0;\n}\n\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n  border-right: 0;\n}\n\n.panel > .table-bordered > thead > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:last-child > th,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-bordered > thead > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n  border-bottom: 0;\n}\n\n.panel > .table-responsive {\n  margin-bottom: 0;\n  border: 0;\n}\n\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit;\n}\n\n.panel-title > a {\n  color: inherit;\n}\n\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #dddddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n\n.panel-group .panel {\n  margin-bottom: 0;\n  overflow: hidden;\n  border-radius: 4px;\n}\n\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n\n.panel-group .panel-heading + .panel-collapse .panel-body {\n  border-top: 1px solid #dddddd;\n}\n\n.panel-group .panel-footer {\n  border-top: 0;\n}\n\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #dddddd;\n}\n\n.panel-default {\n  border-color: #dddddd;\n}\n\n.panel-default > .panel-heading {\n  color: #333333;\n  background-color: #f5f5f5;\n  border-color: #dddddd;\n}\n\n.panel-default > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #dddddd;\n}\n\n.panel-default > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #dddddd;\n}\n\n.panel-primary {\n  border-color: #428bca;\n}\n\n.panel-primary > .panel-heading {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.panel-primary > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #428bca;\n}\n\n.panel-primary > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #428bca;\n}\n\n.panel-success {\n  border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #d6e9c6;\n}\n\n.panel-success > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n\n.panel-warning {\n  border-color: #faebcc;\n}\n\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n\n.panel-warning > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #faebcc;\n}\n\n.panel-warning > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #faebcc;\n}\n\n.panel-danger {\n  border-color: #ebccd1;\n}\n\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n\n.panel-danger > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #ebccd1;\n}\n\n.panel-danger > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #ebccd1;\n}\n\n.panel-info {\n  border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #bce8f1;\n}\n\n.panel-info > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #bce8f1;\n}\n\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000000;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.2;\n  filter: alpha(opacity=20);\n}\n\n.close:hover,\n.close:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n\n.modal-open {\n  overflow: hidden;\n}\n\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  display: none;\n  overflow: auto;\n  overflow-y: scroll;\n}\n\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, -25%);\n      -ms-transform: translate(0, -25%);\n          transform: translate(0, -25%);\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n     -moz-transition: -moz-transform 0.3s ease-out;\n       -o-transition: -o-transform 0.3s ease-out;\n          transition: transform 0.3s ease-out;\n}\n\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n      -ms-transform: translate(0, 0);\n          transform: translate(0, 0);\n}\n\n.modal-dialog {\n  position: relative;\n  z-index: 1050;\n  width: auto;\n  margin: 10px;\n}\n\n.modal-content {\n  position: relative;\n  background-color: #ffffff;\n  border: 1px solid #999999;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  outline: none;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n          box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  background-clip: padding-box;\n}\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n  background-color: #000000;\n}\n\n.modal-backdrop.fade {\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n\n.modal-backdrop.in {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.modal-header {\n  min-height: 16.428571429px;\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n\n.modal-header .close {\n  margin-top: -2px;\n}\n\n.modal-title {\n  margin: 0;\n  line-height: 1.428571429;\n}\n\n.modal-body {\n  position: relative;\n  padding: 20px;\n}\n\n.modal-footer {\n  padding: 19px 20px 20px;\n  margin-top: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\n}\n\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n\n@media screen and (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n  }\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1030;\n  display: block;\n  font-size: 12px;\n  line-height: 1.4;\n  opacity: 0;\n  filter: alpha(opacity=0);\n  visibility: visible;\n}\n\n.tooltip.in {\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\n}\n\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #ffffff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000000;\n  border-radius: 4px;\n}\n\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.top-right .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-right-color: #000000;\n  border-width: 5px 5px 5px 0;\n}\n\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-left-color: #000000;\n  border-width: 5px 0 5px 5px;\n}\n\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1010;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  text-align: left;\n  white-space: normal;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  background-clip: padding-box;\n}\n\n.popover.top {\n  margin-top: -10px;\n}\n\n.popover.right {\n  margin-left: 10px;\n}\n\n.popover.bottom {\n  margin-top: 10px;\n}\n\n.popover.left {\n  margin-left: -10px;\n}\n\n.popover-title {\n  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\n\n.popover .arrow,\n.popover .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.popover .arrow {\n  border-width: 11px;\n}\n\n.popover .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n\n.popover.top .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  border-bottom-width: 0;\n}\n\n.popover.top .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  border-top-color: #ffffff;\n  border-bottom-width: 0;\n  content: \" \";\n}\n\n.popover.right .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n  border-left-width: 0;\n}\n\n.popover.right .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  border-right-color: #ffffff;\n  border-left-width: 0;\n  content: \" \";\n}\n\n.popover.bottom .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  border-top-width: 0;\n}\n\n.popover.bottom .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  border-bottom-color: #ffffff;\n  border-top-width: 0;\n  content: \" \";\n}\n\n.popover.left .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n  border-right-width: 0;\n}\n\n.popover.left .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  border-left-color: #ffffff;\n  border-right-width: 0;\n  content: \" \";\n}\n\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: 0.6s ease-in-out left;\n          transition: 0.6s ease-in-out left;\n}\n\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n  line-height: 1;\n}\n\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n\n.carousel-inner > .active {\n  left: 0;\n}\n\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n\n.carousel-inner > .next {\n  left: 100%;\n}\n\n.carousel-inner > .prev {\n  left: -100%;\n}\n\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n\n.carousel-inner > .active.left {\n  left: -100%;\n}\n\n.carousel-inner > .active.right {\n  left: 100%;\n}\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%));\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n\n.carousel-control.right {\n  right: 0;\n  left: auto;\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%));\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #ffffff;\n  text-decoration: none;\n  outline: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n}\n\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n}\n\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  margin-left: -10px;\n  font-family: serif;\n}\n\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n  border: 1px solid #ffffff;\n  border-radius: 10px;\n}\n\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #ffffff;\n}\n\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n\n.carousel-caption .btn {\n  text-shadow: none;\n}\n\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicons-chevron-left,\n  .carousel-control .glyphicons-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    margin-left: -15px;\n    font-size: 30px;\n  }\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \" \";\n}\n\n.clearfix:after {\n  clear: both;\n}\n\n.center-block {\n  display: block;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.pull-right {\n  float: right !important;\n}\n\n.pull-left {\n  float: left !important;\n}\n\n.hide {\n  display: none !important;\n}\n\n.show {\n  display: block !important;\n}\n\n.invisible {\n  visibility: hidden;\n}\n\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n\n.affix {\n  position: fixed;\n}\n\n@-ms-viewport {\n  width: device-width;\n}\n\n.visible-xs,\ntr.visible-xs,\nth.visible-xs,\ntd.visible-xs {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  table.visible-xs {\n    display: table;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-xs.visible-sm {\n    display: block !important;\n  }\n  table.visible-xs.visible-sm {\n    display: table;\n  }\n  tr.visible-xs.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-sm,\n  td.visible-xs.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-xs.visible-md {\n    display: block !important;\n  }\n  table.visible-xs.visible-md {\n    display: table;\n  }\n  tr.visible-xs.visible-md {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-md,\n  td.visible-xs.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-xs.visible-lg {\n    display: block !important;\n  }\n  table.visible-xs.visible-lg {\n    display: table;\n  }\n  tr.visible-xs.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-lg,\n  td.visible-xs.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-sm,\ntr.visible-sm,\nth.visible-sm,\ntd.visible-sm {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-sm.visible-xs {\n    display: block !important;\n  }\n  table.visible-sm.visible-xs {\n    display: table;\n  }\n  tr.visible-sm.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-xs,\n  td.visible-sm.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  table.visible-sm {\n    display: table;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-sm.visible-md {\n    display: block !important;\n  }\n  table.visible-sm.visible-md {\n    display: table;\n  }\n  tr.visible-sm.visible-md {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-md,\n  td.visible-sm.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-sm.visible-lg {\n    display: block !important;\n  }\n  table.visible-sm.visible-lg {\n    display: table;\n  }\n  tr.visible-sm.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-lg,\n  td.visible-sm.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-md,\ntr.visible-md,\nth.visible-md,\ntd.visible-md {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-md.visible-xs {\n    display: block !important;\n  }\n  table.visible-md.visible-xs {\n    display: table;\n  }\n  tr.visible-md.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-md.visible-xs,\n  td.visible-md.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-md.visible-sm {\n    display: block !important;\n  }\n  table.visible-md.visible-sm {\n    display: table;\n  }\n  tr.visible-md.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-md.visible-sm,\n  td.visible-md.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  table.visible-md {\n    display: table;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-md.visible-lg {\n    display: block !important;\n  }\n  table.visible-md.visible-lg {\n    display: table;\n  }\n  tr.visible-md.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-md.visible-lg,\n  td.visible-md.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-lg,\ntr.visible-lg,\nth.visible-lg,\ntd.visible-lg {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-lg.visible-xs {\n    display: block !important;\n  }\n  table.visible-lg.visible-xs {\n    display: table;\n  }\n  tr.visible-lg.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-xs,\n  td.visible-lg.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-lg.visible-sm {\n    display: block !important;\n  }\n  table.visible-lg.visible-sm {\n    display: table;\n  }\n  tr.visible-lg.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-sm,\n  td.visible-lg.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-lg.visible-md {\n    display: block !important;\n  }\n  table.visible-lg.visible-md {\n    display: table;\n  }\n  tr.visible-lg.visible-md {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-md,\n  td.visible-lg.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  table.visible-lg {\n    display: table;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.hidden-xs {\n  display: block !important;\n}\n\ntable.hidden-xs {\n  display: table;\n}\n\ntr.hidden-xs {\n  display: table-row !important;\n}\n\nth.hidden-xs,\ntd.hidden-xs {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-xs,\n  tr.hidden-xs,\n  th.hidden-xs,\n  td.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-xs.hidden-sm,\n  tr.hidden-xs.hidden-sm,\n  th.hidden-xs.hidden-sm,\n  td.hidden-xs.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-xs.hidden-md,\n  tr.hidden-xs.hidden-md,\n  th.hidden-xs.hidden-md,\n  td.hidden-xs.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-xs.hidden-lg,\n  tr.hidden-xs.hidden-lg,\n  th.hidden-xs.hidden-lg,\n  td.hidden-xs.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-sm {\n  display: block !important;\n}\n\ntable.hidden-sm {\n  display: table;\n}\n\ntr.hidden-sm {\n  display: table-row !important;\n}\n\nth.hidden-sm,\ntd.hidden-sm {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-sm.hidden-xs,\n  tr.hidden-sm.hidden-xs,\n  th.hidden-sm.hidden-xs,\n  td.hidden-sm.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm,\n  tr.hidden-sm,\n  th.hidden-sm,\n  td.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-sm.hidden-md,\n  tr.hidden-sm.hidden-md,\n  th.hidden-sm.hidden-md,\n  td.hidden-sm.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-sm.hidden-lg,\n  tr.hidden-sm.hidden-lg,\n  th.hidden-sm.hidden-lg,\n  td.hidden-sm.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-md {\n  display: block !important;\n}\n\ntable.hidden-md {\n  display: table;\n}\n\ntr.hidden-md {\n  display: table-row !important;\n}\n\nth.hidden-md,\ntd.hidden-md {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-md.hidden-xs,\n  tr.hidden-md.hidden-xs,\n  th.hidden-md.hidden-xs,\n  td.hidden-md.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-md.hidden-sm,\n  tr.hidden-md.hidden-sm,\n  th.hidden-md.hidden-sm,\n  td.hidden-md.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md,\n  tr.hidden-md,\n  th.hidden-md,\n  td.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-md.hidden-lg,\n  tr.hidden-md.hidden-lg,\n  th.hidden-md.hidden-lg,\n  td.hidden-md.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-lg {\n  display: block !important;\n}\n\ntable.hidden-lg {\n  display: table;\n}\n\ntr.hidden-lg {\n  display: table-row !important;\n}\n\nth.hidden-lg,\ntd.hidden-lg {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-lg.hidden-xs,\n  tr.hidden-lg.hidden-xs,\n  th.hidden-lg.hidden-xs,\n  td.hidden-lg.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-lg.hidden-sm,\n  tr.hidden-lg.hidden-sm,\n  th.hidden-lg.hidden-sm,\n  td.hidden-lg.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-lg.hidden-md,\n  tr.hidden-lg.hidden-md,\n  th.hidden-lg.hidden-md,\n  td.hidden-lg.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-lg,\n  tr.hidden-lg,\n  th.hidden-lg,\n  td.hidden-lg {\n    display: none !important;\n  }\n}\n\n.visible-print,\ntr.visible-print,\nth.visible-print,\ntd.visible-print {\n  display: none !important;\n}\n\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  table.visible-print {\n    display: table;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n  .hidden-print,\n  tr.hidden-print,\n  th.hidden-print,\n  td.hidden-print {\n    display: none !important;\n  }\n}"
  },
  {
    "path": "bower_components/bootstrap/dist/js/bootstrap.js",
    "content": "/*!\n * Bootstrap v3.0.3 (http://getbootstrap.com)\n * Copyright 2013 Twitter, Inc.\n * Licensed under http://www.apache.org/licenses/LICENSE-2.0\n */\n\nif (typeof jQuery === \"undefined\") { throw new Error(\"Bootstrap requires jQuery\") }\n\n/* ========================================================================\n * Bootstrap: transition.js v3.0.3\n * http://getbootstrap.com/javascript/#transitions\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)\n  // ============================================================\n\n  function transitionEnd() {\n    var el = document.createElement('bootstrap')\n\n    var transEndEventNames = {\n      'WebkitTransition' : 'webkitTransitionEnd'\n    , 'MozTransition'    : 'transitionend'\n    , 'OTransition'      : 'oTransitionEnd otransitionend'\n    , 'transition'       : 'transitionend'\n    }\n\n    for (var name in transEndEventNames) {\n      if (el.style[name] !== undefined) {\n        return { end: transEndEventNames[name] }\n      }\n    }\n  }\n\n  // http://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = \\1 => {\n    var called = false, $el = this\n    $(this).one($.support.transition.end, function () { called = true })\n    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n    setTimeout(callback, duration)\n    return this\n  }\n\n  $(function () {\n    $.support.transition = transitionEnd()\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: alert.js v3.0.3\n * http://getbootstrap.com/javascript/#alerts\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // ALERT CLASS DEFINITION\n  // ======================\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n  var Alert   = function (el) {\n    $(el).on('click', dismiss, this.close)\n  }\n\n  Alert.prototype.close = function (e) {\n    var $this    = $(this)\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = $(selector)\n\n    if (e) e.preventDefault()\n\n    if (!$parent.length) {\n      $parent = $this.hasClass('alert') ? $this : $this.parent()\n    }\n\n    $parent.trigger(e = $.Event('close.bs.alert'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      $parent.trigger('closed.bs.alert').remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent\n        .one($.support.transition.end, removeElement)\n        .emulateTransitionEnd(150) :\n      removeElement()\n  }\n\n\n  // ALERT PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.alert\n\n  $.fn.alert = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.alert')\n\n      if (!data) $this.data('bs.alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.alert.Constructor = Alert\n\n\n  // ALERT NO CONFLICT\n  // =================\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n\n  // ALERT DATA-API\n  // ==============\n\n  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: button.js v3.0.3\n * http://getbootstrap.com/javascript/#buttons\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // BUTTON PUBLIC CLASS DEFINITION\n  // ==============================\n\n  var Button = function (element, options) {\n    this.$element = $(element)\n    this.options  = $.extend({}, Button.DEFAULTS, options)\n  }\n\n  Button.DEFAULTS = {\n    loadingText: 'loading...'\n  }\n\n  Button.prototype.setState = function (state) {\n    var d    = 'disabled'\n    var $el  = this.$element\n    var val  = $el.is('input') ? 'val' : 'html'\n    var data = $el.data()\n\n    state = state + 'Text'\n\n    if (!data.resetText) $el.data('resetText', $el[val]())\n\n    $el[val](data[state] || this.options[state])\n\n    // push to event loop to allow forms to submit\n    setTimeout(function () {\n      state == 'loadingText' ?\n        $el.addClass(d).attr(d, d) :\n        $el.removeClass(d).removeAttr(d);\n    }, 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n    var changed = true\n\n    if ($parent.length) {\n      var $input = this.$element.find('input')\n      if ($input.prop('type') === 'radio') {\n        // see if clicking on current one\n        if ($input.prop('checked') && this.$element.hasClass('active'))\n          changed = false\n        else\n          $parent.find('.active').removeClass('active')\n      }\n      if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')\n    }\n\n    if (changed) this.$element.toggleClass('active')\n  }\n\n\n  // BUTTON PLUGIN DEFINITION\n  // ========================\n\n  var old = $.fn.button\n\n  $.fn.button = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.button')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.button', (data = new Button(this, options)))\n\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  $.fn.button.Constructor = Button\n\n\n  // BUTTON NO CONFLICT\n  // ==================\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n\n  // BUTTON DATA-API\n  // ===============\n\n  $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {\n    var $btn = $(e.target)\n    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n    $btn.button('toggle')\n    e.preventDefault()\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: carousel.js v3.0.3\n * http://getbootstrap.com/javascript/#carousel\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // CAROUSEL CLASS DEFINITION\n  // =========================\n\n  var Carousel = function (element, options) {\n    this.$element    = $(element)\n    this.$indicators = this.$element.find('.carousel-indicators')\n    this.options     = options\n    this.paused      =\n    this.sliding     =\n    this.interval    =\n    this.$active     =\n    this.$items      = null\n\n    this.options.pause == 'hover' && this.$element\n      .on('mouseenter', $.proxy(this.pause, this))\n      .on('mouseleave', $.proxy(this.cycle, this))\n  }\n\n  Carousel.DEFAULTS = {\n    interval: 5000\n  , pause: 'hover'\n  , wrap: true\n  }\n\n  Carousel.prototype.cycle =  function (e) {\n    e || (this.paused = false)\n\n    this.interval && clearInterval(this.interval)\n\n    this.options.interval\n      && !this.paused\n      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n\n    return this\n  }\n\n  Carousel.prototype.getActiveIndex = function () {\n    this.$active = this.$element.find('.item.active')\n    this.$items  = this.$active.parent().children()\n\n    return this.$items.index(this.$active)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getActiveIndex()\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) })\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))\n  }\n\n  Carousel.prototype.pause = function (e) {\n    e || (this.paused = true)\n\n    if (this.$element.find('.next, .prev').length && $.support.transition.end) {\n      this.$element.trigger($.support.transition.end)\n      this.cycle(true)\n    }\n\n    this.interval = clearInterval(this.interval)\n\n    return this\n  }\n\n  Carousel.prototype.next = function () {\n    if (this.sliding) return\n    return this.slide('next')\n  }\n\n  Carousel.prototype.prev = function () {\n    if (this.sliding) return\n    return this.slide('prev')\n  }\n\n  Carousel.prototype.slide = function (type, next) {\n    var $active   = this.$element.find('.item.active')\n    var $next     = next || $active[type]()\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var fallback  = type == 'next' ? 'first' : 'last'\n    var that      = this\n\n    if (!$next.length) {\n      if (!this.options.wrap) return\n      $next = this.$element.find('.item')[fallback]()\n    }\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })\n\n    if ($next.hasClass('active')) return\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      this.$element.one('slid.bs.carousel', function () {\n        var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])\n        $nextIndicator && $nextIndicator.addClass('active')\n      })\n    }\n\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      this.$element.trigger(e)\n      if (e.isDefaultPrevented()) return\n      $next.addClass(type)\n      $next[0].offsetWidth // force reflow\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one($.support.transition.end, function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0)\n        })\n        .emulateTransitionEnd(600)\n    } else {\n      this.$element.trigger(e)\n      if (e.isDefaultPrevented()) return\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger('slid.bs.carousel')\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.carousel\n\n  $.fn.carousel = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.carousel')\n      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)\n      var action  = typeof option == 'string' ? option : options.slide\n\n      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.pause().cycle()\n    })\n  }\n\n  $.fn.carousel.Constructor = Carousel\n\n\n  // CAROUSEL NO CONFLICT\n  // ====================\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n\n  // CAROUSEL DATA-API\n  // =================\n\n  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {\n    var $this   = $(this), href\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    $target.carousel(options)\n\n    if (slideIndex = $this.attr('data-slide-to')) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  })\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      $carousel.carousel($carousel.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: collapse.js v3.0.3\n * http://getbootstrap.com/javascript/#collapse\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // COLLAPSE PUBLIC CLASS DEFINITION\n  // ================================\n\n  var Collapse = function (element, options) {\n    this.$element      = $(element)\n    this.options       = $.extend({}, Collapse.DEFAULTS, options)\n    this.transitioning = null\n\n    if (this.options.parent) this.$parent = $(this.options.parent)\n    if (this.options.toggle) this.toggle()\n  }\n\n  Collapse.DEFAULTS = {\n    toggle: true\n  }\n\n  Collapse.prototype.dimension = function () {\n    var hasWidth = this.$element.hasClass('width')\n    return hasWidth ? 'width' : 'height'\n  }\n\n  Collapse.prototype.show = function () {\n    if (this.transitioning || this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('show.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var actives = this.$parent && this.$parent.find('> .panel > .in')\n\n    if (actives && actives.length) {\n      var hasData = actives.data('bs.collapse')\n      if (hasData && hasData.transitioning) return\n      actives.collapse('hide')\n      hasData || actives.data('bs.collapse', null)\n    }\n\n    var dimension = this.dimension()\n\n    this.$element\n      .removeClass('collapse')\n      .addClass('collapsing')\n      [dimension](0)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.$element\n        .removeClass('collapsing')\n        .addClass('in')\n        [dimension]('auto')\n      this.transitioning = 0\n      this.$element.trigger('shown.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    var scrollSize = $.camelCase(['scroll', dimension].join('-'))\n\n    this.$element\n      .one($.support.transition.end, $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n      [dimension](this.$element[0][scrollSize])\n  }\n\n  Collapse.prototype.hide = function () {\n    if (this.transitioning || !this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('hide.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var dimension = this.dimension()\n\n    this.$element\n      [dimension](this.$element[dimension]())\n      [0].offsetHeight\n\n    this.$element\n      .addClass('collapsing')\n      .removeClass('collapse')\n      .removeClass('in')\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.transitioning = 0\n      this.$element\n        .trigger('hidden.bs.collapse')\n        .removeClass('collapsing')\n        .addClass('collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    this.$element\n      [dimension](0)\n      .one($.support.transition.end, $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n  }\n\n  Collapse.prototype.toggle = function () {\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\n  }\n\n\n  // COLLAPSE PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.collapse\n\n  $.fn.collapse = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.collapse')\n      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.collapse.Constructor = Collapse\n\n\n  // COLLAPSE NO CONFLICT\n  // ====================\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n\n  // COLLAPSE DATA-API\n  // =================\n\n  $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {\n    var $this   = $(this), href\n    var target  = $this.attr('data-target')\n        || e.preventDefault()\n        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') //strip for ie7\n    var $target = $(target)\n    var data    = $target.data('bs.collapse')\n    var option  = data ? 'toggle' : $this.data()\n    var parent  = $this.attr('data-parent')\n    var $parent = parent && $(parent)\n\n    if (!data || !data.transitioning) {\n      if ($parent) $parent.find('[data-toggle=collapse][data-parent=\"' + parent + '\"]').not($this).addClass('collapsed')\n      $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')\n    }\n\n    $target.collapse(option)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: dropdown.js v3.0.3\n * http://getbootstrap.com/javascript/#dropdowns\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // DROPDOWN CLASS DEFINITION\n  // =========================\n\n  var backdrop = '.dropdown-backdrop'\n  var toggle   = '[data-toggle=dropdown]'\n  var Dropdown = function (element) {\n    $(element).on('click.bs.dropdown', this.toggle)\n  }\n\n  Dropdown.prototype.toggle = function (e) {\n    var $this = $(this)\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    clearMenus()\n\n    if (!isActive) {\n      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n        // if mobile we use a backdrop because click events don't delegate\n        $('<div class=\"dropdown-backdrop\"/>').insertAfter($(this)).on('click', clearMenus)\n      }\n\n      $parent.trigger(e = $.Event('show.bs.dropdown'))\n\n      if (e.isDefaultPrevented()) return\n\n      $parent\n        .toggleClass('open')\n        .trigger('shown.bs.dropdown')\n\n      $this.focus()\n    }\n\n    return false\n  }\n\n  Dropdown.prototype.keydown = function (e) {\n    if (!/(38|40|27)/.test(e.keyCode)) return\n\n    var $this = $(this)\n\n    e.preventDefault()\n    e.stopPropagation()\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    if (!isActive || (isActive && e.keyCode == 27)) {\n      if (e.which == 27) $parent.find(toggle).focus()\n      return $this.click()\n    }\n\n    var $items = $('[role=menu] li:not(.divider):visible a', $parent)\n\n    if (!$items.length) return\n\n    var index = $items.index($items.filter(':focus'))\n\n    if (e.keyCode == 38 && index > 0)                 index--                        // up\n    if (e.keyCode == 40 && index < $items.length - 1) index++                        // down\n    if (!~index)                                      index=0\n\n    $items.eq(index).focus()\n  }\n\n  function clearMenus() {\n    $(backdrop).remove()\n    $(toggle).each(function (e) {\n      var $parent = getParent($(this))\n      if (!$parent.hasClass('open')) return\n      $parent.trigger(e = $.Event('hide.bs.dropdown'))\n      if (e.isDefaultPrevented()) return\n      $parent.removeClass('open').trigger('hidden.bs.dropdown')\n    })\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    var $parent = selector && $(selector)\n\n    return $parent && $parent.length ? $parent : $this.parent()\n  }\n\n\n  // DROPDOWN PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.dropdown')\n\n      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  // DROPDOWN NO CONFLICT\n  // ====================\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  // APPLY TO STANDARD DROPDOWN ELEMENTS\n  // ===================================\n\n  $(document)\n    .on('click.bs.dropdown.data-api', clearMenus)\n    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.bs.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)\n    .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: modal.js v3.0.3\n * http://getbootstrap.com/javascript/#modals\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // MODAL CLASS DEFINITION\n  // ======================\n\n  var Modal = function (element, options) {\n    this.options   = options\n    this.$element  = $(element)\n    this.$backdrop =\n    this.isShown   = null\n\n    if (this.options.remote) this.$element.load(this.options.remote)\n  }\n\n  Modal.DEFAULTS = {\n      backdrop: true\n    , keyboard: true\n    , show: true\n  }\n\n  Modal.prototype.toggle = function (_relatedTarget) {\n    return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)\n  }\n\n  Modal.prototype.show = function (_relatedTarget) {\n    var that = this\n    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\n\n    this.$element.trigger(e)\n\n    if (this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = true\n\n    this.escape()\n\n    this.$element.on('click.dismiss.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\n\n    this.backdrop(function () {\n      var transition = $.support.transition && that.$element.hasClass('fade')\n\n      if (!that.$element.parent().length) {\n        that.$element.appendTo(document.body) // don't move modals dom position\n      }\n\n      that.$element.show()\n\n      if (transition) {\n        that.$element[0].offsetWidth // force reflow\n      }\n\n      that.$element\n        .addClass('in')\n        .attr('aria-hidden', false)\n\n      that.enforceFocus()\n\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n      transition ?\n        that.$element.find('.modal-dialog') // wait for modal to slide in\n          .one($.support.transition.end, function () {\n            that.$element.focus().trigger(e)\n          })\n          .emulateTransitionEnd(300) :\n        that.$element.focus().trigger(e)\n    })\n  }\n\n  Modal.prototype.hide = function (e) {\n    if (e) e.preventDefault()\n\n    e = $.Event('hide.bs.modal')\n\n    this.$element.trigger(e)\n\n    if (!this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = false\n\n    this.escape()\n\n    $(document).off('focusin.bs.modal')\n\n    this.$element\n      .removeClass('in')\n      .attr('aria-hidden', true)\n      .off('click.dismiss.modal')\n\n    $.support.transition && this.$element.hasClass('fade') ?\n      this.$element\n        .one($.support.transition.end, $.proxy(this.hideModal, this))\n        .emulateTransitionEnd(300) :\n      this.hideModal()\n  }\n\n  Modal.prototype.enforceFocus = function () {\n    $(document)\n      .off('focusin.bs.modal') // guard against infinite focus loop\n      .on('focusin.bs.modal', $.proxy(function (e) {\n        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {\n          this.$element.focus()\n        }\n      }, this))\n  }\n\n  Modal.prototype.escape = function () {\n    if (this.isShown && this.options.keyboard) {\n      this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {\n        e.which == 27 && this.hide()\n      }, this))\n    } else if (!this.isShown) {\n      this.$element.off('keyup.dismiss.bs.modal')\n    }\n  }\n\n  Modal.prototype.hideModal = function () {\n    var that = this\n    this.$element.hide()\n    this.backdrop(function () {\n      that.removeBackdrop()\n      that.$element.trigger('hidden.bs.modal')\n    })\n  }\n\n  Modal.prototype.removeBackdrop = function () {\n    this.$backdrop && this.$backdrop.remove()\n    this.$backdrop = null\n  }\n\n  Modal.prototype.backdrop = function (callback) {\n    var that    = this\n    var animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n    if (this.isShown && this.options.backdrop) {\n      var doAnimate = $.support.transition && animate\n\n      this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n        .appendTo(document.body)\n\n      this.$element.on('click.dismiss.modal', $.proxy(function (e) {\n        if (e.target !== e.currentTarget) return\n        this.options.backdrop == 'static'\n          ? this.$element[0].focus.call(this.$element[0])\n          : this.hide.call(this)\n      }, this))\n\n      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n      this.$backdrop.addClass('in')\n\n      if (!callback) return\n\n      doAnimate ?\n        this.$backdrop\n          .one($.support.transition.end, callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      $.support.transition && this.$element.hasClass('fade')?\n        this.$backdrop\n          .one($.support.transition.end, callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n\n  // MODAL PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.modal\n\n  $.fn.modal = function (option, _relatedTarget) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.modal')\n      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option](_relatedTarget)\n      else if (options.show) data.show(_relatedTarget)\n    })\n  }\n\n  $.fn.modal.Constructor = Modal\n\n\n  // MODAL NO CONFLICT\n  // =================\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n  // MODAL DATA-API\n  // ==============\n\n  $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this   = $(this)\n    var href    = $this.attr('href')\n    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) //strip for ie7\n    var option  = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    e.preventDefault()\n\n    $target\n      .modal(option, this)\n      .one('hide', function () {\n        $this.is(':visible') && $this.focus()\n      })\n  })\n\n  $(document)\n    .on('show.bs.modal',  '.modal', function () { $(document.body).addClass('modal-open') })\n    .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tooltip.js v3.0.3\n * http://getbootstrap.com/javascript/#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // TOOLTIP PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Tooltip = function (element, options) {\n    this.type       =\n    this.options    =\n    this.enabled    =\n    this.timeout    =\n    this.hoverState =\n    this.$element   = null\n\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.DEFAULTS = {\n    animation: true\n  , placement: 'top'\n  , selector: false\n  , template: '<div class=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>'\n  , trigger: 'hover focus'\n  , title: ''\n  , delay: 0\n  , html: false\n  , container: false\n  }\n\n  Tooltip.prototype.init = function (type, element, options) {\n    this.enabled  = true\n    this.type     = type\n    this.$element = $(element)\n    this.options  = this.getOptions(options)\n\n    var triggers = this.options.trigger.split(' ')\n\n    for (var i = triggers.length; i--;) {\n      var trigger = triggers[i]\n\n      if (trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (trigger != 'manual') {\n        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focus'\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'\n\n        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n    }\n\n    this.options.selector ?\n      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n      this.fixTitle()\n  }\n\n  Tooltip.prototype.getDefaults = function () {\n    return Tooltip.DEFAULTS\n  }\n\n  Tooltip.prototype.getOptions = function (options) {\n    options = $.extend({}, this.getDefaults(), this.$element.data(), options)\n\n    if (options.delay && typeof options.delay == 'number') {\n      options.delay = {\n        show: options.delay\n      , hide: options.delay\n      }\n    }\n\n    return options\n  }\n\n  Tooltip.prototype.getDelegateOptions = function () {\n    var options  = {}\n    var defaults = this.getDefaults()\n\n    this._options && $.each(this._options, function (key, value) {\n      if (defaults[key] != value) options[key] = value\n    })\n\n    return options\n  }\n\n  Tooltip.prototype.enter = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'in'\n\n    if (!self.options.delay || !self.options.delay.show) return self.show()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'in') self.show()\n    }, self.options.delay.show)\n  }\n\n  Tooltip.prototype.leave = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'out'\n\n    if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'out') self.hide()\n    }, self.options.delay.hide)\n  }\n\n  Tooltip.prototype.show = function () {\n    var e = $.Event('show.bs.'+ this.type)\n\n    if (this.hasContent() && this.enabled) {\n      this.$element.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      var $tip = this.tip()\n\n      this.setContent()\n\n      if (this.options.animation) $tip.addClass('fade')\n\n      var placement = typeof this.options.placement == 'function' ?\n        this.options.placement.call(this, $tip[0], this.$element[0]) :\n        this.options.placement\n\n      var autoToken = /\\s?auto?\\s?/i\n      var autoPlace = autoToken.test(placement)\n      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'\n\n      $tip\n        .detach()\n        .css({ top: 0, left: 0, display: 'block' })\n        .addClass(placement)\n\n      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n\n      var pos          = this.getPosition()\n      var actualWidth  = $tip[0].offsetWidth\n      var actualHeight = $tip[0].offsetHeight\n\n      if (autoPlace) {\n        var $parent = this.$element.parent()\n\n        var orgPlacement = placement\n        var docScroll    = document.documentElement.scrollTop || document.body.scrollTop\n        var parentWidth  = this.options.container == 'body' ? window.innerWidth  : $parent.outerWidth()\n        var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()\n        var parentLeft   = this.options.container == 'body' ? 0 : $parent.offset().left\n\n        placement = placement == 'bottom' && pos.top   + pos.height  + actualHeight - docScroll > parentHeight  ? 'top'    :\n                    placement == 'top'    && pos.top   - docScroll   - actualHeight < 0                         ? 'bottom' :\n                    placement == 'right'  && pos.right + actualWidth > parentWidth                              ? 'left'   :\n                    placement == 'left'   && pos.left  - actualWidth < parentLeft                               ? 'right'  :\n                    placement\n\n        $tip\n          .removeClass(orgPlacement)\n          .addClass(placement)\n      }\n\n      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)\n\n      this.applyPlacement(calculatedOffset, placement)\n      this.$element.trigger('shown.bs.' + this.type)\n    }\n  }\n\n  Tooltip.prototype.applyPlacement = function(offset, placement) {\n    var replace\n    var $tip   = this.tip()\n    var width  = $tip[0].offsetWidth\n    var height = $tip[0].offsetHeight\n\n    // manually read margins because getBoundingClientRect includes difference\n    var marginTop = parseInt($tip.css('margin-top'), 10)\n    var marginLeft = parseInt($tip.css('margin-left'), 10)\n\n    // we must check for NaN for ie 8/9\n    if (isNaN(marginTop))  marginTop  = 0\n    if (isNaN(marginLeft)) marginLeft = 0\n\n    offset.top  = offset.top  + marginTop\n    offset.left = offset.left + marginLeft\n\n    $tip\n      .offset(offset)\n      .addClass('in')\n\n    // check to see if placing tip in new offset caused the tip to resize itself\n    var actualWidth  = $tip[0].offsetWidth\n    var actualHeight = $tip[0].offsetHeight\n\n    if (placement == 'top' && actualHeight != height) {\n      replace = true\n      offset.top = offset.top + height - actualHeight\n    }\n\n    if (/bottom|top/.test(placement)) {\n      var delta = 0\n\n      if (offset.left < 0) {\n        delta       = offset.left * -2\n        offset.left = 0\n\n        $tip.offset(offset)\n\n        actualWidth  = $tip[0].offsetWidth\n        actualHeight = $tip[0].offsetHeight\n      }\n\n      this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')\n    } else {\n      this.replaceArrow(actualHeight - height, actualHeight, 'top')\n    }\n\n    if (replace) $tip.offset(offset)\n  }\n\n  Tooltip.prototype.replaceArrow = function(delta, dimension, position) {\n    this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + \"%\") : '')\n  }\n\n  Tooltip.prototype.setContent = function () {\n    var $tip  = this.tip()\n    var title = this.getTitle()\n\n    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n    $tip.removeClass('fade in top bottom left right')\n  }\n\n  Tooltip.prototype.hide = function () {\n    var that = this\n    var $tip = this.tip()\n    var e    = $.Event('hide.bs.' + this.type)\n\n    function complete() {\n      if (that.hoverState != 'in') $tip.detach()\n    }\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    $tip.removeClass('in')\n\n    $.support.transition && this.$tip.hasClass('fade') ?\n      $tip\n        .one($.support.transition.end, complete)\n        .emulateTransitionEnd(150) :\n      complete()\n\n    this.$element.trigger('hidden.bs.' + this.type)\n\n    return this\n  }\n\n  Tooltip.prototype.fixTitle = function () {\n    var $e = this.$element\n    if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {\n      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n    }\n  }\n\n  Tooltip.prototype.hasContent = function () {\n    return this.getTitle()\n  }\n\n  Tooltip.prototype.getPosition = function () {\n    var el = this.$element[0]\n    return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {\n      width: el.offsetWidth\n    , height: el.offsetHeight\n    }, this.$element.offset())\n  }\n\n  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {\n    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :\n        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }\n  }\n\n  Tooltip.prototype.getTitle = function () {\n    var title\n    var $e = this.$element\n    var o  = this.options\n\n    title = $e.attr('data-original-title')\n      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n    return title\n  }\n\n  Tooltip.prototype.tip = function () {\n    return this.$tip = this.$tip || $(this.options.template)\n  }\n\n  Tooltip.prototype.arrow = function () {\n    return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')\n  }\n\n  Tooltip.prototype.validate = function () {\n    if (!this.$element[0].parentNode) {\n      this.hide()\n      this.$element = null\n      this.options  = null\n    }\n  }\n\n  Tooltip.prototype.enable = function () {\n    this.enabled = true\n  }\n\n  Tooltip.prototype.disable = function () {\n    this.enabled = false\n  }\n\n  Tooltip.prototype.toggleEnabled = function () {\n    this.enabled = !this.enabled\n  }\n\n  Tooltip.prototype.toggle = function (e) {\n    var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this\n    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n  }\n\n  Tooltip.prototype.destroy = function () {\n    this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)\n  }\n\n\n  // TOOLTIP PLUGIN DEFINITION\n  // =========================\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.tooltip')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tooltip.Constructor = Tooltip\n\n\n  // TOOLTIP NO CONFLICT\n  // ===================\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: popover.js v3.0.3\n * http://getbootstrap.com/javascript/#popovers\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // POPOVER PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')\n\n  Popover.DEFAULTS = $.extend({} , $.fn.tooltip.Constructor.DEFAULTS, {\n    placement: 'right'\n  , trigger: 'click'\n  , content: ''\n  , template: '<div class=\"popover\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'\n  })\n\n\n  // NOTE: POPOVER EXTENDS tooltip.js\n  // ================================\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)\n\n  Popover.prototype.constructor = Popover\n\n  Popover.prototype.getDefaults = function () {\n    return Popover.DEFAULTS\n  }\n\n  Popover.prototype.setContent = function () {\n    var $tip    = this.tip()\n    var title   = this.getTitle()\n    var content = this.getContent()\n\n    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n    $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)\n\n    $tip.removeClass('fade top bottom left right in')\n\n    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do\n    // this manually by checking the contents.\n    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()\n  }\n\n  Popover.prototype.hasContent = function () {\n    return this.getTitle() || this.getContent()\n  }\n\n  Popover.prototype.getContent = function () {\n    var $e = this.$element\n    var o  = this.options\n\n    return $e.attr('data-content')\n      || (typeof o.content == 'function' ?\n            o.content.call($e[0]) :\n            o.content)\n  }\n\n  Popover.prototype.arrow = function () {\n    return this.$arrow = this.$arrow || this.tip().find('.arrow')\n  }\n\n  Popover.prototype.tip = function () {\n    if (!this.$tip) this.$tip = $(this.options.template)\n    return this.$tip\n  }\n\n\n  // POPOVER PLUGIN DEFINITION\n  // =========================\n\n  var old = $.fn.popover\n\n  $.fn.popover = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.popover')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.popover.Constructor = Popover\n\n\n  // POPOVER NO CONFLICT\n  // ===================\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: scrollspy.js v3.0.3\n * http://getbootstrap.com/javascript/#scrollspy\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // SCROLLSPY CLASS DEFINITION\n  // ==========================\n\n  function ScrollSpy(element, options) {\n    var href\n    var process  = $.proxy(this.process, this)\n\n    this.$element       = $(element).is('body') ? $(window) : $(element)\n    this.$body          = $('body')\n    this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\n    this.selector       = (this.options.target\n      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n      || '') + ' .nav li > a'\n    this.offsets        = $([])\n    this.targets        = $([])\n    this.activeTarget   = null\n\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.DEFAULTS = {\n    offset: 10\n  }\n\n  ScrollSpy.prototype.refresh = function () {\n    var offsetMethod = this.$element[0] == window ? 'offset' : 'position'\n\n    this.offsets = $([])\n    this.targets = $([])\n\n    var self     = this\n    var $targets = this.$body\n      .find(this.selector)\n      .map(function () {\n        var $el   = $(this)\n        var href  = $el.data('target') || $el.attr('href')\n        var $href = /^#\\w/.test(href) && $(href)\n\n        return ($href\n          && $href.length\n          && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null\n      })\n      .sort(function (a, b) { return a[0] - b[0] })\n      .each(function () {\n        self.offsets.push(this[0])\n        self.targets.push(this[1])\n      })\n  }\n\n  ScrollSpy.prototype.process = function () {\n    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset\n    var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight\n    var maxScroll    = scrollHeight - this.$scrollElement.height()\n    var offsets      = this.offsets\n    var targets      = this.targets\n    var activeTarget = this.activeTarget\n    var i\n\n    if (scrollTop >= maxScroll) {\n      return activeTarget != (i = targets.last()[0]) && this.activate(i)\n    }\n\n    for (i = offsets.length; i--;) {\n      activeTarget != targets[i]\n        && scrollTop >= offsets[i]\n        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])\n        && this.activate( targets[i] )\n    }\n  }\n\n  ScrollSpy.prototype.activate = function (target) {\n    this.activeTarget = target\n\n    $(this.selector)\n      .parents('.active')\n      .removeClass('active')\n\n    var selector = this.selector\n      + '[data-target=\"' + target + '\"],'\n      + this.selector + '[href=\"' + target + '\"]'\n\n    var active = $(selector)\n      .parents('li')\n      .addClass('active')\n\n    if (active.parent('.dropdown-menu').length)  {\n      active = active\n        .closest('li.dropdown')\n        .addClass('active')\n    }\n\n    active.trigger('activate.bs.scrollspy')\n  }\n\n\n  // SCROLLSPY PLUGIN DEFINITION\n  // ===========================\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.scrollspy')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n\n  // SCROLLSPY NO CONFLICT\n  // =====================\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n\n  // SCROLLSPY DATA-API\n  // ==================\n\n  $(window).on('load', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      $spy.scrollspy($spy.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tab.js v3.0.3\n * http://getbootstrap.com/javascript/#tabs\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // TAB CLASS DEFINITION\n  // ====================\n\n  var Tab = function (element) {\n    this.element = $(element)\n  }\n\n  Tab.prototype.show = function () {\n    var $this    = this.element\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\n    var selector = $this.data('target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    if ($this.parent('li').hasClass('active')) return\n\n    var previous = $ul.find('.active:last a')[0]\n    var e        = $.Event('show.bs.tab', {\n      relatedTarget: previous\n    })\n\n    $this.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    var $target = $(selector)\n\n    this.activate($this.parent('li'), $ul)\n    this.activate($target, $target.parent(), function () {\n      $this.trigger({\n        type: 'shown.bs.tab'\n      , relatedTarget: previous\n      })\n    })\n  }\n\n  Tab.prototype.activate = function (element, container, callback) {\n    var $active    = container.find('> .active')\n    var transition = callback\n      && $.support.transition\n      && $active.hasClass('fade')\n\n    function next() {\n      $active\n        .removeClass('active')\n        .find('> .dropdown-menu > .active')\n        .removeClass('active')\n\n      element.addClass('active')\n\n      if (transition) {\n        element[0].offsetWidth // reflow for transition\n        element.addClass('in')\n      } else {\n        element.removeClass('fade')\n      }\n\n      if (element.parent('.dropdown-menu')) {\n        element.closest('li.dropdown').addClass('active')\n      }\n\n      callback && callback()\n    }\n\n    transition ?\n      $active\n        .one($.support.transition.end, next)\n        .emulateTransitionEnd(150) :\n      next()\n\n    $active.removeClass('in')\n  }\n\n\n  // TAB PLUGIN DEFINITION\n  // =====================\n\n  var old = $.fn.tab\n\n  $.fn.tab = function ( option ) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.tab')\n\n      if (!data) $this.data('bs.tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tab.Constructor = Tab\n\n\n  // TAB NO CONFLICT\n  // ===============\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n  // TAB DATA-API\n  // ============\n\n  $(document).on('click.bs.tab.data-api', '[data-toggle=\"tab\"], [data-toggle=\"pill\"]', function (e) {\n    e.preventDefault()\n    $(this).tab('show')\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: affix.js v3.0.3\n * http://getbootstrap.com/javascript/#affix\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // AFFIX CLASS DEFINITION\n  // ======================\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, Affix.DEFAULTS, options)\n    this.$window = $(window)\n      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))\n\n    this.$element = $(element)\n    this.affixed  =\n    this.unpin    = null\n\n    this.checkPosition()\n  }\n\n  Affix.RESET = 'affix affix-top affix-bottom'\n\n  Affix.DEFAULTS = {\n    offset: 0\n  }\n\n  Affix.prototype.checkPositionWithEventLoop = function () {\n    setTimeout($.proxy(this.checkPosition, this), 1)\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var scrollHeight = $(document).height()\n    var scrollTop    = this.$window.scrollTop()\n    var position     = this.$element.offset()\n    var offset       = this.options.offset\n    var offsetTop    = offset.top\n    var offsetBottom = offset.bottom\n\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top()\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()\n\n    var affix = this.unpin   != null && (scrollTop + this.unpin <= position.top) ? false :\n                offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :\n                offsetTop    != null && (scrollTop <= offsetTop) ? 'top' : false\n\n    if (this.affixed === affix) return\n    if (this.unpin) this.$element.css('top', '')\n\n    this.affixed = affix\n    this.unpin   = affix == 'bottom' ? position.top - scrollTop : null\n\n    this.$element.removeClass(Affix.RESET).addClass('affix' + (affix ? '-' + affix : ''))\n\n    if (affix == 'bottom') {\n      this.$element.offset({ top: document.body.offsetHeight - offsetBottom - this.$element.height() })\n    }\n  }\n\n\n  // AFFIX PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.affix\n\n  $.fn.affix = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.affix')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.affix.Constructor = Affix\n\n\n  // AFFIX NO CONFLICT\n  // =================\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n  // AFFIX DATA-API\n  // ==============\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n      var data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      if (data.offsetBottom) data.offset.bottom = data.offsetBottom\n      if (data.offsetTop)    data.offset.top    = data.offsetTop\n\n      $spy.affix(data)\n    })\n  })\n\n}(jQuery);\n"
  },
  {
    "path": "bower_components/bootstrap/js/affix.js",
    "content": "/* ========================================================================\n * Bootstrap: affix.js v3.0.3\n * http://getbootstrap.com/javascript/#affix\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // AFFIX CLASS DEFINITION\n  // ======================\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, Affix.DEFAULTS, options)\n    this.$window = $(window)\n      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))\n\n    this.$element = $(element)\n    this.affixed  =\n    this.unpin    = null\n\n    this.checkPosition()\n  }\n\n  Affix.RESET = 'affix affix-top affix-bottom'\n\n  Affix.DEFAULTS = {\n    offset: 0\n  }\n\n  Affix.prototype.checkPositionWithEventLoop = function () {\n    setTimeout($.proxy(this.checkPosition, this), 1)\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var scrollHeight = $(document).height()\n    var scrollTop    = this.$window.scrollTop()\n    var position     = this.$element.offset()\n    var offset       = this.options.offset\n    var offsetTop    = offset.top\n    var offsetBottom = offset.bottom\n\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top()\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()\n\n    var affix = this.unpin   != null && (scrollTop + this.unpin <= position.top) ? false :\n                offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :\n                offsetTop    != null && (scrollTop <= offsetTop) ? 'top' : false\n\n    if (this.affixed === affix) return\n    if (this.unpin) this.$element.css('top', '')\n\n    this.affixed = affix\n    this.unpin   = affix == 'bottom' ? position.top - scrollTop : null\n\n    this.$element.removeClass(Affix.RESET).addClass('affix' + (affix ? '-' + affix : ''))\n\n    if (affix == 'bottom') {\n      this.$element.offset({ top: document.body.offsetHeight - offsetBottom - this.$element.height() })\n    }\n  }\n\n\n  // AFFIX PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.affix\n\n  $.fn.affix = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.affix')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.affix.Constructor = Affix\n\n\n  // AFFIX NO CONFLICT\n  // =================\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n  // AFFIX DATA-API\n  // ==============\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n      var data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      if (data.offsetBottom) data.offset.bottom = data.offsetBottom\n      if (data.offsetTop)    data.offset.top    = data.offsetTop\n\n      $spy.affix(data)\n    })\n  })\n\n}(jQuery);\n"
  },
  {
    "path": "bower_components/bootstrap/js/alert.js",
    "content": "/* ========================================================================\n * Bootstrap: alert.js v3.0.3\n * http://getbootstrap.com/javascript/#alerts\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // ALERT CLASS DEFINITION\n  // ======================\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n  var Alert   = function (el) {\n    $(el).on('click', dismiss, this.close)\n  }\n\n  Alert.prototype.close = function (e) {\n    var $this    = $(this)\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = $(selector)\n\n    if (e) e.preventDefault()\n\n    if (!$parent.length) {\n      $parent = $this.hasClass('alert') ? $this : $this.parent()\n    }\n\n    $parent.trigger(e = $.Event('close.bs.alert'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      $parent.trigger('closed.bs.alert').remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent\n        .one($.support.transition.end, removeElement)\n        .emulateTransitionEnd(150) :\n      removeElement()\n  }\n\n\n  // ALERT PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.alert\n\n  $.fn.alert = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.alert')\n\n      if (!data) $this.data('bs.alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.alert.Constructor = Alert\n\n\n  // ALERT NO CONFLICT\n  // =================\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n\n  // ALERT DATA-API\n  // ==============\n\n  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)\n\n}(jQuery);\n"
  },
  {
    "path": "bower_components/bootstrap/js/button.js",
    "content": "/* ========================================================================\n * Bootstrap: button.js v3.0.3\n * http://getbootstrap.com/javascript/#buttons\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // BUTTON PUBLIC CLASS DEFINITION\n  // ==============================\n\n  var Button = function (element, options) {\n    this.$element = $(element)\n    this.options  = $.extend({}, Button.DEFAULTS, options)\n  }\n\n  Button.DEFAULTS = {\n    loadingText: 'loading...'\n  }\n\n  Button.prototype.setState = function (state) {\n    var d    = 'disabled'\n    var $el  = this.$element\n    var val  = $el.is('input') ? 'val' : 'html'\n    var data = $el.data()\n\n    state = state + 'Text'\n\n    if (!data.resetText) $el.data('resetText', $el[val]())\n\n    $el[val](data[state] || this.options[state])\n\n    // push to event loop to allow forms to submit\n    setTimeout(function () {\n      state == 'loadingText' ?\n        $el.addClass(d).attr(d, d) :\n        $el.removeClass(d).removeAttr(d);\n    }, 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n    var changed = true\n\n    if ($parent.length) {\n      var $input = this.$element.find('input')\n      if ($input.prop('type') === 'radio') {\n        // see if clicking on current one\n        if ($input.prop('checked') && this.$element.hasClass('active'))\n          changed = false\n        else\n          $parent.find('.active').removeClass('active')\n      }\n      if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')\n    }\n\n    if (changed) this.$element.toggleClass('active')\n  }\n\n\n  // BUTTON PLUGIN DEFINITION\n  // ========================\n\n  var old = $.fn.button\n\n  $.fn.button = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.button')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.button', (data = new Button(this, options)))\n\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  $.fn.button.Constructor = Button\n\n\n  // BUTTON NO CONFLICT\n  // ==================\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n\n  // BUTTON DATA-API\n  // ===============\n\n  $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {\n    var $btn = $(e.target)\n    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n    $btn.button('toggle')\n    e.preventDefault()\n  })\n\n}(jQuery);\n"
  },
  {
    "path": "bower_components/bootstrap/js/carousel.js",
    "content": "/* ========================================================================\n * Bootstrap: carousel.js v3.0.3\n * http://getbootstrap.com/javascript/#carousel\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // CAROUSEL CLASS DEFINITION\n  // =========================\n\n  var Carousel = function (element, options) {\n    this.$element    = $(element)\n    this.$indicators = this.$element.find('.carousel-indicators')\n    this.options     = options\n    this.paused      =\n    this.sliding     =\n    this.interval    =\n    this.$active     =\n    this.$items      = null\n\n    this.options.pause == 'hover' && this.$element\n      .on('mouseenter', $.proxy(this.pause, this))\n      .on('mouseleave', $.proxy(this.cycle, this))\n  }\n\n  Carousel.DEFAULTS = {\n    interval: 5000\n  , pause: 'hover'\n  , wrap: true\n  }\n\n  Carousel.prototype.cycle =  function (e) {\n    e || (this.paused = false)\n\n    this.interval && clearInterval(this.interval)\n\n    this.options.interval\n      && !this.paused\n      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n\n    return this\n  }\n\n  Carousel.prototype.getActiveIndex = function () {\n    this.$active = this.$element.find('.item.active')\n    this.$items  = this.$active.parent().children()\n\n    return this.$items.index(this.$active)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getActiveIndex()\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) })\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))\n  }\n\n  Carousel.prototype.pause = function (e) {\n    e || (this.paused = true)\n\n    if (this.$element.find('.next, .prev').length && $.support.transition.end) {\n      this.$element.trigger($.support.transition.end)\n      this.cycle(true)\n    }\n\n    this.interval = clearInterval(this.interval)\n\n    return this\n  }\n\n  Carousel.prototype.next = function () {\n    if (this.sliding) return\n    return this.slide('next')\n  }\n\n  Carousel.prototype.prev = function () {\n    if (this.sliding) return\n    return this.slide('prev')\n  }\n\n  Carousel.prototype.slide = function (type, next) {\n    var $active   = this.$element.find('.item.active')\n    var $next     = next || $active[type]()\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var fallback  = type == 'next' ? 'first' : 'last'\n    var that      = this\n\n    if (!$next.length) {\n      if (!this.options.wrap) return\n      $next = this.$element.find('.item')[fallback]()\n    }\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })\n\n    if ($next.hasClass('active')) return\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      this.$element.one('slid.bs.carousel', function () {\n        var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])\n        $nextIndicator && $nextIndicator.addClass('active')\n      })\n    }\n\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      this.$element.trigger(e)\n      if (e.isDefaultPrevented()) return\n      $next.addClass(type)\n      $next[0].offsetWidth // force reflow\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one($.support.transition.end, function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0)\n        })\n        .emulateTransitionEnd(600)\n    } else {\n      this.$element.trigger(e)\n      if (e.isDefaultPrevented()) return\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger('slid.bs.carousel')\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.carousel\n\n  $.fn.carousel = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.carousel')\n      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)\n      var action  = typeof option == 'string' ? option : options.slide\n\n      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.pause().cycle()\n    })\n  }\n\n  $.fn.carousel.Constructor = Carousel\n\n\n  // CAROUSEL NO CONFLICT\n  // ====================\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n\n  // CAROUSEL DATA-API\n  // =================\n\n  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {\n    var $this   = $(this), href\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    $target.carousel(options)\n\n    if (slideIndex = $this.attr('data-slide-to')) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  })\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      $carousel.carousel($carousel.data())\n    })\n  })\n\n}(jQuery);\n"
  },
  {
    "path": "bower_components/bootstrap/js/collapse.js",
    "content": "/* ========================================================================\n * Bootstrap: collapse.js v3.0.3\n * http://getbootstrap.com/javascript/#collapse\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // COLLAPSE PUBLIC CLASS DEFINITION\n  // ================================\n\n  var Collapse = function (element, options) {\n    this.$element      = $(element)\n    this.options       = $.extend({}, Collapse.DEFAULTS, options)\n    this.transitioning = null\n\n    if (this.options.parent) this.$parent = $(this.options.parent)\n    if (this.options.toggle) this.toggle()\n  }\n\n  Collapse.DEFAULTS = {\n    toggle: true\n  }\n\n  Collapse.prototype.dimension = function () {\n    var hasWidth = this.$element.hasClass('width')\n    return hasWidth ? 'width' : 'height'\n  }\n\n  Collapse.prototype.show = function () {\n    if (this.transitioning || this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('show.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var actives = this.$parent && this.$parent.find('> .panel > .in')\n\n    if (actives && actives.length) {\n      var hasData = actives.data('bs.collapse')\n      if (hasData && hasData.transitioning) return\n      actives.collapse('hide')\n      hasData || actives.data('bs.collapse', null)\n    }\n\n    var dimension = this.dimension()\n\n    this.$element\n      .removeClass('collapse')\n      .addClass('collapsing')\n      [dimension](0)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.$element\n        .removeClass('collapsing')\n        .addClass('in')\n        [dimension]('auto')\n      this.transitioning = 0\n      this.$element.trigger('shown.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    var scrollSize = $.camelCase(['scroll', dimension].join('-'))\n\n    this.$element\n      .one($.support.transition.end, $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n      [dimension](this.$element[0][scrollSize])\n  }\n\n  Collapse.prototype.hide = function () {\n    if (this.transitioning || !this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('hide.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var dimension = this.dimension()\n\n    this.$element\n      [dimension](this.$element[dimension]())\n      [0].offsetHeight\n\n    this.$element\n      .addClass('collapsing')\n      .removeClass('collapse')\n      .removeClass('in')\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.transitioning = 0\n      this.$element\n        .trigger('hidden.bs.collapse')\n        .removeClass('collapsing')\n        .addClass('collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    this.$element\n      [dimension](0)\n      .one($.support.transition.end, $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n  }\n\n  Collapse.prototype.toggle = function () {\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\n  }\n\n\n  // COLLAPSE PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.collapse\n\n  $.fn.collapse = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.collapse')\n      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.collapse.Constructor = Collapse\n\n\n  // COLLAPSE NO CONFLICT\n  // ====================\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n\n  // COLLAPSE DATA-API\n  // =================\n\n  $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {\n    var $this   = $(this), href\n    var target  = $this.attr('data-target')\n        || e.preventDefault()\n        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') //strip for ie7\n    var $target = $(target)\n    var data    = $target.data('bs.collapse')\n    var option  = data ? 'toggle' : $this.data()\n    var parent  = $this.attr('data-parent')\n    var $parent = parent && $(parent)\n\n    if (!data || !data.transitioning) {\n      if ($parent) $parent.find('[data-toggle=collapse][data-parent=\"' + parent + '\"]').not($this).addClass('collapsed')\n      $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')\n    }\n\n    $target.collapse(option)\n  })\n\n}(jQuery);\n"
  },
  {
    "path": "bower_components/bootstrap/js/dropdown.js",
    "content": "/* ========================================================================\n * Bootstrap: dropdown.js v3.0.3\n * http://getbootstrap.com/javascript/#dropdowns\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // DROPDOWN CLASS DEFINITION\n  // =========================\n\n  var backdrop = '.dropdown-backdrop'\n  var toggle   = '[data-toggle=dropdown]'\n  var Dropdown = function (element) {\n    $(element).on('click.bs.dropdown', this.toggle)\n  }\n\n  Dropdown.prototype.toggle = function (e) {\n    var $this = $(this)\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    clearMenus()\n\n    if (!isActive) {\n      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n        // if mobile we use a backdrop because click events don't delegate\n        $('<div class=\"dropdown-backdrop\"/>').insertAfter($(this)).on('click', clearMenus)\n      }\n\n      $parent.trigger(e = $.Event('show.bs.dropdown'))\n\n      if (e.isDefaultPrevented()) return\n\n      $parent\n        .toggleClass('open')\n        .trigger('shown.bs.dropdown')\n\n      $this.focus()\n    }\n\n    return false\n  }\n\n  Dropdown.prototype.keydown = function (e) {\n    if (!/(38|40|27)/.test(e.keyCode)) return\n\n    var $this = $(this)\n\n    e.preventDefault()\n    e.stopPropagation()\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    if (!isActive || (isActive && e.keyCode == 27)) {\n      if (e.which == 27) $parent.find(toggle).focus()\n      return $this.click()\n    }\n\n    var $items = $('[role=menu] li:not(.divider):visible a', $parent)\n\n    if (!$items.length) return\n\n    var index = $items.index($items.filter(':focus'))\n\n    if (e.keyCode == 38 && index > 0)                 index--                        // up\n    if (e.keyCode == 40 && index < $items.length - 1) index++                        // down\n    if (!~index)                                      index=0\n\n    $items.eq(index).focus()\n  }\n\n  function clearMenus() {\n    $(backdrop).remove()\n    $(toggle).each(function (e) {\n      var $parent = getParent($(this))\n      if (!$parent.hasClass('open')) return\n      $parent.trigger(e = $.Event('hide.bs.dropdown'))\n      if (e.isDefaultPrevented()) return\n      $parent.removeClass('open').trigger('hidden.bs.dropdown')\n    })\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    var $parent = selector && $(selector)\n\n    return $parent && $parent.length ? $parent : $this.parent()\n  }\n\n\n  // DROPDOWN PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.dropdown')\n\n      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  // DROPDOWN NO CONFLICT\n  // ====================\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  // APPLY TO STANDARD DROPDOWN ELEMENTS\n  // ===================================\n\n  $(document)\n    .on('click.bs.dropdown.data-api', clearMenus)\n    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.bs.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)\n    .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)\n\n}(jQuery);\n"
  },
  {
    "path": "bower_components/bootstrap/js/modal.js",
    "content": "/* ========================================================================\n * Bootstrap: modal.js v3.0.3\n * http://getbootstrap.com/javascript/#modals\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // MODAL CLASS DEFINITION\n  // ======================\n\n  var Modal = function (element, options) {\n    this.options   = options\n    this.$element  = $(element)\n    this.$backdrop =\n    this.isShown   = null\n\n    if (this.options.remote) this.$element.load(this.options.remote)\n  }\n\n  Modal.DEFAULTS = {\n      backdrop: true\n    , keyboard: true\n    , show: true\n  }\n\n  Modal.prototype.toggle = function (_relatedTarget) {\n    return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)\n  }\n\n  Modal.prototype.show = function (_relatedTarget) {\n    var that = this\n    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\n\n    this.$element.trigger(e)\n\n    if (this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = true\n\n    this.escape()\n\n    this.$element.on('click.dismiss.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\n\n    this.backdrop(function () {\n      var transition = $.support.transition && that.$element.hasClass('fade')\n\n      if (!that.$element.parent().length) {\n        that.$element.appendTo(document.body) // don't move modals dom position\n      }\n\n      that.$element.show()\n\n      if (transition) {\n        that.$element[0].offsetWidth // force reflow\n      }\n\n      that.$element\n        .addClass('in')\n        .attr('aria-hidden', false)\n\n      that.enforceFocus()\n\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n      transition ?\n        that.$element.find('.modal-dialog') // wait for modal to slide in\n          .one($.support.transition.end, function () {\n            that.$element.focus().trigger(e)\n          })\n          .emulateTransitionEnd(300) :\n        that.$element.focus().trigger(e)\n    })\n  }\n\n  Modal.prototype.hide = function (e) {\n    if (e) e.preventDefault()\n\n    e = $.Event('hide.bs.modal')\n\n    this.$element.trigger(e)\n\n    if (!this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = false\n\n    this.escape()\n\n    $(document).off('focusin.bs.modal')\n\n    this.$element\n      .removeClass('in')\n      .attr('aria-hidden', true)\n      .off('click.dismiss.modal')\n\n    $.support.transition && this.$element.hasClass('fade') ?\n      this.$element\n        .one($.support.transition.end, $.proxy(this.hideModal, this))\n        .emulateTransitionEnd(300) :\n      this.hideModal()\n  }\n\n  Modal.prototype.enforceFocus = function () {\n    $(document)\n      .off('focusin.bs.modal') // guard against infinite focus loop\n      .on('focusin.bs.modal', $.proxy(function (e) {\n        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {\n          this.$element.focus()\n        }\n      }, this))\n  }\n\n  Modal.prototype.escape = function () {\n    if (this.isShown && this.options.keyboard) {\n      this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {\n        e.which == 27 && this.hide()\n      }, this))\n    } else if (!this.isShown) {\n      this.$element.off('keyup.dismiss.bs.modal')\n    }\n  }\n\n  Modal.prototype.hideModal = function () {\n    var that = this\n    this.$element.hide()\n    this.backdrop(function () {\n      that.removeBackdrop()\n      that.$element.trigger('hidden.bs.modal')\n    })\n  }\n\n  Modal.prototype.removeBackdrop = function () {\n    this.$backdrop && this.$backdrop.remove()\n    this.$backdrop = null\n  }\n\n  Modal.prototype.backdrop = function (callback) {\n    var that    = this\n    var animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n    if (this.isShown && this.options.backdrop) {\n      var doAnimate = $.support.transition && animate\n\n      this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n        .appendTo(document.body)\n\n      this.$element.on('click.dismiss.modal', $.proxy(function (e) {\n        if (e.target !== e.currentTarget) return\n        this.options.backdrop == 'static'\n          ? this.$element[0].focus.call(this.$element[0])\n          : this.hide.call(this)\n      }, this))\n\n      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n      this.$backdrop.addClass('in')\n\n      if (!callback) return\n\n      doAnimate ?\n        this.$backdrop\n          .one($.support.transition.end, callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      $.support.transition && this.$element.hasClass('fade')?\n        this.$backdrop\n          .one($.support.transition.end, callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n\n  // MODAL PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.modal\n\n  $.fn.modal = function (option, _relatedTarget) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.modal')\n      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option](_relatedTarget)\n      else if (options.show) data.show(_relatedTarget)\n    })\n  }\n\n  $.fn.modal.Constructor = Modal\n\n\n  // MODAL NO CONFLICT\n  // =================\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n  // MODAL DATA-API\n  // ==============\n\n  $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this   = $(this)\n    var href    = $this.attr('href')\n    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) //strip for ie7\n    var option  = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    e.preventDefault()\n\n    $target\n      .modal(option, this)\n      .one('hide', function () {\n        $this.is(':visible') && $this.focus()\n      })\n  })\n\n  $(document)\n    .on('show.bs.modal',  '.modal', function () { $(document.body).addClass('modal-open') })\n    .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })\n\n}(jQuery);\n"
  },
  {
    "path": "bower_components/bootstrap/js/popover.js",
    "content": "/* ========================================================================\n * Bootstrap: popover.js v3.0.3\n * http://getbootstrap.com/javascript/#popovers\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // POPOVER PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')\n\n  Popover.DEFAULTS = $.extend({} , $.fn.tooltip.Constructor.DEFAULTS, {\n    placement: 'right'\n  , trigger: 'click'\n  , content: ''\n  , template: '<div class=\"popover\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'\n  })\n\n\n  // NOTE: POPOVER EXTENDS tooltip.js\n  // ================================\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)\n\n  Popover.prototype.constructor = Popover\n\n  Popover.prototype.getDefaults = function () {\n    return Popover.DEFAULTS\n  }\n\n  Popover.prototype.setContent = function () {\n    var $tip    = this.tip()\n    var title   = this.getTitle()\n    var content = this.getContent()\n\n    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n    $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)\n\n    $tip.removeClass('fade top bottom left right in')\n\n    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do\n    // this manually by checking the contents.\n    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()\n  }\n\n  Popover.prototype.hasContent = function () {\n    return this.getTitle() || this.getContent()\n  }\n\n  Popover.prototype.getContent = function () {\n    var $e = this.$element\n    var o  = this.options\n\n    return $e.attr('data-content')\n      || (typeof o.content == 'function' ?\n            o.content.call($e[0]) :\n            o.content)\n  }\n\n  Popover.prototype.arrow = function () {\n    return this.$arrow = this.$arrow || this.tip().find('.arrow')\n  }\n\n  Popover.prototype.tip = function () {\n    if (!this.$tip) this.$tip = $(this.options.template)\n    return this.$tip\n  }\n\n\n  // POPOVER PLUGIN DEFINITION\n  // =========================\n\n  var old = $.fn.popover\n\n  $.fn.popover = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.popover')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.popover.Constructor = Popover\n\n\n  // POPOVER NO CONFLICT\n  // ===================\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(jQuery);\n"
  },
  {
    "path": "bower_components/bootstrap/js/scrollspy.js",
    "content": "/* ========================================================================\n * Bootstrap: scrollspy.js v3.0.3\n * http://getbootstrap.com/javascript/#scrollspy\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // SCROLLSPY CLASS DEFINITION\n  // ==========================\n\n  function ScrollSpy(element, options) {\n    var href\n    var process  = $.proxy(this.process, this)\n\n    this.$element       = $(element).is('body') ? $(window) : $(element)\n    this.$body          = $('body')\n    this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\n    this.selector       = (this.options.target\n      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n      || '') + ' .nav li > a'\n    this.offsets        = $([])\n    this.targets        = $([])\n    this.activeTarget   = null\n\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.DEFAULTS = {\n    offset: 10\n  }\n\n  ScrollSpy.prototype.refresh = function () {\n    var offsetMethod = this.$element[0] == window ? 'offset' : 'position'\n\n    this.offsets = $([])\n    this.targets = $([])\n\n    var self     = this\n    var $targets = this.$body\n      .find(this.selector)\n      .map(function () {\n        var $el   = $(this)\n        var href  = $el.data('target') || $el.attr('href')\n        var $href = /^#\\w/.test(href) && $(href)\n\n        return ($href\n          && $href.length\n          && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null\n      })\n      .sort(function (a, b) { return a[0] - b[0] })\n      .each(function () {\n        self.offsets.push(this[0])\n        self.targets.push(this[1])\n      })\n  }\n\n  ScrollSpy.prototype.process = function () {\n    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset\n    var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight\n    var maxScroll    = scrollHeight - this.$scrollElement.height()\n    var offsets      = this.offsets\n    var targets      = this.targets\n    var activeTarget = this.activeTarget\n    var i\n\n    if (scrollTop >= maxScroll) {\n      return activeTarget != (i = targets.last()[0]) && this.activate(i)\n    }\n\n    for (i = offsets.length; i--;) {\n      activeTarget != targets[i]\n        && scrollTop >= offsets[i]\n        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])\n        && this.activate( targets[i] )\n    }\n  }\n\n  ScrollSpy.prototype.activate = function (target) {\n    this.activeTarget = target\n\n    $(this.selector)\n      .parents('.active')\n      .removeClass('active')\n\n    var selector = this.selector\n      + '[data-target=\"' + target + '\"],'\n      + this.selector + '[href=\"' + target + '\"]'\n\n    var active = $(selector)\n      .parents('li')\n      .addClass('active')\n\n    if (active.parent('.dropdown-menu').length)  {\n      active = active\n        .closest('li.dropdown')\n        .addClass('active')\n    }\n\n    active.trigger('activate.bs.scrollspy')\n  }\n\n\n  // SCROLLSPY PLUGIN DEFINITION\n  // ===========================\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.scrollspy')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n\n  // SCROLLSPY NO CONFLICT\n  // =====================\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n\n  // SCROLLSPY DATA-API\n  // ==================\n\n  $(window).on('load', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      $spy.scrollspy($spy.data())\n    })\n  })\n\n}(jQuery);\n"
  },
  {
    "path": "bower_components/bootstrap/js/tab.js",
    "content": "/* ========================================================================\n * Bootstrap: tab.js v3.0.3\n * http://getbootstrap.com/javascript/#tabs\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // TAB CLASS DEFINITION\n  // ====================\n\n  var Tab = function (element) {\n    this.element = $(element)\n  }\n\n  Tab.prototype.show = function () {\n    var $this    = this.element\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\n    var selector = $this.data('target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    if ($this.parent('li').hasClass('active')) return\n\n    var previous = $ul.find('.active:last a')[0]\n    var e        = $.Event('show.bs.tab', {\n      relatedTarget: previous\n    })\n\n    $this.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    var $target = $(selector)\n\n    this.activate($this.parent('li'), $ul)\n    this.activate($target, $target.parent(), function () {\n      $this.trigger({\n        type: 'shown.bs.tab'\n      , relatedTarget: previous\n      })\n    })\n  }\n\n  Tab.prototype.activate = function (element, container, callback) {\n    var $active    = container.find('> .active')\n    var transition = callback\n      && $.support.transition\n      && $active.hasClass('fade')\n\n    function next() {\n      $active\n        .removeClass('active')\n        .find('> .dropdown-menu > .active')\n        .removeClass('active')\n\n      element.addClass('active')\n\n      if (transition) {\n        element[0].offsetWidth // reflow for transition\n        element.addClass('in')\n      } else {\n        element.removeClass('fade')\n      }\n\n      if (element.parent('.dropdown-menu')) {\n        element.closest('li.dropdown').addClass('active')\n      }\n\n      callback && callback()\n    }\n\n    transition ?\n      $active\n        .one($.support.transition.end, next)\n        .emulateTransitionEnd(150) :\n      next()\n\n    $active.removeClass('in')\n  }\n\n\n  // TAB PLUGIN DEFINITION\n  // =====================\n\n  var old = $.fn.tab\n\n  $.fn.tab = function ( option ) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.tab')\n\n      if (!data) $this.data('bs.tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tab.Constructor = Tab\n\n\n  // TAB NO CONFLICT\n  // ===============\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n  // TAB DATA-API\n  // ============\n\n  $(document).on('click.bs.tab.data-api', '[data-toggle=\"tab\"], [data-toggle=\"pill\"]', function (e) {\n    e.preventDefault()\n    $(this).tab('show')\n  })\n\n}(jQuery);\n"
  },
  {
    "path": "bower_components/bootstrap/js/tooltip.js",
    "content": "/* ========================================================================\n * Bootstrap: tooltip.js v3.0.3\n * http://getbootstrap.com/javascript/#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // TOOLTIP PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Tooltip = function (element, options) {\n    this.type       =\n    this.options    =\n    this.enabled    =\n    this.timeout    =\n    this.hoverState =\n    this.$element   = null\n\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.DEFAULTS = {\n    animation: true\n  , placement: 'top'\n  , selector: false\n  , template: '<div class=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>'\n  , trigger: 'hover focus'\n  , title: ''\n  , delay: 0\n  , html: false\n  , container: false\n  }\n\n  Tooltip.prototype.init = function (type, element, options) {\n    this.enabled  = true\n    this.type     = type\n    this.$element = $(element)\n    this.options  = this.getOptions(options)\n\n    var triggers = this.options.trigger.split(' ')\n\n    for (var i = triggers.length; i--;) {\n      var trigger = triggers[i]\n\n      if (trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (trigger != 'manual') {\n        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focus'\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'\n\n        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n    }\n\n    this.options.selector ?\n      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n      this.fixTitle()\n  }\n\n  Tooltip.prototype.getDefaults = function () {\n    return Tooltip.DEFAULTS\n  }\n\n  Tooltip.prototype.getOptions = function (options) {\n    options = $.extend({}, this.getDefaults(), this.$element.data(), options)\n\n    if (options.delay && typeof options.delay == 'number') {\n      options.delay = {\n        show: options.delay\n      , hide: options.delay\n      }\n    }\n\n    return options\n  }\n\n  Tooltip.prototype.getDelegateOptions = function () {\n    var options  = {}\n    var defaults = this.getDefaults()\n\n    this._options && $.each(this._options, function (key, value) {\n      if (defaults[key] != value) options[key] = value\n    })\n\n    return options\n  }\n\n  Tooltip.prototype.enter = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'in'\n\n    if (!self.options.delay || !self.options.delay.show) return self.show()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'in') self.show()\n    }, self.options.delay.show)\n  }\n\n  Tooltip.prototype.leave = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'out'\n\n    if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'out') self.hide()\n    }, self.options.delay.hide)\n  }\n\n  Tooltip.prototype.show = function () {\n    var e = $.Event('show.bs.'+ this.type)\n\n    if (this.hasContent() && this.enabled) {\n      this.$element.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      var $tip = this.tip()\n\n      this.setContent()\n\n      if (this.options.animation) $tip.addClass('fade')\n\n      var placement = typeof this.options.placement == 'function' ?\n        this.options.placement.call(this, $tip[0], this.$element[0]) :\n        this.options.placement\n\n      var autoToken = /\\s?auto?\\s?/i\n      var autoPlace = autoToken.test(placement)\n      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'\n\n      $tip\n        .detach()\n        .css({ top: 0, left: 0, display: 'block' })\n        .addClass(placement)\n\n      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n\n      var pos          = this.getPosition()\n      var actualWidth  = $tip[0].offsetWidth\n      var actualHeight = $tip[0].offsetHeight\n\n      if (autoPlace) {\n        var $parent = this.$element.parent()\n\n        var orgPlacement = placement\n        var docScroll    = document.documentElement.scrollTop || document.body.scrollTop\n        var parentWidth  = this.options.container == 'body' ? window.innerWidth  : $parent.outerWidth()\n        var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()\n        var parentLeft   = this.options.container == 'body' ? 0 : $parent.offset().left\n\n        placement = placement == 'bottom' && pos.top   + pos.height  + actualHeight - docScroll > parentHeight  ? 'top'    :\n                    placement == 'top'    && pos.top   - docScroll   - actualHeight < 0                         ? 'bottom' :\n                    placement == 'right'  && pos.right + actualWidth > parentWidth                              ? 'left'   :\n                    placement == 'left'   && pos.left  - actualWidth < parentLeft                               ? 'right'  :\n                    placement\n\n        $tip\n          .removeClass(orgPlacement)\n          .addClass(placement)\n      }\n\n      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)\n\n      this.applyPlacement(calculatedOffset, placement)\n      this.$element.trigger('shown.bs.' + this.type)\n    }\n  }\n\n  Tooltip.prototype.applyPlacement = function(offset, placement) {\n    var replace\n    var $tip   = this.tip()\n    var width  = $tip[0].offsetWidth\n    var height = $tip[0].offsetHeight\n\n    // manually read margins because getBoundingClientRect includes difference\n    var marginTop = parseInt($tip.css('margin-top'), 10)\n    var marginLeft = parseInt($tip.css('margin-left'), 10)\n\n    // we must check for NaN for ie 8/9\n    if (isNaN(marginTop))  marginTop  = 0\n    if (isNaN(marginLeft)) marginLeft = 0\n\n    offset.top  = offset.top  + marginTop\n    offset.left = offset.left + marginLeft\n\n    $tip\n      .offset(offset)\n      .addClass('in')\n\n    // check to see if placing tip in new offset caused the tip to resize itself\n    var actualWidth  = $tip[0].offsetWidth\n    var actualHeight = $tip[0].offsetHeight\n\n    if (placement == 'top' && actualHeight != height) {\n      replace = true\n      offset.top = offset.top + height - actualHeight\n    }\n\n    if (/bottom|top/.test(placement)) {\n      var delta = 0\n\n      if (offset.left < 0) {\n        delta       = offset.left * -2\n        offset.left = 0\n\n        $tip.offset(offset)\n\n        actualWidth  = $tip[0].offsetWidth\n        actualHeight = $tip[0].offsetHeight\n      }\n\n      this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')\n    } else {\n      this.replaceArrow(actualHeight - height, actualHeight, 'top')\n    }\n\n    if (replace) $tip.offset(offset)\n  }\n\n  Tooltip.prototype.replaceArrow = function(delta, dimension, position) {\n    this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + \"%\") : '')\n  }\n\n  Tooltip.prototype.setContent = function () {\n    var $tip  = this.tip()\n    var title = this.getTitle()\n\n    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n    $tip.removeClass('fade in top bottom left right')\n  }\n\n  Tooltip.prototype.hide = function () {\n    var that = this\n    var $tip = this.tip()\n    var e    = $.Event('hide.bs.' + this.type)\n\n    function complete() {\n      if (that.hoverState != 'in') $tip.detach()\n    }\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    $tip.removeClass('in')\n\n    $.support.transition && this.$tip.hasClass('fade') ?\n      $tip\n        .one($.support.transition.end, complete)\n        .emulateTransitionEnd(150) :\n      complete()\n\n    this.$element.trigger('hidden.bs.' + this.type)\n\n    return this\n  }\n\n  Tooltip.prototype.fixTitle = function () {\n    var $e = this.$element\n    if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {\n      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n    }\n  }\n\n  Tooltip.prototype.hasContent = function () {\n    return this.getTitle()\n  }\n\n  Tooltip.prototype.getPosition = function () {\n    var el = this.$element[0]\n    return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {\n      width: el.offsetWidth\n    , height: el.offsetHeight\n    }, this.$element.offset())\n  }\n\n  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {\n    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :\n        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }\n  }\n\n  Tooltip.prototype.getTitle = function () {\n    var title\n    var $e = this.$element\n    var o  = this.options\n\n    title = $e.attr('data-original-title')\n      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n    return title\n  }\n\n  Tooltip.prototype.tip = function () {\n    return this.$tip = this.$tip || $(this.options.template)\n  }\n\n  Tooltip.prototype.arrow = function () {\n    return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')\n  }\n\n  Tooltip.prototype.validate = function () {\n    if (!this.$element[0].parentNode) {\n      this.hide()\n      this.$element = null\n      this.options  = null\n    }\n  }\n\n  Tooltip.prototype.enable = function () {\n    this.enabled = true\n  }\n\n  Tooltip.prototype.disable = function () {\n    this.enabled = false\n  }\n\n  Tooltip.prototype.toggleEnabled = function () {\n    this.enabled = !this.enabled\n  }\n\n  Tooltip.prototype.toggle = function (e) {\n    var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this\n    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n  }\n\n  Tooltip.prototype.destroy = function () {\n    this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)\n  }\n\n\n  // TOOLTIP PLUGIN DEFINITION\n  // =========================\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.tooltip')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tooltip.Constructor = Tooltip\n\n\n  // TOOLTIP NO CONFLICT\n  // ===================\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(jQuery);\n"
  },
  {
    "path": "bower_components/bootstrap/js/transition.js",
    "content": "/* ========================================================================\n * Bootstrap: transition.js v3.0.3\n * http://getbootstrap.com/javascript/#transitions\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)\n  // ============================================================\n\n  function transitionEnd() {\n    var el = document.createElement('bootstrap')\n\n    var transEndEventNames = {\n      'WebkitTransition' : 'webkitTransitionEnd'\n    , 'MozTransition'    : 'transitionend'\n    , 'OTransition'      : 'oTransitionEnd otransitionend'\n    , 'transition'       : 'transitionend'\n    }\n\n    for (var name in transEndEventNames) {\n      if (el.style[name] !== undefined) {\n        return { end: transEndEventNames[name] }\n      }\n    }\n  }\n\n  // http://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = function (duration) {\n    var called = false, $el = this\n    $(this).one($.support.transition.end, function () { called = true })\n    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n    setTimeout(callback, duration)\n    return this\n  }\n\n  $(function () {\n    $.support.transition = transitionEnd()\n  })\n\n}(jQuery);\n"
  },
  {
    "path": "bower_components/bootstrap/less/alerts.less",
    "content": "//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n  padding: @alert-padding;\n  margin-bottom: @line-height-computed;\n  border: 1px solid transparent;\n  border-radius: @alert-border-radius;\n\n  // Headings for larger alerts\n  h4 {\n    margin-top: 0;\n    // Specified for the h4 to prevent conflicts of changing @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// Dismissable alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable {\n padding-right: (@alert-padding + 20);\n\n  // Adjust close link position\n  .close {\n    position: relative;\n    top: -2px;\n    right: -21px;\n    color: inherit;\n  }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n  .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n.alert-info {\n  .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n.alert-warning {\n  .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n.alert-danger {\n  .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n"
  },
  {
    "path": "bower_components/bootstrap/less/badges.less",
    "content": "//\n// Badges\n// --------------------------------------------------\n\n\n// Base classes\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: @font-size-small;\n  font-weight: @badge-font-weight;\n  color: @badge-color;\n  line-height: @badge-line-height;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-align: center;\n  background-color: @badge-bg;\n  border-radius: @badge-border-radius;\n\n  // Empty badges collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for badges in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n}\n\n// Hover state, but only for links\na.badge {\n  &:hover,\n  &:focus {\n    color: @badge-link-hover-color;\n    text-decoration: none;\n    cursor: pointer;\n  }\n}\n\n// Account for counters in navs\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: @badge-active-color;\n  background-color: @badge-active-bg;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n"
  },
  {
    "path": "bower_components/bootstrap/less/bootstrap.less",
    "content": "// Core variables and mixins\n@import \"variables.less\";\n@import \"mixins.less\";\n\n// Reset\n@import \"normalize.less\";\n@import \"print.less\";\n\n// Core CSS\n@import \"scaffolding.less\";\n@import \"type.less\";\n@import \"code.less\";\n@import \"grid.less\";\n@import \"tables.less\";\n@import \"forms.less\";\n@import \"buttons.less\";\n\n// Components\n@import \"component-animations.less\";\n@import \"glyphicons.less\";\n@import \"dropdowns.less\";\n@import \"button-groups.less\";\n@import \"input-groups.less\";\n@import \"navs.less\";\n@import \"navbar.less\";\n@import \"breadcrumbs.less\";\n@import \"pagination.less\";\n@import \"pager.less\";\n@import \"labels.less\";\n@import \"badges.less\";\n@import \"jumbotron.less\";\n@import \"thumbnails.less\";\n@import \"alerts.less\";\n@import \"progress-bars.less\";\n@import \"media.less\";\n@import \"list-group.less\";\n@import \"panels.less\";\n@import \"wells.less\";\n@import \"close.less\";\n\n// Components w/ JavaScript\n@import \"modals.less\";\n@import \"tooltip.less\";\n@import \"popovers.less\";\n@import \"carousel.less\";\n\n// Utility classes\n@import \"utilities.less\";\n@import \"responsive-utilities.less\";\n"
  },
  {
    "path": "bower_components/bootstrap/less/breadcrumbs.less",
    "content": "//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: @line-height-computed;\n  list-style: none;\n  background-color: @breadcrumb-bg;\n  border-radius: @border-radius-base;\n  > li {\n    display: inline-block;\n    + li:before {\n      content: \"@{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  > .active {\n    color: @breadcrumb-active-color;\n  }\n}\n"
  },
  {
    "path": "bower_components/bootstrap/less/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: none;\n    }\n  }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n  .btn + .btn,\n  .btn + .btn-group,\n  .btn-group + .btn,\n  .btn-group + .btn-group {\n    margin-left: -1px;\n  }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n  .clearfix();\n\n  .btn-group {\n    float: left;\n  }\n  // Space out series of button groups\n  > .btn,\n  > .btn-group {\n    + .btn,\n    + .btn-group {\n      margin-left: 5px;\n    }\n  }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n  margin-left: 0;\n  &:not(:last-child):not(.dropdown-toggle) {\n    .border-right-radius(0);\n  }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-right-radius(0);\n  }\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n  .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { .btn-xs(); }\n.btn-group-sm > .btn { .btn-sm(); }\n.btn-group-lg > .btn { .btn-lg(); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n  .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n  // 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    .clearfix();\n    > .btn {\n      float: none;\n    }\n  }\n\n  > .btn + .btn,\n  > .btn + .btn-group,\n  > .btn-group + .btn,\n  > .btn-group + .btn-group {\n    margin-top: -1px;\n    margin-left: 0;\n  }\n}\n\n.btn-group-vertical > .btn {\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n  &:first-child:not(:last-child) {\n    border-top-right-radius: @border-radius-base;\n    .border-bottom-radius(0);\n  }\n  &:last-child:not(:first-child) {\n    border-bottom-left-radius: @border-radius-base;\n    .border-top-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-bottom-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:last-child > .btn:first-child {\n  .border-top-radius(0);\n}\n\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n  > .btn,\n  > .btn-group {\n    float: none;\n    display: table-cell;\n    width: 1%;\n  }\n  > .btn-group .btn {\n    width: 100%;\n  }\n}\n\n\n// Checkbox and radio options\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  display: none;\n}\n"
  },
  {
    "path": "bower_components/bootstrap/less/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  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  &:focus {\n    .tab-focus();\n  }\n\n  &:hover,\n  &:focus {\n    color: @btn-default-color;\n    text-decoration: none;\n  }\n\n  &:active,\n  &.active {\n    outline: 0;\n    background-image: none;\n    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: not-allowed;\n    pointer-events: none; // Future-proof disabling of clicks\n    .opacity(.65);\n    .box-shadow(none);\n  }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n  .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n  .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Warning appears as orange\n.btn-warning {\n  .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n  .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n// Success appears as green\n.btn-success {\n  .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n  .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n  color: @link-color;\n  font-weight: normal;\n  cursor: pointer;\n  border-radius: 0;\n\n  &,\n  &:active,\n  &[disabled],\n  fieldset[disabled] & {\n    background-color: transparent;\n    .box-shadow(none);\n  }\n  &,\n  &:hover,\n  &:focus,\n  &:active {\n    border-color: transparent;\n  }\n  &:hover,\n  &:focus {\n    color: @link-hover-color;\n    text-decoration: underline;\n    background-color: transparent;\n  }\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus {\n      color: @btn-link-disabled-color;\n      text-decoration: none;\n    }\n  }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n  // line-height: ensure even-numbered height of button next to large input\n  .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n.btn-sm {\n  // 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  padding-left: 0;\n  padding-right: 0;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n  &.btn-block {\n    width: 100%;\n  }\n}\n"
  },
  {
    "path": "bower_components/bootstrap/less/carousel.less",
    "content": "//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n\n  > .item {\n    display: none;\n    position: relative;\n    .transition(.6s ease-in-out left);\n\n    // Account for jankitude on images\n    > img,\n    > a > img {\n      .img-responsive();\n      line-height: 1;\n    }\n  }\n\n  > .active,\n  > .next,\n  > .prev { display: block; }\n\n  > .active {\n    left: 0;\n  }\n\n  > .next,\n  > .prev {\n    position: absolute;\n    top: 0;\n    width: 100%;\n  }\n\n  > .next {\n    left: 100%;\n  }\n  > .prev {\n    left: -100%;\n  }\n  > .next.left,\n  > .prev.right {\n    left: 0;\n  }\n\n  > .active.left {\n    left: -100%;\n  }\n  > .active.right {\n    left: 100%;\n  }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: @carousel-control-width;\n  .opacity(@carousel-control-opacity);\n  font-size: @carousel-control-font-size;\n  color: @carousel-control-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  // We can't have this transition here because WebKit cancels the carousel\n  // animation if you trip this while in the middle of another animation.\n\n  // Set gradients for backgrounds\n  &.left {\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n  }\n  &.right {\n    left: auto;\n    right: 0;\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n  }\n\n  // Hover/focus state\n  &:hover,\n  &:focus {\n    outline: none;\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  }\n  .icon-next,\n  .glyphicon-chevron-right {\n    right: 50%;\n  }\n  .icon-prev,\n  .icon-next {\n    width:  20px;\n    height: 20px;\n    margin-top: -10px;\n    margin-left: -10px;\n    font-family: serif;\n  }\n\n  .icon-prev {\n    &:before {\n      content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n    }\n  }\n  .icon-next {\n    &:before {\n      content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n    }\n  }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n\n  li {\n    display: inline-block;\n    width:  10px;\n    height: 10px;\n    margin: 1px;\n    text-indent: -999px;\n    border: 1px solid @carousel-indicator-border-color;\n    border-radius: 10px;\n    cursor: pointer;\n\n    // 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    .glyphicons-chevron-left,\n    .glyphicons-chevron-right,\n    .icon-prev,\n    .icon-next {\n      width: 30px;\n      height: 30px;\n      margin-top: -15px;\n      margin-left: -15px;\n      font-size: 30px;\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": "bower_components/bootstrap/less/close.less",
    "content": "//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n  float: right;\n  font-size: (@font-size-base * 1.5);\n  font-weight: @close-font-weight;\n  line-height: 1;\n  color: @close-color;\n  text-shadow: @close-text-shadow;\n  .opacity(.2);\n\n  &:hover,\n  &:focus {\n    color: @close-color;\n    text-decoration: none;\n    cursor: pointer;\n    .opacity(.5);\n  }\n\n  // Additional properties for button version\n  // iOS requires the button element instead of an anchor tag.\n  // If you want the anchor version, it requires `href=\"#\"`.\n  button& {\n    padding: 0;\n    cursor: pointer;\n    background: transparent;\n    border: 0;\n    -webkit-appearance: none;\n  }\n}\n"
  },
  {
    "path": "bower_components/bootstrap/less/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  white-space: nowrap;\n  border-radius: @border-radius-base;\n}\n\n// Blocks of code\npre {\n  display: block;\n  padding: ((@line-height-computed - 1) / 2);\n  margin: 0 0 (@line-height-computed / 2);\n  font-size: (@font-size-base - 1); // 14px to 13px\n  line-height: @line-height-base;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: @pre-color;\n  background-color: @pre-bg;\n  border: 1px solid @pre-border-color;\n  border-radius: @border-radius-base;\n\n  // 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": "bower_components/bootstrap/less/component-animations.less",
    "content": "//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twitter/bootstrap/pull/3552.\n\n.fade {\n  opacity: 0;\n  .transition(opacity .15s linear);\n  &.in {\n    opacity: 1;\n  }\n}\n\n.collapse {\n  display: none;\n  &.in {\n    display: block;\n  }\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  .transition(height .35s ease);\n}\n"
  },
  {
    "path": "bower_components/bootstrap/less/dropdowns.less",
    "content": "//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top:   @caret-width-base solid;\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  background-color: @dropdown-bg;\n  border: 1px solid @dropdown-fallback-border; // IE8 fallback\n  border: 1px solid @dropdown-border;\n  border-radius: @border-radius-base;\n  .box-shadow(0 6px 12px rgba(0,0,0,.175));\n  background-clip: padding-box;\n\n  // Aligns the dropdown menu to right\n  &.pull-right {\n    right: 0;\n    left: auto;\n  }\n\n  // Dividers (basically an hr) within the dropdown\n  .divider {\n    .nav-divider(@dropdown-divider-bg);\n  }\n\n  // Links within the dropdown menu\n  > li > a {\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: normal;\n    line-height: @line-height-base;\n    color: @dropdown-link-color;\n    white-space: nowrap; // prevent links from randomly breaking onto new lines\n  }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: @dropdown-link-hover-color;\n    background-color: @dropdown-link-hover-bg;\n  }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-active-color;\n    text-decoration: none;\n    outline: 0;\n    background-color: @dropdown-link-active-bg;\n  }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-disabled-color;\n  }\n}\n// Nuke hover/focus effects\n.dropdown-menu > .disabled > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    background-color: transparent;\n    background-image: none; // Remove CSS gradient\n    .reset-filter();\n    cursor: not-allowed;\n  }\n}\n\n// Open state for the dropdown\n.open {\n  // Show the menu\n  > .dropdown-menu {\n    display: block;\n  }\n\n  // Remove the outline when :focus is triggered\n  > a {\n    outline: 0;\n  }\n}\n\n// Dropdown section headers\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: @font-size-small;\n  line-height: @line-height-base;\n  color: @dropdown-header-color;\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: @zindex-dropdown - 10;\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n  // Reverse the caret\n  .caret {\n    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      .pull-right > .dropdown-menu();\n    }\n  }\n}\n\n"
  },
  {
    "path": "bower_components/bootstrap/less/forms.less",
    "content": "//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: @line-height-computed;\n  font-size: (@font-size-base * 1.5);\n  line-height: inherit;\n  color: @legend-color;\n  border: 0;\n  border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\n\n// Normalize form controls\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n  .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9; /* IE8-9 */\n  line-height: normal;\n}\n\n// Set the height of select and file controls to match text inputs\ninput[type=\"file\"] {\n  display: block;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\n// Fix optgroup Firefox bug per https://github.com/twbs/bootstrap/issues/7611\nselect optgroup {\n  font-size: inherit;\n  font-style: inherit;\n  font-family: inherit;\n}\n\n// Focus for select, file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  .tab-focus();\n}\n\n// Fix for Chrome number input\n// Setting certain font-sizes causes the `I` bar to appear on hover of the bottom increment button.\n// See https://github.com/twbs/bootstrap/issues/8350 for more.\ninput[type=\"number\"] {\n  &::-webkit-outer-spin-button,\n  &::-webkit-inner-spin-button {\n    height: auto;\n  }\n}\n\n// 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  vertical-align: middle;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n  vertical-align: middle;\n  background-color: @input-bg;\n  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  //\n  // Placeholder text gets special styles because when browsers invalidate entire\n  // lines if it doesn't understand a selector/\n  .placeholder();\n\n  // Disabled and read-only inputs\n  // Note: HTML5 says that controls under a fieldset > legend:first-child won't\n  // be disabled if the fieldset is disabled. Due to implementation difficulty,\n  // we don't honor that edge case; we style them as disabled anyway.\n  &[disabled],\n  &[readonly],\n  fieldset[disabled] & {\n    cursor: not-allowed;\n    background-color: @input-bg-disabled;\n  }\n\n  // Reset height for `textarea`s\n  textarea& {\n    height: auto;\n  }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n  display: block;\n  min-height: @line-height-computed; // clear the floating input if there is no label text\n  margin-top: 10px;\n  margin-bottom: 10px;\n  padding-left: 20px;\n  vertical-align: middle;\n  label {\n    display: inline;\n    margin-bottom: 0;\n    font-weight: normal;\n    cursor: pointer;\n  }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"],\n.radio,\n.radio-inline,\n.checkbox,\n.checkbox-inline {\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: not-allowed;\n  }\n}\n\n// Form control sizing\n.input-sm {\n  .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n.input-lg {\n  .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n// Warning\n.has-warning {\n  .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n// Error\n.has-error {\n  .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n// Success\n.has-success {\n  .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n  margin-bottom: 0; // Remove default margin from `p`\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n  display: block; // account for any element using help-block\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n  // Kick in the inline\n  @media (min-width: @screen-sm) {\n    // Inline-block all the things for \"inline\"\n    .form-group  {\n      display: inline-block;\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // In navbar-form, allow folks to *not* use `.form-group`\n    .form-control {\n      display: inline-block;\n    }\n\n    // Override `width: 100%;` when not within a `.form-group`\n    select.form-control {\n      width: auto;\n    }\n\n    // Remove default margin on radios/checkboxes that were used for stacking, and\n    // then undo the floating of radios and checkboxes to match (which also avoids\n    // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).\n    .radio,\n    .checkbox {\n      display: inline-block;\n      margin-top: 0;\n      margin-bottom: 0;\n      padding-left: 0;\n    }\n    .radio input[type=\"radio\"],\n    .checkbox input[type=\"checkbox\"] {\n      float: none;\n      margin-left: 0;\n    }\n  }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n  // Consistent vertical alignment of labels, radios, and checkboxes\n  .control-label,\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline {\n    margin-top: 0;\n    margin-bottom: 0;\n    padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n  }\n  // 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  .form-control-static {\n    padding-top: (@padding-base-vertical + 1);\n  }\n\n  // Only right align form labels here when the columns stop stacking\n  @media (min-width: @screen-sm-min) {\n    .control-label {\n      text-align: right;\n    }\n  }\n}\n"
  },
  {
    "path": "bower_components/bootstrap/less/glyphicons.less",
    "content": "//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n// Import the fonts\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: ~\"url('@{icon-font-path}@{icon-font-name}.eot')\";\n  src: ~\"url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype')\",\n       ~\"url('@{icon-font-path}@{icon-font-name}.woff') format('woff')\",\n       ~\"url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype')\",\n       ~\"url('@{icon-font-path}@{icon-font-name}.svg#glyphicons-halflingsregular') format('svg')\";\n}\n\n// Catchall baseclass\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n\n  &:empty {\n    width: 1em;\n  }\n}\n\n// Individual icons\n.glyphicon-asterisk               { &:before { content: \"\\2a\"; } }\n.glyphicon-plus                   { &:before { content: \"\\2b\"; } }\n.glyphicon-euro                   { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus                  { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud                  { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope               { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil                 { &:before { content: \"\\270f\"; } }\n.glyphicon-glass                  { &:before { content: \"\\e001\"; } }\n.glyphicon-music                  { &:before { content: \"\\e002\"; } }\n.glyphicon-search                 { &:before { content: \"\\e003\"; } }\n.glyphicon-heart                  { &:before { content: \"\\e005\"; } }\n.glyphicon-star                   { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty             { &:before { content: \"\\e007\"; } }\n.glyphicon-user                   { &:before { content: \"\\e008\"; } }\n.glyphicon-film                   { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large               { &:before { content: \"\\e010\"; } }\n.glyphicon-th                     { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list                { &:before { content: \"\\e012\"; } }\n.glyphicon-ok                     { &:before { content: \"\\e013\"; } }\n.glyphicon-remove                 { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in                { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out               { &:before { content: \"\\e016\"; } }\n.glyphicon-off                    { &:before { content: \"\\e017\"; } }\n.glyphicon-signal                 { &:before { content: \"\\e018\"; } }\n.glyphicon-cog                    { &:before { content: \"\\e019\"; } }\n.glyphicon-trash                  { &:before { content: \"\\e020\"; } }\n.glyphicon-home                   { &:before { content: \"\\e021\"; } }\n.glyphicon-file                   { &:before { content: \"\\e022\"; } }\n.glyphicon-time                   { &:before { content: \"\\e023\"; } }\n.glyphicon-road                   { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt           { &:before { content: \"\\e025\"; } }\n.glyphicon-download               { &:before { content: \"\\e026\"; } }\n.glyphicon-upload                 { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox                  { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle            { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat                 { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh                { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt               { &:before { content: \"\\e032\"; } }\n.glyphicon-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": "bower_components/bootstrap/less/grid.less",
    "content": "//\n// Grid system\n// --------------------------------------------------\n\n// Set the container width, and override it for fixed navbars in media queries\n.container {\n  .container-fixed();\n\n  @media (min-width: @screen-sm) {\n    width: @container-sm;\n  }\n  @media (min-width: @screen-md) {\n    width: @container-md;\n  }\n  @media (min-width: @screen-lg-min) {\n    width: @container-lg;\n  }\n}\n\n// mobile first defaults\n.row {\n  .make-row();\n}\n\n// Common styles for small and large grid columns\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-columns-float(xs);\n.make-grid(@grid-columns, xs, width);\n.make-grid(@grid-columns, xs, pull);\n.make-grid(@grid-columns, xs, push);\n.make-grid(@grid-columns, xs, offset);\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-columns-float(sm);\n  .make-grid(@grid-columns, sm, width);\n  .make-grid(@grid-columns, sm, pull);\n  .make-grid(@grid-columns, sm, push);\n  .make-grid(@grid-columns, sm, offset);\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-columns-float(md);\n  .make-grid(@grid-columns, md, width);\n  .make-grid(@grid-columns, md, pull);\n  .make-grid(@grid-columns, md, push);\n  .make-grid(@grid-columns, md, offset);\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-columns-float(lg);\n  .make-grid(@grid-columns, lg, width);\n  .make-grid(@grid-columns, lg, pull);\n  .make-grid(@grid-columns, lg, push);\n  .make-grid(@grid-columns, lg, offset);\n}\n\n"
  },
  {
    "path": "bower_components/bootstrap/less/input-groups.less",
    "content": "//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n  position: relative; // For dropdowns\n  display: table;\n  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n  // Undo padding and float of grid classes\n  &[class*=\"col-\"] {\n    float: none;\n    padding-left: 0;\n    padding-right: 0;\n  }\n\n  .form-control {\n    width: 100%;\n    margin-bottom: 0;\n  }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn { .input-lg(); }\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn { .input-sm(); }\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  font-weight: normal;\n  line-height: 1;\n  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 > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {\n  .border-right-radius(0);\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child) {\n  .border-left-radius(0);\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n  position: relative;\n  white-space: nowrap;\n\n  // Negative margin to only have a 1px border between the two\n  &:first-child > .btn {\n    margin-right: -1px;\n  }\n  &:last-child > .btn {\n    margin-left: -1px;\n  }\n}\n.input-group-btn > .btn {\n  position: relative;\n  // Jankily prevent input button groups from wrapping\n  + .btn {\n    margin-left: -4px;\n  }\n  // Bring the \"active\" button to the front\n  &:hover,\n  &:active {\n    z-index: 2;\n  }\n}\n"
  },
  {
    "path": "bower_components/bootstrap/less/jumbotron.less",
    "content": "//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n  padding: @jumbotron-padding;\n  margin-bottom: @jumbotron-padding;\n  font-size: @jumbotron-font-size;\n  font-weight: 200;\n  line-height: (@line-height-base * 1.5);\n  color: @jumbotron-color;\n  background-color: @jumbotron-bg;\n\n  h1,\n  .h1 {\n    line-height: 1;\n    color: @jumbotron-heading-color;\n  }\n  p {\n    line-height: 1.4;\n  }\n\n  .container & {\n    border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n  }\n\n  .container {\n    max-width: 100%;\n  }\n\n  @media screen and (min-width: @screen-sm-min) {\n    padding-top:    (@jumbotron-padding * 1.6);\n    padding-bottom: (@jumbotron-padding * 1.6);\n\n    .container & {\n      padding-left:  (@jumbotron-padding * 2);\n      padding-right: (@jumbotron-padding * 2);\n    }\n\n    h1,\n    .h1 {\n      font-size: (@font-size-base * 4.5);\n    }\n  }\n}\n"
  },
  {
    "path": "bower_components/bootstrap/less/labels.less",
    "content": "//\n// Labels\n// --------------------------------------------------\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: @label-color;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n\n  // Add hover effects, but only for links\n  &[href] {\n    &:hover,\n    &:focus {\n      color: @label-link-hover-color;\n      text-decoration: none;\n      cursor: pointer;\n    }\n  }\n\n  // Empty labels collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // 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": "bower_components/bootstrap/less/list-group.less",
    "content": "//\n// List groups\n// --------------------------------------------------\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n.list-group {\n  // No need to set list-style: none; since .list-group-item is block level\n  margin-bottom: 20px;\n  padding-left: 0; // reset padding because ul and ol\n}\n\n// Individual list items\n// -------------------------\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  // Place the border on the list items and negative margin up for better styling\n  margin-bottom: -1px;\n  background-color: @list-group-bg;\n  border: 1px solid @list-group-border;\n\n  // Round the first and last items\n  &:first-child {\n    .border-top-radius(@list-group-border-radius);\n  }\n  &:last-child {\n    margin-bottom: 0;\n    .border-bottom-radius(@list-group-border-radius);\n  }\n\n  // Align badges within list items\n  > .badge {\n    float: right;\n  }\n  > .badge + .badge {\n    margin-right: 5px;\n  }\n}\n\n// Linked list items\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    background-color: @list-group-hover-bg;\n  }\n\n  // Active class on item itself, not parent\n  &.active,\n  &.active:hover,\n  &.active:focus {\n    z-index: 2; // Place active items above their siblings for proper border styling\n    color: @list-group-active-color;\n    background-color: @list-group-active-bg;\n    border-color: @list-group-active-border;\n\n    // Force color to inherit for custom content\n    .list-group-item-heading {\n      color: inherit;\n    }\n    .list-group-item-text {\n      color: lighten(@list-group-active-bg, 40%);\n    }\n  }\n}\n\n// Custom content options\n// -------------------------\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n"
  },
  {
    "path": "bower_components/bootstrap/less/media.less",
    "content": "// Media objects\n// Source: http://stubbornella.org/content/?p=497\n// --------------------------------------------------\n\n\n// Common styles\n// -------------------------\n\n// Clear the floats\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n\n// Proper spacing between instances of .media\n.media,\n.media .media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n\n// For images and videos, set to block\n.media-object {\n  display: block;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n  margin: 0 0 5px;\n}\n\n\n// Media image alignment\n// -------------------------\n\n.media {\n  > .pull-left {\n    margin-right: 10px;\n  }\n  > .pull-right {\n    margin-left: 10px;\n  }\n}\n\n\n// Media list variation\n// -------------------------\n\n// Undo default ul/ol styles\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n"
  },
  {
    "path": "bower_components/bootstrap/less/mixins.less",
    "content": "//\n// Mixins\n// --------------------------------------------------\n\n\n// Utilities\n// -------------------------\n\n// Clearfix\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n//    contenteditable attribute is included anywhere else in the document.\n//    Otherwise it causes space to appear at the top and bottom of elements\n//    that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n//    `:before` to contain the top-margins of child elements.\n.clearfix() {\n  &:before,\n  &:after {\n    content: \" \"; // 1\n    display: table; // 2\n  }\n  &:after {\n    clear: both;\n  }\n}\n\n// WebKit-style focus\n.tab-focus() {\n  // Default\n  outline: thin dotted;\n  // WebKit\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n// Center-align a block level element\n.center-block() {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n\n// Sizing shortcuts\n.size(@width; @height) {\n  width: @width;\n  height: @height;\n}\n.square(@size) {\n  .size(@size; @size);\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n  &:-moz-placeholder            { color: @color; } // Firefox 4-18\n  &::-moz-placeholder           { color: @color;   // Firefox 19+\n                                  opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526\n  &:-ms-input-placeholder       { color: @color; } // Internet Explorer 10+\n  &::-webkit-input-placeholder  { color: @color; } // Safari and Chrome\n}\n\n// Text overflow\n// Requires inline-block or block for proper styling\n.text-overflow() {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n// CSS image replacement\n//\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()`. Note\n// that we cannot chain the mixins together in Less, so they are repeated.\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// New mixin to use as of v3.0.1\n.text-hide() {\n  .hide-text();\n}\n\n\n\n// CSS3 PROPERTIES\n// --------------------------------------------------\n\n// Single side border-radius\n.border-top-radius(@radius) {\n  border-top-right-radius: @radius;\n   border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n  border-bottom-right-radius: @radius;\n     border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n  border-bottom-right-radius: @radius;\n   border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n  border-bottom-left-radius: @radius;\n     border-top-left-radius: @radius;\n}\n\n// Drop shadows\n.box-shadow(@shadow) {\n  -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n          box-shadow: @shadow;\n}\n\n// Transitions\n.transition(@transition) {\n  -webkit-transition: @transition;\n          transition: @transition;\n}\n.transition-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-transform(@transition) {\n  -webkit-transition: -webkit-transform @transition;\n     -moz-transition: -moz-transform @transition;\n       -o-transition: -o-transform @transition;\n          transition: transform @transition;\n}\n\n// Transformations\n.rotate(@degrees) {\n  -webkit-transform: rotate(@degrees);\n      -ms-transform: rotate(@degrees); // IE9+\n          transform: rotate(@degrees);\n}\n.scale(@ratio) {\n  -webkit-transform: scale(@ratio);\n      -ms-transform: scale(@ratio); // IE9+\n          transform: scale(@ratio);\n}\n.translate(@x; @y) {\n  -webkit-transform: translate(@x, @y);\n      -ms-transform: translate(@x, @y); // IE9+\n          transform: translate(@x, @y);\n}\n.skew(@x; @y) {\n  -webkit-transform: skew(@x, @y);\n      -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n          transform: skew(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n  -webkit-transform: translate3d(@x, @y, @z);\n          transform: translate3d(@x, @y, @z);\n}\n\n.rotateX(@degrees) {\n  -webkit-transform: rotateX(@degrees);\n      -ms-transform: rotateX(@degrees); // IE9+\n          transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n  -webkit-transform: rotateY(@degrees);\n      -ms-transform: rotateY(@degrees); // IE9+\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          transform-origin: @origin;\n}\n\n// Animations\n.animation(@animation) {\n  -webkit-animation: @animation;\n          animation: @animation;\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.backface-visibility(@visibility){\n  -webkit-backface-visibility: @visibility;\n     -moz-backface-visibility: @visibility;\n          backface-visibility: @visibility;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n  -webkit-box-sizing: @boxmodel;\n     -moz-box-sizing: @boxmodel;\n          box-sizing: @boxmodel;\n}\n\n// User select\n// For selecting text on the page\n.user-select(@select) {\n  -webkit-user-select: @select;\n     -moz-user-select: @select;\n      -ms-user-select: @select; // IE10+\n       -o-user-select: @select;\n          user-select: @select;\n}\n\n// Resize anything\n.resizable(@direction) {\n  resize: @direction; // Options: horizontal, vertical, both\n  overflow: auto; // Safari fix\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n  -webkit-column-count: @column-count;\n     -moz-column-count: @column-count;\n          column-count: @column-count;\n  -webkit-column-gap: @column-gap;\n     -moz-column-gap: @column-gap;\n          column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n  word-wrap: break-word;\n  -webkit-hyphens: @mode;\n     -moz-hyphens: @mode;\n      -ms-hyphens: @mode; // IE10+\n       -o-hyphens: @mode;\n          hyphens: @mode;\n}\n\n// Opacity\n.opacity(@opacity) {\n  opacity: @opacity;\n  // IE8 filter\n  @opacity-ie: (@opacity * 100);\n  filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n\n\n\n// GRADIENTS\n// --------------------------------------------------\n\n#gradient {\n\n  // Horizontal gradient, from left to right\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(left, color-stop(@start-color @start-percent), color-stop(@end-color @end-percent)); // Safari 5.1-6, Chrome 10+\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: 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: 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: 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: 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: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n  }\n}\n\n// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n.reset-filter() {\n  filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n\n\n\n// Retina images\n//\n// Short retina mixin for setting background-image and -size\n\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n  background-image: url(\"@{file-1x}\");\n\n  @media\n  only screen and (-webkit-min-device-pixel-ratio: 2),\n  only screen and (   min--moz-device-pixel-ratio: 2),\n  only screen and (     -o-min-device-pixel-ratio: 2/1),\n  only screen and (        min-device-pixel-ratio: 2),\n  only screen and (                min-resolution: 192dpi),\n  only screen and (                min-resolution: 2dppx) {\n    background-image: url(\"@{file-2x}\");\n    background-size: @width-1x @height-1x;\n  }\n}\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n.img-responsive(@display: block;) {\n  display: @display;\n  max-width: 100%; // Part 1: Set a maximum relative to the parent\n  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// COMPONENT MIXINS\n// --------------------------------------------------\n\n// Horizontal dividers\n// -------------------------\n// Dividers (basically an hr) within dropdowns and nav lists\n.nav-divider(@color: #e5e5e5) {\n  height: 1px;\n  margin: ((@line-height-computed / 2) - 1) 0;\n  overflow: hidden;\n  background-color: @color;\n}\n\n// Panels\n// -------------------------\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n  border-color: @border;\n\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  }\n  & > .panel-footer {\n    + .panel-collapse .panel-body {\n      border-bottom-color: @border;\n    }\n  }\n}\n\n// Alerts\n// -------------------------\n.alert-variant(@background; @border; @text-color) {\n  background-color: @background;\n  border-color: @border;\n  color: @text-color;\n\n  hr {\n    border-top-color: darken(@border, 5%);\n  }\n  .alert-link {\n    color: darken(@text-color, 10%);\n  }\n}\n\n// Tables\n// -------------------------\n.table-row-variant(@state; @background) {\n  // Exact selectors below required to override `.table-striped` and prevent\n  // inheritance to nested tables.\n  .table {\n    > thead,\n    > tbody,\n    > tfoot {\n      > tr > .@{state},\n      > .@{state} > td,\n      > .@{state} > th {\n        background-color: @background;\n      }\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 {\n    > tr > .@{state}:hover,\n    > .@{state}:hover > td,\n    > .@{state}:hover > th {\n      background-color: darken(@background, 5%);\n    }\n  }\n}\n\n// Button variants\n// -------------------------\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n.button-variant(@color; @background; @border) {\n  color: @color;\n  background-color: @background;\n  border-color: @border;\n\n  &:hover,\n  &:focus,\n  &:active,\n  &.active,\n  .open .dropdown-toggle& {\n    color: @color;\n    background-color: darken(@background, 8%);\n        border-color: darken(@border, 12%);\n  }\n  &:active,\n  &.active,\n  .open .dropdown-toggle& {\n    background-image: none;\n  }\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    &,\n    &:hover,\n    &:focus,\n    &:active,\n    &.active {\n      background-color: @background;\n          border-color: @border;\n    }\n  }\n\n  .badge {\n    color: @background;\n    background-color: #fff;\n  }\n}\n\n// Button sizes\n// -------------------------\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n  padding: @padding-vertical @padding-horizontal;\n  font-size: @font-size;\n  line-height: @line-height;\n  border-radius: @border-radius;\n}\n\n// Pagination\n// -------------------------\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {\n  > li {\n    > a,\n    > span {\n      padding: @padding-vertical @padding-horizontal;\n      font-size: @font-size;\n    }\n    &:first-child {\n      > a,\n      > span {\n        .border-left-radius(@border-radius);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        .border-right-radius(@border-radius);\n      }\n    }\n  }\n}\n\n// Labels\n// -------------------------\n.label-variant(@color) {\n  background-color: @color;\n  &[href] {\n    &:hover,\n    &:focus {\n      background-color: darken(@color, 10%);\n    }\n  }\n}\n\n// Navbar vertical align\n// -------------------------\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n.navbar-vertical-align(@element-height) {\n  margin-top: ((@navbar-height - @element-height) / 2);\n  margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n\n// Progress bars\n// -------------------------\n.progress-bar-variant(@color) {\n  background-color: @color;\n  .progress-striped & {\n    #gradient > .striped();\n  }\n}\n\n// Responsive utilities\n// -------------------------\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n  display: block !important;\n  table&  { display: table; }\n  tr&     { display: table-row !important; }\n  th&,\n  td&     { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n    &,\n  tr&,\n  th&,\n  td& { display: none !important; }\n}\n\n\n// Grid System\n// -----------\n\n// Centered container element\n.container-fixed() {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left:  (@grid-gutter-width / 2);\n  padding-right: (@grid-gutter-width / 2);\n  .clearfix();\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n  margin-left:  (@gutter / -2);\n  margin-right: (@gutter / -2);\n  .clearfix();\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  float: left;\n  width: percentage((@columns / @grid-columns));\n  // Prevent columns from collapsing when empty\n  min-height: 1px;\n  // Inner gutter via padding\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  // Prevent columns from collapsing when empty\n  min-height: 1px;\n  // Inner gutter via padding\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  // Calculate width based on number of columns available\n  @media (min-width: @screen-sm-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the small column offsets\n.make-sm-column-offset(@columns) {\n  @media (min-width: @screen-sm-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  // Prevent columns from collapsing when empty\n  min-height: 1px;\n  // Inner gutter via padding\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  // Calculate width based on number of columns available\n  @media (min-width: @screen-md-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the medium column offsets\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) {\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  // Prevent columns from collapsing when empty\n  min-height: 1px;\n  // Inner gutter via padding\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  // Calculate width based on number of columns available\n  @media (min-width: @screen-lg-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the large column offsets\n.make-lg-column-offset(@columns) {\n  @media (min-width: @screen-lg-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\n\n// 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.make-grid-columns-float(@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(@index, @class, @type) when (@type = width) and (@index > 0) {\n  .col-@{class}-@{index} {\n    width: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid(@index, @class, @type) when (@type = push) {\n  .col-@{class}-push-@{index} {\n    left: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid(@index, @class, @type) when (@type = pull) {\n  .col-@{class}-pull-@{index} {\n    right: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid(@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.make-grid(@index, @class, @type) when (@index >= 0) {\n  .calc-grid(@index, @class, @type);\n  // next iteration\n  .make-grid(@index - 1, @class, @type);\n}\n\n\n// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n  // Color the label and help text\n  .help-block,\n  .control-label,\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline  {\n    color: @text-color;\n  }\n  // Set the border and box shadow on specific inputs to match\n  .form-control {\n    border-color: @border-color;\n    .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n    &:focus {\n      border-color: darken(@border-color, 10%);\n      @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n      .box-shadow(@shadow);\n    }\n  }\n  // Set validation states also for addons\n  .input-group-addon {\n    color: @text-color;\n    border-color: @border-color;\n    background-color: @background-color;\n  }\n}\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-focus-border` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n\n.form-control-focus(@color: @input-border-focus) {\n  @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n  &:focus {\n    border-color: @color;\n    outline: 0;\n    .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n  }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n  height: @input-height;\n  padding: @padding-vertical @padding-horizontal;\n  font-size: @font-size;\n  line-height: @line-height;\n  border-radius: @border-radius;\n\n  select& {\n    height: @input-height;\n    line-height: @input-height;\n  }\n\n  textarea& {\n    height: auto;\n  }\n}\n"
  },
  {
    "path": "bower_components/bootstrap/less/modals.less",
    "content": "//\n// Modals\n// --------------------------------------------------\n\n// .modal-open      - body class for killing the scroll\n// .modal           - container to scroll within\n// .modal-dialog    - positioning shell for the actual modal\n// .modal-content   - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n  overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n  display: none;\n  overflow: auto;\n  overflow-y: scroll;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: @zindex-modal-background;\n\n  // When fading in the modal, animate it to slide down\n  &.fade .modal-dialog {\n    .translate(0, -25%);\n    .transition-transform(~\"0.3s ease-out\");\n  }\n  &.in .modal-dialog { .translate(0, 0)}\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n  z-index: (@zindex-modal-background + 10);\n}\n\n// Actual modal\n.modal-content {\n  position: relative;\n  background-color: @modal-content-bg;\n  border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n  border: 1px solid @modal-content-border-color;\n  border-radius: @border-radius-large;\n  .box-shadow(0 3px 9px rgba(0,0,0,.5));\n  background-clip: padding-box;\n  // Remove focus outline from opened modal\n  outline: none;\n}\n\n// Modal background\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: (@zindex-modal-background - 10);\n  background-color: @modal-backdrop-bg;\n  // Fade for backdrop\n  &.fade { .opacity(0); }\n  &.in { .opacity(.5); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n  padding: @modal-title-padding;\n  border-bottom: 1px solid @modal-header-border-color;\n  min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n  margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n  margin: 0;\n  line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n  position: relative;\n  padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n  margin-top: 15px;\n  padding: (@modal-inner-padding - 1) @modal-inner-padding @modal-inner-padding;\n  text-align: right; // right align buttons\n  border-top: 1px solid @modal-footer-border-color;\n  .clearfix(); // clear it in case folks use .pull-* classes on buttons\n\n  // Properly space out buttons\n  .btn + .btn {\n    margin-left: 5px;\n    margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n  }\n  // but override that for button groups\n  .btn-group .btn + .btn {\n    margin-left: -1px;\n  }\n  // and override it for block buttons as well\n  .btn-block + .btn-block {\n    margin-left: 0;\n  }\n}\n\n// Scale up the modal\n@media screen and (min-width: @screen-sm-min) {\n\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    .box-shadow(0 5px 15px rgba(0,0,0,.5));\n  }\n\n}\n"
  },
  {
    "path": "bower_components/bootstrap/less/navbar.less",
    "content": "//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n  position: relative;\n  min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n  margin-bottom: @navbar-margin-bottom;\n  border: 1px solid transparent;\n\n  // Prevent floats from breaking the navbar\n  .clearfix();\n\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: @navbar-border-radius;\n  }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n  .clearfix();\n\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n  }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n  max-height: 340px;\n  overflow-x: visible;\n  padding-right: @navbar-padding-horizontal;\n  padding-left:  @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n  .clearfix();\n  -webkit-overflow-scrolling: touch;\n\n  &.in {\n    overflow-y: auto;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n\n    &.collapse {\n      display: block !important;\n      height: auto !important;\n      padding-bottom: 0; // Override default setting\n      overflow: visible !important;\n    }\n\n    &.in {\n      overflow-y: visible;\n    }\n\n    // 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\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container > .navbar-header,\n.container > .navbar-collapse {\n  margin-right: -@navbar-padding-horizontal;\n  margin-left:  -@navbar-padding-horizontal;\n\n  @media (min-width: @grid-float-breakpoint) {\n    margin-right: 0;\n    margin-left:  0;\n  }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the 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\n  &:hover,\n  &:focus {\n    text-decoration: none;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    .navbar > .container & {\n      margin-left: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: @navbar-padding-horizontal;\n  padding: 9px 10px;\n  .navbar-vertical-align(34px);\n  background-color: transparent;\n  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  // Bars\n  .icon-bar {\n    display: block;\n    width: 22px;\n    height: 2px;\n    border-radius: 1px;\n  }\n  .icon-bar + .icon-bar {\n    margin-top: 4px;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    display: none;\n  }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with it's own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n  margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n  > li > a {\n    padding-top:    10px;\n    padding-bottom: 10px;\n    line-height: @line-height-computed;\n  }\n\n  @media (max-width: @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    &.navbar-right:last-child {\n      margin-right: -@navbar-padding-horizontal;\n    }\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@media (min-width: @grid-float-breakpoint) {\n  .navbar-left  { .pull-left(); }\n  .navbar-right { .pull-right(); }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n  margin-left: -@navbar-padding-horizontal;\n  margin-right: -@navbar-padding-horizontal;\n  padding: 10px @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n  .box-shadow(@shadow);\n\n  // Mixin behavior for optimum display\n  .form-inline();\n\n  .form-group {\n    @media (max-width: @grid-float-breakpoint-max) {\n      margin-bottom: 5px;\n    }\n  }\n\n  // Vertically center in expanded, horizontal navbar\n  .navbar-vertical-align(@input-height-base);\n\n  // Undo 100% width for pull classes\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    .box-shadow(none);\n\n    // Outdent the form if last child to line up with content down the page\n    &.navbar-right:last-child {\n      margin-right: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  .border-bottom-radius(0);\n}\n\n// Right aligned menus need alt position\n.navbar-nav.pull-right > li > .dropdown-menu,\n.navbar-nav > li > .dropdown-menu.pull-right {\n  left: auto;\n  right: 0;\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n  .navbar-vertical-align(@input-height-base);\n\n  &.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    // Outdent the form if last child to line up with content down the page\n    &.navbar-right:last-child {\n      margin-right: 0;\n    }\n  }\n}\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  background-color: @navbar-default-bg;\n  border-color: @navbar-default-border;\n\n  .navbar-brand {\n    color: @navbar-default-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-default-brand-hover-color;\n      background-color: @navbar-default-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-default-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-default-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-hover-color;\n        background-color: @navbar-default-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-active-color;\n        background-color: @navbar-default-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-disabled-color;\n        background-color: @navbar-default-link-disabled-bg;\n      }\n    }\n  }\n\n  .navbar-toggle {\n    border-color: @navbar-default-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-default-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-default-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: @navbar-default-border;\n  }\n\n  // Dropdown menu items\n  .navbar-nav {\n    // Remove background color from open dropdown\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-default-link-active-bg;\n        color: @navbar-default-link-active-color;\n      }\n    }\n\n    @media (max-width: @grid-float-breakpoint-max) {\n      // Dropdowns get custom display when collapsed\n      .open .dropdown-menu {\n        > li > a {\n          color: @navbar-default-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-hover-color;\n            background-color: @navbar-default-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-active-color;\n            background-color: @navbar-default-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-disabled-color;\n            background-color: @navbar-default-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n\n  // Links in navbars\n  //\n  // Add a class to ensure links outside the navbar nav are colored correctly.\n\n  .navbar-link {\n    color: @navbar-default-link-color;\n    &:hover {\n      color: @navbar-default-link-hover-color;\n    }\n  }\n\n}\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}\n"
  },
  {
    "path": "bower_components/bootstrap/less/navs.less",
    "content": "//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n  margin-bottom: 0;\n  padding-left: 0; // Override default ul/ol\n  list-style: none;\n  .clearfix();\n\n  > li {\n    position: relative;\n    display: block;\n\n    > a {\n      position: relative;\n      display: block;\n      padding: @nav-link-padding;\n      &:hover,\n      &:focus {\n        text-decoration: none;\n        background-color: @nav-link-hover-bg;\n      }\n    }\n\n    // Disabled state sets text to gray and nukes hover/tab effects\n    &.disabled > a {\n      color: @nav-disabled-link-color;\n\n      &:hover,\n      &:focus {\n        color: @nav-disabled-link-hover-color;\n        text-decoration: none;\n        background-color: transparent;\n        cursor: not-allowed;\n      }\n    }\n  }\n\n  // Open dropdowns\n  .open > a {\n    &,\n    &:hover,\n    &:focus {\n      background-color: @nav-link-hover-bg;\n      border-color: @link-color;\n    }\n  }\n\n  // 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 it's :hover to override normal :hover\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-tabs-active-link-hover-color;\n        background-color: @nav-tabs-active-link-hover-bg;\n        border: 1px solid @nav-tabs-active-link-hover-border-color;\n        border-bottom-color: transparent;\n        cursor: default;\n      }\n    }\n  }\n  // pulling this in mainly for less shorthand\n  &.nav-justified {\n    .nav-justified();\n    .nav-tabs-justified();\n  }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n  > li {\n    float: left;\n\n    // Links rendered as pills\n    > a {\n      border-radius: @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  }\n  > .active {\n    display: block;\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": "bower_components/bootstrap/less/normalize.less",
    "content": "/*! normalize.css v2.1.3 | MIT License | git.io/normalize */\n\n// ==========================================================================\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined in IE 8/9.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\n//\n// Correct `inline-block` display not defined in IE 8/9.\n//\n\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9.\n// Hide the `template` element in IE, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n  display: none;\n}\n\n// ==========================================================================\n// Base\n// ==========================================================================\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS text size adjust after orientation change, without disabling\n//    user zoom.\n//\n\nhtml {\n  font-family: sans-serif; // 1\n  -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// ==========================================================================\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n  background: transparent;\n}\n\n//\n// Address `outline` inconsistency between Chrome and other browsers.\n//\n\na:focus {\n  outline: thin dotted;\n}\n\n//\n// Improve readability when focused and also mouse hovered in all browsers.\n//\n\na:active,\na:hover {\n  outline: 0;\n}\n\n// ==========================================================================\n// Typography\n// ==========================================================================\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari 5, and Chrome.\n//\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9, Safari 5, and Chrome.\n//\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.\n//\n\nb,\nstrong {\n  font-weight: bold;\n}\n\n//\n// Address styling not present in Safari 5 and Chrome.\n//\n\ndfn {\n  font-style: italic;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  height: 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n  background: #ff0;\n  color: #000;\n}\n\n//\n// Correct font family set oddly in Safari 5 and Chrome.\n//\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, serif;\n  font-size: 1em;\n}\n\n//\n// Improve readability of pre-formatted text in all browsers.\n//\n\npre {\n  white-space: pre-wrap;\n}\n\n//\n// Set consistent quote types.\n//\n\nq {\n  quotes: \"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\";\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n  font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\n// ==========================================================================\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9.\n//\n\nimg {\n  border: 0;\n}\n\n//\n// Correct overflow displayed oddly in IE 9.\n//\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\n// ==========================================================================\n// Figures\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari 5.\n//\n\nfigure {\n  margin: 0;\n}\n\n// ==========================================================================\n// Forms\n// ==========================================================================\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n  border: 0; // 1\n  padding: 0; // 2\n}\n\n//\n// 1. Correct font family not being inherited in all browsers.\n// 2. Correct font size not being inherited in all browsers.\n// 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.\n//\n\nbutton,\ninput,\nselect,\ntextarea {\n  font-family: inherit; // 1\n  font-size: 100%; // 2\n  margin: 0; // 3\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\nbutton,\ninput {\n  line-height: normal;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+.\n// Correct `select` style inheritance in Firefox 4+ and Opera.\n//\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n//    and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n//    `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button; // 2\n  cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/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// 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome\n//    (include `-moz` to future-proof).\n//\n\ninput[type=\"search\"] {\n  -webkit-appearance: textfield; // 1\n  -moz-box-sizing: content-box;\n  -webkit-box-sizing: content-box; // 2\n  box-sizing: content-box;\n}\n\n//\n// Remove inner padding and search cancel button in Safari 5 and Chrome\n// on OS X.\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\n\n//\n// 1. Remove default vertical scrollbar in IE 8/9.\n// 2. Improve readability and alignment in all browsers.\n//\n\ntextarea {\n  overflow: auto; // 1\n  vertical-align: top; // 2\n}\n\n// ==========================================================================\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n"
  },
  {
    "path": "bower_components/bootstrap/less/pager.less",
    "content": "//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  list-style: none;\n  text-align: center;\n  .clearfix();\n  li {\n    display: inline;\n    > a,\n    > span {\n      display: inline-block;\n      padding: 5px 14px;\n      background-color: @pagination-bg;\n      border: 1px solid @pagination-border;\n      border-radius: @pager-border-radius;\n    }\n\n    > a:hover,\n    > a:focus {\n      text-decoration: none;\n      background-color: @pagination-hover-bg;\n    }\n  }\n\n  .next {\n    > a,\n    > span {\n      float: right;\n    }\n  }\n\n  .previous {\n    > a,\n    > span {\n      float: left;\n    }\n  }\n\n  .disabled {\n    > a,\n    > a:hover,\n    > a:focus,\n    > span {\n      color: @pager-disabled-color;\n      background-color: @pagination-bg;\n      cursor: not-allowed;\n    }\n  }\n\n}\n"
  },
  {
    "path": "bower_components/bootstrap/less/pagination.less",
    "content": "//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  border-radius: @border-radius-base;\n\n  > li {\n    display: inline; // Remove list-style and block-level defaults\n    > a,\n    > span {\n      position: relative;\n      float: left; // Collapse white-space\n      padding: @padding-base-vertical @padding-base-horizontal;\n      line-height: @line-height-base;\n      text-decoration: none;\n      background-color: @pagination-bg;\n      border: 1px solid @pagination-border;\n      margin-left: -1px;\n    }\n    &:first-child {\n      > a,\n      > span {\n        margin-left: 0;\n        .border-left-radius(@border-radius-base);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        .border-right-radius(@border-radius-base);\n      }\n    }\n  }\n\n  > li > a,\n  > li > span {\n    &:hover,\n    &:focus {\n      background-color: @pagination-hover-bg;\n    }\n  }\n\n  > .active > a,\n  > .active > span {\n    &,\n    &:hover,\n    &:focus {\n      z-index: 2;\n      color: @pagination-active-color;\n      background-color: @pagination-active-bg;\n      border-color: @pagination-active-bg;\n      cursor: default;\n    }\n  }\n\n  > .disabled {\n    > span,\n    > span:hover,\n    > span:focus,\n    > a,\n    > a:hover,\n    > a:focus {\n      color: @pagination-disabled-color;\n      background-color: @pagination-bg;\n      border-color: @pagination-border;\n      cursor: not-allowed;\n    }\n  }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n  .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n  .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);\n}\n"
  },
  {
    "path": "bower_components/bootstrap/less/panels.less",
    "content": "//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n  margin-bottom: @line-height-computed;\n  background-color: @panel-bg;\n  border: 1px solid transparent;\n  border-radius: @panel-border-radius;\n  .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n  padding: 15px;\n  .clearfix();\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n  > .list-group {\n    margin-bottom: 0;\n\n    .list-group-item {\n      border-width: 1px 0;\n\n      // Remove border radius for top one\n      &:first-child {\n        .border-top-radius(0);\n      }\n      // But keep it for the last one\n      &:last-child {\n        border-bottom: 0;\n      }\n    }\n  }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n  .list-group-item:first-child {\n    border-top-width: 0;\n  }\n}\n\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n  > .table,\n  > .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  > .panel-body + .table,\n  > .panel-body + .table-responsive {\n    border-top: 1px solid @table-border-color;\n  }\n  > .table > tbody:first-child th,\n  > .table > tbody: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        &:last-child > th,\n        &:last-child > td {\n          border-bottom: 0;\n        }\n      }\n    }\n  }\n  > .table-responsive {\n    border: 0;\n    margin-bottom: 0;\n  }\n}\n\n\n// Optional heading\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  .border-top-radius(@panel-border-radius - 1);\n\n  > .dropdown .dropdown-toggle {\n    color: inherit;\n  }\n}\n\n// Within heading, strip any `h*` tag of it's default margins for spacing.\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: ceil((@font-size-base * 1.125));\n  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: 10px 15px;\n  background-color: @panel-footer-bg;\n  border-top: 1px solid @panel-inner-border;\n  .border-bottom-radius(@panel-border-radius - 1);\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n  // Tighten up margin so it's only between panels\n  .panel {\n    margin-bottom: 0;\n    border-radius: @panel-border-radius;\n    overflow: hidden; // crop contents when collapsed\n    + .panel {\n      margin-top: 5px;\n    }\n  }\n\n  .panel-heading {\n    border-bottom: 0;\n    + .panel-collapse .panel-body {\n      border-top: 1px solid @panel-inner-border;\n    }\n  }\n  .panel-footer {\n    border-top: 0;\n    + .panel-collapse .panel-body {\n      border-bottom: 1px solid @panel-inner-border;\n    }\n  }\n}\n\n\n// Contextual variations\n.panel-default {\n  .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n  .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n  .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-warning {\n  .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n  .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n.panel-info {\n  .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n"
  },
  {
    "path": "bower_components/bootstrap/less/popovers.less",
    "content": "//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: @zindex-popover;\n  display: none;\n  max-width: @popover-max-width;\n  padding: 1px;\n  text-align: left; // Reset given new insertion method\n  background-color: @popover-bg;\n  background-clip: padding-box;\n  border: 1px solid @popover-fallback-border-color;\n  border: 1px solid @popover-border-color;\n  border-radius: @border-radius-large;\n  .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n  // Overrides for proper insertion\n  white-space: normal;\n\n  // Offset the popover to account for the popover arrow\n  &.top     { margin-top: -10px; }\n  &.right   { margin-left: 10px; }\n  &.bottom  { margin-top: 10px; }\n  &.left    { margin-left: -10px; }\n}\n\n.popover-title {\n  margin: 0; // reset heading margin\n  padding: 8px 14px;\n  font-size: @font-size-base;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: @popover-title-bg;\n  border-bottom: 1px solid darken(@popover-title-bg, 5%);\n  border-radius: 5px 5px 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover .arrow {\n  &,\n  &:after {\n    position: absolute;\n    display: block;\n    width: 0;\n    height: 0;\n    border-color: transparent;\n    border-style: solid;\n  }\n}\n.popover .arrow {\n  border-width: @popover-arrow-outer-width;\n}\n.popover .arrow:after {\n  border-width: @popover-arrow-width;\n  content: \"\";\n}\n\n.popover {\n  &.top .arrow {\n    left: 50%;\n    margin-left: -@popover-arrow-outer-width;\n    border-bottom-width: 0;\n    border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-top-color: @popover-arrow-outer-color;\n    bottom: -@popover-arrow-outer-width;\n    &:after {\n      content: \" \";\n      bottom: 1px;\n      margin-left: -@popover-arrow-width;\n      border-bottom-width: 0;\n      border-top-color: @popover-arrow-color;\n    }\n  }\n  &.right .arrow {\n    top: 50%;\n    left: -@popover-arrow-outer-width;\n    margin-top: -@popover-arrow-outer-width;\n    border-left-width: 0;\n    border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-right-color: @popover-arrow-outer-color;\n    &:after {\n      content: \" \";\n      left: 1px;\n      bottom: -@popover-arrow-width;\n      border-left-width: 0;\n      border-right-color: @popover-arrow-color;\n    }\n  }\n  &.bottom .arrow {\n    left: 50%;\n    margin-left: -@popover-arrow-outer-width;\n    border-top-width: 0;\n    border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-bottom-color: @popover-arrow-outer-color;\n    top: -@popover-arrow-outer-width;\n    &:after {\n      content: \" \";\n      top: 1px;\n      margin-left: -@popover-arrow-width;\n      border-top-width: 0;\n      border-bottom-color: @popover-arrow-color;\n    }\n  }\n\n  &.left .arrow {\n    top: 50%;\n    right: -@popover-arrow-outer-width;\n    margin-top: -@popover-arrow-outer-width;\n    border-right-width: 0;\n    border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-left-color: @popover-arrow-outer-color;\n    &:after {\n      content: \" \";\n      right: 1px;\n      border-right-width: 0;\n      border-left-color: @popover-arrow-color;\n      bottom: -@popover-arrow-width;\n    }\n  }\n\n}\n"
  },
  {
    "path": "bower_components/bootstrap/less/print.less",
    "content": "//\n// Basic print styles\n// --------------------------------------------------\n// Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css\n\n@media print {\n\n  * {\n    text-shadow: none !important;\n    color: #000 !important; // Black prints faster: h5bp.com/s\n    background: transparent !important;\n    box-shadow: none !important;\n  }\n\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n\n  // Don't show links for images, or javascript/internal links\n  a[href^=\"javascript:\"]:after,\n  a[href^=\"#\"]:after {\n    content: \"\";\n  }\n\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n\n  thead {\n    display: table-header-group; // h5bp.com/t\n  }\n\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n\n  img {\n    max-width: 100% !important;\n  }\n\n  @page {\n    margin: 2cm .5cm;\n  }\n\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n\n  // 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  .table {\n    td,\n    th {\n      background-color: #fff !important;\n    }\n  }\n  .btn,\n  .dropup > .btn {\n    > .caret {\n      border-top-color: #000 !important;\n    }\n  }\n  .label {\n    border: 1px solid #000;\n  }\n\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table-bordered {\n    th,\n    td {\n      border: 1px solid #ddd !important;\n    }\n  }\n\n}\n"
  },
  {
    "path": "bower_components/bootstrap/less/progress-bars.less",
    "content": "//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n  overflow: hidden;\n  height: @line-height-computed;\n  margin-bottom: @line-height-computed;\n  background-color: @progress-bg;\n  border-radius: @border-radius-base;\n  .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: @font-size-small;\n  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.progress-striped .progress-bar {\n  #gradient > .striped();\n  background-size: 40px 40px;\n}\n\n// Call animation for the active one\n.progress.active .progress-bar {\n  .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n  .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n  .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n  .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n  .progress-bar-variant(@progress-bar-danger-bg);\n}\n"
  },
  {
    "path": "bower_components/bootstrap/less/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/#browsers\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\n.visible-xs {\n  .responsive-invisibility();\n  @media (max-width: @screen-xs-max) {\n    .responsive-visibility();\n  }\n  &.visible-sm {\n    @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n      .responsive-visibility();\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-lg {\n    @media (min-width: @screen-lg-min) {\n      .responsive-visibility();\n    }\n  }\n}\n.visible-sm {\n  .responsive-invisibility();\n  &.visible-xs {\n    @media (max-width: @screen-xs-max) {\n      .responsive-visibility();\n    }\n  }\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    .responsive-visibility();\n  }\n  &.visible-md {\n    @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n      .responsive-visibility();\n    }\n  }\n  &.visible-lg {\n    @media (min-width: @screen-lg-min) {\n      .responsive-visibility();\n    }\n  }\n}\n.visible-md {\n  .responsive-invisibility();\n  &.visible-xs {\n    @media (max-width: @screen-xs-max) {\n      .responsive-visibility();\n    }\n  }\n  &.visible-sm {\n    @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n      .responsive-visibility();\n    }\n  }\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    .responsive-visibility();\n  }\n  &.visible-lg {\n    @media (min-width: @screen-lg-min) {\n      .responsive-visibility();\n    }\n  }\n}\n.visible-lg {\n  .responsive-invisibility();\n  &.visible-xs {\n    @media (max-width: @screen-xs-max) {\n      .responsive-visibility();\n    }\n  }\n  &.visible-sm {\n    @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n      .responsive-visibility();\n    }\n  }\n  &.visible-md {\n    @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n      .responsive-visibility();\n    }\n  }\n  @media (min-width: @screen-lg-min) {\n    .responsive-visibility();\n  }\n}\n\n.hidden-xs {\n  .responsive-visibility();\n  @media (max-width: @screen-xs-max) {\n    .responsive-invisibility();\n  }\n  &.hidden-sm {\n    @media (min-width: @screen-sm-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.hidden-sm {\n  .responsive-visibility();\n  &.hidden-xs {\n    @media (max-width: @screen-xs-max) {\n      .responsive-invisibility();\n    }\n  }\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    .responsive-invisibility();\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.hidden-md {\n  .responsive-visibility();\n  &.hidden-xs {\n    @media (max-width: @screen-xs-max) {\n      .responsive-invisibility();\n    }\n  }\n  &.hidden-sm {\n    @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n      .responsive-invisibility();\n    }\n  }\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    .responsive-invisibility();\n  }\n  &.hidden-lg {\n    @media (min-width: @screen-lg-min) {\n      .responsive-invisibility();\n    }\n  }\n}\n.hidden-lg {\n  .responsive-visibility();\n  &.hidden-xs {\n    @media (max-width: @screen-xs-max) {\n      .responsive-invisibility();\n    }\n  }\n  &.hidden-sm {\n    @media (min-width: @screen-sm-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  @media (min-width: @screen-lg-min) {\n    .responsive-invisibility();\n  }\n}\n\n// Print utilities\n.visible-print {\n  .responsive-invisibility();\n}\n\n@media print {\n  .visible-print {\n    .responsive-visibility();\n  }\n  .hidden-print {\n    .responsive-invisibility();\n  }\n}\n"
  },
  {
    "path": "bower_components/bootstrap/less/scaffolding.less",
    "content": "//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n\n*,\n*:before,\n*:after {\n  .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n  font-size: 62.5%;\n  -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n  font-family: @font-family-base;\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @text-color;\n  background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\n\n// Links\n\na {\n  color: @link-color;\n  text-decoration: none;\n\n  &:hover,\n  &:focus {\n    color: @link-hover-color;\n    text-decoration: underline;\n  }\n\n  &:focus {\n    .tab-focus();\n  }\n}\n\n\n// Images\n\nimg {\n  vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n  .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n  border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n  padding: @thumbnail-padding;\n  line-height: @line-height-base;\n  background-color: @thumbnail-bg;\n  border: 1px solid @thumbnail-border;\n  border-radius: @thumbnail-border-radius;\n  .transition(all .2s ease-in-out);\n\n  // Keep them at most 100% wide\n  .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n  border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n  margin-top:    @line-height-computed;\n  margin-bottom: @line-height-computed;\n  border: 0;\n  border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0,0,0,0);\n  border: 0;\n}\n"
  },
  {
    "path": "bower_components/bootstrap/less/tables.less",
    "content": "//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n  max-width: 100%;\n  background-color: @table-bg;\n}\nth {\n  text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n  width: 100%;\n  margin-bottom: @line-height-computed;\n  // Cells\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-cell-padding;\n        line-height: @line-height-base;\n        vertical-align: top;\n        border-top: 1px solid @table-border-color;\n      }\n    }\n  }\n  // Bottom align for column headings\n  > thead > tr > th {\n    vertical-align: bottom;\n    border-bottom: 2px solid @table-border-color;\n  }\n  // Remove top border from thead by default\n  > caption + thead,\n  > colgroup + thead,\n  > thead:first-child {\n    > tr:first-child {\n      > th,\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    > td,\n    > th {\n      background-color: @table-bg-accent;\n    }\n  }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n  > tbody > tr:hover {\n    > td,\n    > th {\n      background-color: @table-bg-hover;\n    }\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      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(danger; @state-danger-bg);\n.table-row-variant(warning; @state-warning-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@media (max-width: @screen-xs-max) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: (@line-height-computed * 0.75);\n    overflow-y: hidden;\n    overflow-x: scroll;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid @table-border-color;\n    -webkit-overflow-scrolling: touch;\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": "bower_components/bootstrap/less/theme.less",
    "content": "\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n  text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n  @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n  .box-shadow(@shadow);\n\n  // Reset the shadow\n  &:active,\n  &.active {\n    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n  #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 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\n// Common styles\n.btn {\n  // Remove the gradient for the pressed/active state\n  &:active,\n  &.active {\n    background-image: none;\n  }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger  { .btn-styles(@btn-danger-bg); }\n.btn-info    { .btn-styles(@btn-info-bg); }\n\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n  .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  #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//\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 > .active > a {\n    #gradient > .vertical(@start-color: darken(@navbar-default-bg, 5%); @end-color: darken(@navbar-default-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 > .active > a {\n    #gradient > .vertical(@start-color: @navbar-inverse-bg; @end-color: lighten(@navbar-inverse-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//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n  text-shadow: 0 1px 0 rgba(255,255,255,.2);\n  @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n  .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n  border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success    { .alert-styles(@alert-success-bg); }\n.alert-info       { .alert-styles(@alert-info-bg); }\n.alert-warning    { .alert-styles(@alert-warning-bg); }\n.alert-danger     { .alert-styles(@alert-danger-bg); }\n\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n  #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar            { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success    { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info       { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning    { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger     { .progress-bar-styles(@progress-bar-danger-bg); }\n\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n  border-radius: @border-radius-base;\n  .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n  #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n  border-color: darken(@list-group-active-border, 7.5%);\n}\n\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n  .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading   { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading   { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading   { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading      { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading   { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading    { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n  #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n  border-color: darken(@well-bg, 10%);\n  @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n  .box-shadow(@shadow);\n}\n"
  },
  {
    "path": "bower_components/bootstrap/less/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(all .2s ease-in-out);\n\n  > img,\n  a > img {\n    .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": "bower_components/bootstrap/less/tooltip.less",
    "content": "//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n  position: absolute;\n  z-index: @zindex-tooltip;\n  display: block;\n  visibility: visible;\n  font-size: @font-size-small;\n  line-height: 1.4;\n  .opacity(0);\n\n  &.in     { .opacity(.9); }\n  &.top    { margin-top:  -3px; padding: @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": "bower_components/bootstrap/less/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,\nh2,\nh3 {\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,\nh5,\nh6 {\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: 200;\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: 14px base font * 85% = about 12px\nsmall,\n.small  { font-size: 85%; }\n\n// Undo browser default styling\ncite    { font-style: normal; }\n\n// Contextual emphasis\n.text-muted {\n  color: @text-muted;\n}\n.text-primary {\n  color: @brand-primary;\n  &:hover {\n    color: darken(@brand-primary, 10%);\n  }\n}\n.text-warning {\n  color: @state-warning-text;\n  &:hover {\n    color: darken(@state-warning-text, 10%);\n  }\n}\n.text-danger {\n  color: @state-danger-text;\n  &:hover {\n    color: darken(@state-danger-text, 10%);\n  }\n}\n.text-success {\n  color: @state-success-text;\n  &:hover {\n    color: darken(@state-success-text, 10%);\n  }\n}\n.text-info {\n  color: @state-info-text;\n  &:hover {\n    color: darken(@state-info-text, 10%);\n  }\n}\n\n// Alignment\n.text-left           { text-align: left; }\n.text-right          { text-align: right; }\n.text-center         { text-align: center; }\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\n  > li {\n    display: inline-block;\n    padding-left: 5px;\n    padding-right: 5px;\n\n    &:first-child {\n      padding-left: 0;\n    }\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@media (min-width: @grid-float-breakpoint) {\n  .dl-horizontal {\n    dt {\n      float: left;\n      width: (@component-offset-horizontal - 20);\n      clear: left;\n      text-align: right;\n      .text-overflow();\n    }\n    dd {\n      margin-left: @component-offset-horizontal;\n      .clearfix(); // Clear the floated `dt` if an empty `dd` is present\n    }\n  }\n}\n\n// MISC\n// ----\n\n// Abbreviations and acronyms\nabbr[title],\n// 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  border-left: 5px solid @blockquote-border-color;\n  p {\n    font-size: (@font-size-base * 1.25);\n    font-weight: 300;\n    line-height: 1.25;\n  }\n  p:last-child {\n    margin-bottom: 0;\n  }\n  small,\n  .small {\n    display: block;\n    line-height: @line-height-base;\n    color: @blockquote-small-color;\n    &:before {\n      content: '\\2014 \\00A0'; // EM DASH, NBSP\n    }\n  }\n\n  // Float right with text-align: right\n  &.pull-right {\n    padding-right: 15px;\n    padding-left: 0;\n    border-right: 5px solid @blockquote-border-color;\n    border-left: 0;\n    p,\n    small,\n    .small {\n      text-align: right;\n    }\n    small,\n    .small {\n      &:before {\n        content: '';\n      }\n      &:after {\n        content: '\\00A0 \\2014'; // NBSP, EM DASH\n      }\n    }\n  }\n}\n\n// Quotes\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\n\n// Addresses\naddress {\n  margin-bottom: @line-height-computed;\n  font-style: normal;\n  line-height: @line-height-base;\n}\n"
  },
  {
    "path": "bower_components/bootstrap/less/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": "bower_components/bootstrap/less/variables.less",
    "content": "//\n// Variables\n// --------------------------------------------------\n\n\n// Global values\n// --------------------------------------------------\n\n// Grays\n// -------------------------\n\n@gray-darker:            lighten(#000, 13.5%); // #222\n@gray-dark:              lighten(#000, 20%);   // #333\n@gray:                   lighten(#000, 33.5%); // #555\n@gray-light:             lighten(#000, 60%);   // #999\n@gray-lighter:           lighten(#000, 93.5%); // #eee\n\n// Brand colors\n// -------------------------\n\n@brand-primary:         #428bca;\n@brand-success:         #5cb85c;\n@brand-warning:         #f0ad4e;\n@brand-danger:          #d9534f;\n@brand-info:            #5bc0de;\n\n// Scaffolding\n// -------------------------\n\n@body-bg:               #fff;\n@text-color:            @gray-dark;\n\n// Links\n// -------------------------\n\n@link-color:            @brand-primary;\n@link-hover-color:      darken(@link-color, 15%);\n\n// Typography\n// -------------------------\n\n@font-family-sans-serif:  \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n@font-family-serif:       Georgia, \"Times New Roman\", Times, serif;\n@font-family-monospace:   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@line-height-base:        1.428571429; // 20/14\n@line-height-computed:    floor(@font-size-base * @line-height-base); // ~20px\n\n@headings-font-family:    @font-family-base;\n@headings-font-weight:    500;\n@headings-line-height:    1.1;\n@headings-color:          inherit;\n\n\n// Iconography\n// -------------------------\n\n@icon-font-path:          \"../fonts/\";\n@icon-font-name:          \"glyphicons-halflings-regular\";\n\n\n// Components\n// -------------------------\n// Based on 14px font-size and 1.428 line-height (~20px to start)\n\n@padding-base-vertical:          6px;\n@padding-base-horizontal:        12px;\n\n@padding-large-vertical:         10px;\n@padding-large-horizontal:       16px;\n\n@padding-small-vertical:         5px;\n@padding-small-horizontal:       10px;\n\n@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@component-active-color:         #fff;\n@component-active-bg:            @brand-primary;\n\n@caret-width-base:               4px;\n@caret-width-large:              5px;\n\n// Tables\n// -------------------------\n\n@table-cell-padding:                 8px;\n@table-condensed-cell-padding:       5px;\n\n@table-bg:                           transparent; // overall background-color\n@table-bg-accent:                    #f9f9f9; // for striping\n@table-bg-hover:                     #f5f5f5;\n@table-bg-active:                    @table-bg-hover;\n\n@table-border-color:                 #ddd; // table and cell border\n\n\n// Buttons\n// -------------------------\n\n@btn-font-weight:                normal;\n\n@btn-default-color:              #333;\n@btn-default-bg:                 #fff;\n@btn-default-border:             #ccc;\n\n@btn-primary-color:              #fff;\n@btn-primary-bg:                 @brand-primary;\n@btn-primary-border:             darken(@btn-primary-bg, 5%);\n\n@btn-success-color:              #fff;\n@btn-success-bg:                 @brand-success;\n@btn-success-border:             darken(@btn-success-bg, 5%);\n\n@btn-warning-color:              #fff;\n@btn-warning-bg:                 @brand-warning;\n@btn-warning-border:             darken(@btn-warning-bg, 5%);\n\n@btn-danger-color:               #fff;\n@btn-danger-bg:                  @brand-danger;\n@btn-danger-border:              darken(@btn-danger-bg, 5%);\n\n@btn-info-color:                 #fff;\n@btn-info-bg:                    @brand-info;\n@btn-info-border:                darken(@btn-info-bg, 5%);\n\n@btn-link-disabled-color:        @gray-light;\n\n\n// Forms\n// -------------------------\n\n@input-bg:                       #fff;\n@input-bg-disabled:              @gray-lighter;\n\n@input-color:                    @gray;\n@input-border:                   #ccc;\n@input-border-radius:            @border-radius-base;\n@input-border-focus:             #66afe9;\n\n@input-color-placeholder:        @gray-light;\n\n@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);\n@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);\n@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);\n\n@legend-color:                   @gray-dark;\n@legend-border-color:            #e5e5e5;\n\n@input-group-addon-bg:           @gray-lighter;\n@input-group-addon-border-color: @input-border;\n\n\n// Dropdowns\n// -------------------------\n\n@dropdown-bg:                    #fff;\n@dropdown-border:                rgba(0,0,0,.15);\n@dropdown-fallback-border:       #ccc;\n@dropdown-divider-bg:            #e5e5e5;\n\n@dropdown-link-color:            @gray-dark;\n@dropdown-link-hover-color:      darken(@gray-dark, 5%);\n@dropdown-link-hover-bg:         #f5f5f5;\n\n@dropdown-link-active-color:     @component-active-color;\n@dropdown-link-active-bg:        @component-active-bg;\n\n@dropdown-link-disabled-color:   @gray-light;\n\n@dropdown-header-color:          @gray-light;\n\n\n// COMPONENT VARIABLES\n// --------------------------------------------------\n\n\n// Z-index master list\n// -------------------------\n// Used for a bird's eye view of components dependent on the z-axis\n// Try to avoid customizing these :)\n\n@zindex-navbar:            1000;\n@zindex-dropdown:          1000;\n@zindex-popover:           1010;\n@zindex-tooltip:           1030;\n@zindex-navbar-fixed:      1030;\n@zindex-modal-background:  1040;\n@zindex-modal:             1050;\n\n// Media queries breakpoints\n// --------------------------------------------------\n\n// Extra small screen / phone\n// Note: Deprecated @screen-xs and @screen-phone as of v3.0.1\n@screen-xs:                  480px;\n@screen-xs-min:              @screen-xs;\n@screen-phone:               @screen-xs-min;\n\n// Small screen / tablet\n// Note: Deprecated @screen-sm and @screen-tablet as of v3.0.1\n@screen-sm:                  768px;\n@screen-sm-min:              @screen-sm;\n@screen-tablet:              @screen-sm-min;\n\n// Medium screen / desktop\n// Note: Deprecated @screen-md and @screen-desktop as of v3.0.1\n@screen-md:                  992px;\n@screen-md-min:              @screen-md;\n@screen-desktop:             @screen-md-min;\n\n// Large screen / wide desktop\n// Note: Deprecated @screen-lg and @screen-lg-desktop as of v3.0.1\n@screen-lg:                  1200px;\n@screen-lg-min:              @screen-lg;\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\n// Number of columns in the grid system\n@grid-columns:              12;\n// Padding, to be divided by two and applied to the left and right of all columns\n@grid-gutter-width:         30px;\n\n// Navbar collapse\n\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// Navbar\n// -------------------------\n\n// Basics of a navbar\n@navbar-height:                    50px;\n@navbar-margin-bottom:             @line-height-computed;\n@navbar-border-radius:             @border-radius-base;\n@navbar-padding-horizontal:        floor(@grid-gutter-width / 2);\n@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);\n\n@navbar-default-color:             #777;\n@navbar-default-bg:                #f8f8f8;\n@navbar-default-border:            darken(@navbar-default-bg, 6.5%);\n\n// Navbar links\n@navbar-default-link-color:                #777;\n@navbar-default-link-hover-color:          #333;\n@navbar-default-link-hover-bg:             transparent;\n@navbar-default-link-active-color:         #555;\n@navbar-default-link-active-bg:            darken(@navbar-default-bg, 6.5%);\n@navbar-default-link-disabled-color:       #ccc;\n@navbar-default-link-disabled-bg:          transparent;\n\n// Navbar brand label\n@navbar-default-brand-color:               @navbar-default-link-color;\n@navbar-default-brand-hover-color:         darken(@navbar-default-brand-color, 10%);\n@navbar-default-brand-hover-bg:            transparent;\n\n// Navbar toggle\n@navbar-default-toggle-hover-bg:           #ddd;\n@navbar-default-toggle-icon-bar-bg:        #ccc;\n@navbar-default-toggle-border-color:       #ddd;\n\n\n// Inverted navbar\n//\n// Reset inverted navbar basics\n@navbar-inverse-color:                      @gray-light;\n@navbar-inverse-bg:                         #222;\n@navbar-inverse-border:                     darken(@navbar-inverse-bg, 10%);\n\n// Inverted navbar links\n@navbar-inverse-link-color:                 @gray-light;\n@navbar-inverse-link-hover-color:           #fff;\n@navbar-inverse-link-hover-bg:              transparent;\n@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;\n@navbar-inverse-link-active-bg:             darken(@navbar-inverse-bg, 10%);\n@navbar-inverse-link-disabled-color:        #444;\n@navbar-inverse-link-disabled-bg:           transparent;\n\n// Inverted navbar brand label\n@navbar-inverse-brand-color:                @navbar-inverse-link-color;\n@navbar-inverse-brand-hover-color:          #fff;\n@navbar-inverse-brand-hover-bg:             transparent;\n\n// Inverted navbar toggle\n@navbar-inverse-toggle-hover-bg:            #333;\n@navbar-inverse-toggle-icon-bar-bg:         #fff;\n@navbar-inverse-toggle-border-color:        #333;\n\n\n// Navs\n// -------------------------\n\n@nav-link-padding:                          10px 15px;\n@nav-link-hover-bg:                         @gray-lighter;\n\n@nav-disabled-link-color:                   @gray-light;\n@nav-disabled-link-hover-color:             @gray-light;\n\n@nav-open-link-hover-color:                 #fff;\n\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@pagination-bg:                        #fff;\n@pagination-border:                    #ddd;\n\n@pagination-hover-bg:                  @gray-lighter;\n\n@pagination-active-bg:                 @brand-primary;\n@pagination-active-color:              #fff;\n\n@pagination-disabled-color:            @gray-light;\n\n\n// Pager\n// -------------------------\n\n@pager-border-radius:                  15px;\n@pager-disabled-color:                 @gray-light;\n\n\n// Jumbotron\n// -------------------------\n\n@jumbotron-padding:              30px;\n@jumbotron-color:                inherit;\n@jumbotron-bg:                   @gray-lighter;\n@jumbotron-heading-color:        inherit;\n@jumbotron-font-size:            ceil(@font-size-base * 1.5);\n\n\n// Form states and alerts\n// -------------------------\n\n@state-success-text:             #3c763d;\n@state-success-bg:               #dff0d8;\n@state-success-border:           darken(spin(@state-success-bg, -10), 5%);\n\n@state-info-text:                #31708f;\n@state-info-bg:                  #d9edf7;\n@state-info-border:              darken(spin(@state-info-bg, -10), 7%);\n\n@state-warning-text:             #8a6d3b;\n@state-warning-bg:               #fcf8e3;\n@state-warning-border:           darken(spin(@state-warning-bg, -10), 5%);\n\n@state-danger-text:              #a94442;\n@state-danger-bg:                #f2dede;\n@state-danger-border:            darken(spin(@state-danger-bg, -10), 5%);\n\n\n// Tooltips\n// -------------------------\n@tooltip-max-width:           200px;\n@tooltip-color:               #fff;\n@tooltip-bg:                  #000;\n\n@tooltip-arrow-width:         5px;\n@tooltip-arrow-color:         @tooltip-bg;\n\n\n// Popovers\n// -------------------------\n@popover-bg:                          #fff;\n@popover-max-width:                   276px;\n@popover-border-color:                rgba(0,0,0,.2);\n@popover-fallback-border-color:       #ccc;\n\n@popover-title-bg:                    darken(@popover-bg, 3%);\n\n@popover-arrow-width:                 10px;\n@popover-arrow-color:                 #fff;\n\n@popover-arrow-outer-width:           (@popover-arrow-width + 1);\n@popover-arrow-outer-color:           rgba(0,0,0,.25);\n@popover-arrow-outer-fallback-color:  #999;\n\n\n// Labels\n// -------------------------\n\n@label-default-bg:            @gray-light;\n@label-primary-bg:            @brand-primary;\n@label-success-bg:            @brand-success;\n@label-info-bg:               @brand-info;\n@label-warning-bg:            @brand-warning;\n@label-danger-bg:             @brand-danger;\n\n@label-color:                 #fff;\n@label-link-hover-color:      #fff;\n\n\n// Modals\n// -------------------------\n@modal-inner-padding:         20px;\n\n@modal-title-padding:         15px;\n@modal-title-line-height:     @line-height-base;\n\n@modal-content-bg:                             #fff;\n@modal-content-border-color:                   rgba(0,0,0,.2);\n@modal-content-fallback-border-color:          #999;\n\n@modal-backdrop-bg:           #000;\n@modal-header-border-color:   #e5e5e5;\n@modal-footer-border-color:   @modal-header-border-color;\n\n\n// Alerts\n// -------------------------\n@alert-padding:               15px;\n@alert-border-radius:         @border-radius-base;\n@alert-link-font-weight:      bold;\n\n@alert-success-bg:            @state-success-bg;\n@alert-success-text:          @state-success-text;\n@alert-success-border:        @state-success-border;\n\n@alert-info-bg:               @state-info-bg;\n@alert-info-text:             @state-info-text;\n@alert-info-border:           @state-info-border;\n\n@alert-warning-bg:            @state-warning-bg;\n@alert-warning-text:          @state-warning-text;\n@alert-warning-border:        @state-warning-border;\n\n@alert-danger-bg:             @state-danger-bg;\n@alert-danger-text:           @state-danger-text;\n@alert-danger-border:         @state-danger-border;\n\n\n// Progress bars\n// -------------------------\n@progress-bg:                 #f5f5f5;\n@progress-bar-color:          #fff;\n\n@progress-bar-bg:             @brand-primary;\n@progress-bar-success-bg:     @brand-success;\n@progress-bar-warning-bg:     @brand-warning;\n@progress-bar-danger-bg:      @brand-danger;\n@progress-bar-info-bg:        @brand-info;\n\n\n// List group\n// -------------------------\n@list-group-bg:               #fff;\n@list-group-border:           #ddd;\n@list-group-border-radius:    @border-radius-base;\n\n@list-group-hover-bg:         #f5f5f5;\n@list-group-active-color:     @component-active-color;\n@list-group-active-bg:        @component-active-bg;\n@list-group-active-border:    @list-group-active-bg;\n\n@list-group-link-color:          #555;\n@list-group-link-heading-color:  #333;\n\n\n// Panels\n// -------------------------\n@panel-bg:                    #fff;\n@panel-inner-border:          #ddd;\n@panel-border-radius:         @border-radius-base;\n@panel-footer-bg:             #f5f5f5;\n\n@panel-default-text:          @gray-dark;\n@panel-default-border:        #ddd;\n@panel-default-heading-bg:    #f5f5f5;\n\n@panel-primary-text:          #fff;\n@panel-primary-border:        @brand-primary;\n@panel-primary-heading-bg:    @brand-primary;\n\n@panel-success-text:          @state-success-text;\n@panel-success-border:        @state-success-border;\n@panel-success-heading-bg:    @state-success-bg;\n\n@panel-warning-text:          @state-warning-text;\n@panel-warning-border:        @state-warning-border;\n@panel-warning-heading-bg:    @state-warning-bg;\n\n@panel-danger-text:           @state-danger-text;\n@panel-danger-border:         @state-danger-border;\n@panel-danger-heading-bg:     @state-danger-bg;\n\n@panel-info-text:             @state-info-text;\n@panel-info-border:           @state-info-border;\n@panel-info-heading-bg:       @state-info-bg;\n\n\n// Thumbnails\n// -------------------------\n@thumbnail-padding:           4px;\n@thumbnail-bg:                @body-bg;\n@thumbnail-border:            #ddd;\n@thumbnail-border-radius:     @border-radius-base;\n\n@thumbnail-caption-color:     @text-color;\n@thumbnail-caption-padding:   9px;\n\n\n// Wells\n// -------------------------\n@well-bg:                     #f5f5f5;\n\n\n// Badges\n// -------------------------\n@badge-color:                 #fff;\n@badge-link-hover-color:      #fff;\n@badge-bg:                    @gray-light;\n\n@badge-active-color:          @link-color;\n@badge-active-bg:             #fff;\n\n@badge-font-weight:           bold;\n@badge-line-height:           1;\n@badge-border-radius:         10px;\n\n\n// Breadcrumbs\n// -------------------------\n@breadcrumb-bg:               #f5f5f5;\n@breadcrumb-color:            #ccc;\n@breadcrumb-active-color:     @gray-light;\n@breadcrumb-separator:        \"/\";\n\n\n// Carousel\n// ------------------------\n\n@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);\n\n@carousel-control-color:                      #fff;\n@carousel-control-width:                      15%;\n@carousel-control-opacity:                    .5;\n@carousel-control-font-size:                  20px;\n\n@carousel-indicator-active-bg:                #fff;\n@carousel-indicator-border-color:             #fff;\n\n@carousel-caption-color:                      #fff;\n\n\n// Close\n// ------------------------\n@close-font-weight:           bold;\n@close-color:                 #000;\n@close-text-shadow:           0 1px 0 #fff;\n\n\n// Code\n// ------------------------\n@code-color:                  #c7254e;\n@code-bg:                     #f9f2f4;\n\n@pre-bg:                      #f5f5f5;\n@pre-color:                   @gray-dark;\n@pre-border-color:            #ccc;\n@pre-scrollable-max-height:   340px;\n\n// Type\n// ------------------------\n@text-muted:                  @gray-light;\n@abbr-border-color:           @gray-light;\n@headings-small-color:        @gray-light;\n@blockquote-small-color:      @gray-light;\n@blockquote-border-color:     @gray-lighter;\n@page-header-border-color:    @gray-lighter;\n\n// Miscellaneous\n// -------------------------\n\n// Hr border color\n@hr-border:                   @gray-lighter;\n\n// Horizontal forms & lists\n@component-offset-horizontal: 180px;\n\n\n// Container sizes\n// --------------------------------------------------\n\n// Small screen / tablet\n@container-tablet:             ((720px + @grid-gutter-width));\n@container-sm:                 @container-tablet;\n\n// Medium screen / desktop\n@container-desktop:            ((940px + @grid-gutter-width));\n@container-md:                 @container-desktop;\n\n// Large screen / wide desktop\n@container-large-desktop:      ((1140px + @grid-gutter-width));\n@container-lg:                 @container-large-desktop;\n"
  },
  {
    "path": "bower_components/bootstrap/less/wells.less",
    "content": "//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: @well-bg;\n  border: 1px solid darken(@well-bg, 7%);\n  border-radius: @border-radius-base;\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n  blockquote {\n    border-color: #ddd;\n    border-color: rgba(0,0,0,.15);\n  }\n}\n\n// Sizes\n.well-lg {\n  padding: 24px;\n  border-radius: @border-radius-large;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: @border-radius-small;\n}\n"
  },
  {
    "path": "bower_components/expect.js/.bower.json",
    "content": "{\n  \"name\": \"expect.js\",\n  \"homepage\": \"https://github.com/Automattic/expect.js\",\n  \"version\": \"0.3.1\",\n  \"_release\": \"0.3.1\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"0.3.1\",\n    \"commit\": \"68ce6a98a5008ec0a11298e026ee00ad0142f118\"\n  },\n  \"_source\": \"git://github.com/Automattic/expect.js.git\",\n  \"_target\": \"*\",\n  \"_originalSource\": \"expect.js\"\n}"
  },
  {
    "path": "bower_components/expect.js/.gitignore",
    "content": "node_modules\n.DS_Store\n"
  },
  {
    "path": "bower_components/expect.js/.npmignore",
    "content": "support\ntest\nMakefile\n"
  },
  {
    "path": "bower_components/expect.js/History.md",
    "content": "\n0.3.0 / 2014-02-20\n==================\n\n * renmaed to `index.js`\n * added repository to package.json\n * remove unused variable and merge\n * simpify isDate() and remove unnecessary semicolon.\n * Add .withArgs() syntax for building scenario\n * eql(): fix wrong order of actual vs. expected.\n * Added formatting for Error objects\n * Add support for 'regexp' type and eql comparison of regular expressions.\n * Better to follow the same coding style\n * Use 'showDiff' flag\n * Add 'actual' & 'expected' property to the thrown error\n * Pass .fail() unit test\n * Ignore 'script*' global leak in chrome\n * Exposed object stringification function\n * Use isRegExp in Assertion::throwException. Fix #25\n * Cleaned up local variables\n\n0.2.0 / 2012-10-19\n==================\n\n  * fix isRegExp bug in some edge cases\n  * add closure to all assertion messages deferring costly inspects\n    until there is actually a failure\n  * fix `make test` for recent mochas\n  * add inspect() case for DOM elements\n  * relax failure msg null check\n  * add explicit failure through `expect().fail()`\n  * clarified all `empty` functionality in README example\n  * added docs for throwException fn/regexp signatures\n\n0.1.2 / 2012-02-04\n==================\n\n  * Added regexp matching support for exceptions.\n  * Added support for throwException callback.\n  * Added `throwError` synonym to `throwException`.\n  * Added object support for `.empty`.\n  * Fixed `.a('object')` with nulls, and english error in error message.\n  * Fix bug `indexOf` (IE). [hokaccha]\n  * Fixed object property checking with `undefined` as value. [vovik]\n\n0.1.1 / 2011-12-18\n==================\n\n  * Fixed typo\n\n0.1.0 / 2011-12-18\n==================\n\n  * Initial import\n"
  },
  {
    "path": "bower_components/expect.js/Makefile",
    "content": "\nREPORTER = dot\n\ntest:\n\t@./node_modules/.bin/mocha \\\n\t\t--require ./test/common \\\n\t\t--reporter $(REPORTER) \\\n\t\t--growl \\\n\t\ttest/expect.js\n\ntest-browser:\n\t@./node_modules/.bin/serve .\n\n.PHONY: test\n"
  },
  {
    "path": "bower_components/expect.js/README.md",
    "content": "# Expect\n\nMinimalistic BDD assertion toolkit based on\n[should.js](http://github.com/visionmedia/should.js)\n\n```js\nexpect(window.r).to.be(undefined);\nexpect({ a: 'b' }).to.eql({ a: 'b' })\nexpect(5).to.be.a('number');\nexpect([]).to.be.an('array');\nexpect(window).not.to.be.an(Image);\n```\n\n## Features\n\n- Cross-browser: works on IE6+, Firefox, Safari, Chrome, Opera.\n- Compatible with all test frameworks.\n- Node.JS ready (`require('expect.js')`).\n- Standalone. Single global with no prototype extensions or shims.\n\n## How to use\n\n### Node\n\nInstall it with NPM or add it to your `package.json`:\n\n```\n$ npm install expect.js\n```\n\nThen:\n\n```js\nvar expect = require('expect.js');\n```\n\n### Browser\n\nExpose the `expect.js` found at the top level of this repository.\n\n```html\n<script src=\"expect.js\"></script>\n```\n\n## API\n\n**ok**: asserts that the value is _truthy_ or not\n\n```js\nexpect(1).to.be.ok();\nexpect(true).to.be.ok();\nexpect({}).to.be.ok();\nexpect(0).to.not.be.ok();\n```\n\n**be** / **equal**: asserts `===` equality\n\n```js\nexpect(1).to.be(1)\nexpect(NaN).not.to.equal(NaN);\nexpect(1).not.to.be(true)\nexpect('1').to.not.be(1);\n```\n\n**eql**: asserts loose equality that works with objects\n\n```js\nexpect({ a: 'b' }).to.eql({ a: 'b' });\nexpect(1).to.eql('1');\n```\n\n**a**/**an**: asserts `typeof` with support for `array` type and `instanceof`\n\n```js\n// typeof with optional `array`\nexpect(5).to.be.a('number');\nexpect([]).to.be.an('array');  // works\nexpect([]).to.be.an('object'); // works too, since it uses `typeof`\n\n// constructors\nexpect(5).to.be.a(Number);\nexpect([]).to.be.an(Array);\nexpect(tobi).to.be.a(Ferret);\nexpect(person).to.be.a(Mammal);\n```\n\n**match**: asserts `String` regular expression match\n\n```js\nexpect(program.version).to.match(/[0-9]+\\.[0-9]+\\.[0-9]+/);\n```\n\n**contain**: asserts indexOf for an array or string\n\n```js\nexpect([1, 2]).to.contain(1);\nexpect('hello world').to.contain('world');\n```\n\n**length**: asserts array `.length`\n\n```js\nexpect([]).to.have.length(0);\nexpect([1,2,3]).to.have.length(3);\n```\n\n**empty**: asserts that an array is empty or not\n\n```js\nexpect([]).to.be.empty();\nexpect({}).to.be.empty();\nexpect({ length: 0, duck: 'typing' }).to.be.empty();\nexpect({ my: 'object' }).to.not.be.empty();\nexpect([1,2,3]).to.not.be.empty();\n```\n\n**property**: asserts presence of an own property (and value optionally)\n\n```js\nexpect(window).to.have.property('expect')\nexpect(window).to.have.property('expect', expect)\nexpect({a: 'b'}).to.have.property('a');\n```\n\n**key**/**keys**: asserts the presence of a key. Supports the `only` modifier\n\n```js\nexpect({ a: 'b' }).to.have.key('a');\nexpect({ a: 'b', c: 'd' }).to.only.have.keys('a', 'c');\nexpect({ a: 'b', c: 'd' }).to.only.have.keys(['a', 'c']);\nexpect({ a: 'b', c: 'd' }).to.not.only.have.key('a');\n```\n\n**throwException**/**throwError**: asserts that the `Function` throws or not when called\n\n```js\nexpect(fn).to.throwError(); // synonym of throwException\nexpect(fn).to.throwException(function (e) { // get the exception object\n  expect(e).to.be.a(SyntaxError);\n});\nexpect(fn).to.throwException(/matches the exception message/);\nexpect(fn2).to.not.throwException();\n```\n\n**withArgs**: creates anonymous function to call fn with arguments\n\n```js\nexpect(fn).withArgs(invalid, arg).to.throwException();\nexpect(fn).withArgs(valid, arg).to.not.throwException();\n```\n\n**within**: asserts a number within a range\n\n```js\nexpect(1).to.be.within(0, Infinity);\n```\n\n**greaterThan**/**above**: asserts `>`\n\n```js\nexpect(3).to.be.above(0);\nexpect(5).to.be.greaterThan(3);\n```\n\n**lessThan**/**below**: asserts `<`\n\n```js\nexpect(0).to.be.below(3);\nexpect(1).to.be.lessThan(3);\n```\n\n**fail**: explicitly forces failure.\n\n```js\nexpect().fail()\nexpect().fail(\"Custom failure message\")\n```\n\n## Using with a test framework\n\nFor example, if you create a test suite with\n[mocha](http://github.com/visionmedia/mocha).\n\nLet's say we wanted to test the following program:\n\n**math.js**\n\n```js\nfunction add (a, b) { return a + b; };\n```\n\nOur test file would look like this:\n\n```js\ndescribe('test suite', function () {\n  it('should expose a function', function () {\n    expect(add).to.be.a('function');\n  });\n\n  it('should do math', function () {\n    expect(add(1, 3)).to.equal(4);\n  });\n});\n```\n\nIf a certain expectation fails, an exception will be raised which gets captured\nand shown/processed by the test runner.\n\n## Differences with should.js\n\n- No need for static `should` methods like `should.strictEqual`. For example, \n  `expect(obj).to.be(undefined)` works well.\n- Some API simplifications / changes.\n- API changes related to browser compatibility.\n\n## Running tests\n\nClone the repository and install the developer dependencies:\n\n```\ngit clone git://github.com/LearnBoost/expect.js.git expect\ncd expect && npm install\n```\n\n### Node\n\n`make test`\n\n### Browser\n\n`make test-browser`\n\nand point your browser(s) to `http://localhost:3000/test/`\n\n## Credits\n\n(The MIT License)\n\nCopyright (c) 2011 Guillermo Rauch &lt;guillermo@learnboost.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n### 3rd-party\n\nHeavily borrows from [should.js](http://github.com/visionmedia/should.js) by TJ\nHolowaychuck - MIT.\n"
  },
  {
    "path": "bower_components/expect.js/index.js",
    "content": "(function (global, module) {\n\n  var exports = module.exports;\n\n  /**\n   * Exports.\n   */\n\n  module.exports = expect;\n  expect.Assertion = Assertion;\n\n  /**\n   * Exports version.\n   */\n\n  expect.version = '0.3.1';\n\n  /**\n   * Possible assertion flags.\n   */\n\n  var flags = {\n      not: ['to', 'be', 'have', 'include', 'only']\n    , to: ['be', 'have', 'include', 'only', 'not']\n    , only: ['have']\n    , have: ['own']\n    , be: ['an']\n  };\n\n  function expect (obj) {\n    return new Assertion(obj);\n  }\n\n  /**\n   * Constructor\n   *\n   * @api private\n   */\n\n  function Assertion (obj, flag, parent) {\n    this.obj = obj;\n    this.flags = {};\n\n    if (undefined != parent) {\n      this.flags[flag] = true;\n\n      for (var i in parent.flags) {\n        if (parent.flags.hasOwnProperty(i)) {\n          this.flags[i] = true;\n        }\n      }\n    }\n\n    var $flags = flag ? flags[flag] : keys(flags)\n      , self = this;\n\n    if ($flags) {\n      for (var i = 0, l = $flags.length; i < l; i++) {\n        // avoid recursion\n        if (this.flags[$flags[i]]) continue;\n\n        var name = $flags[i]\n          , assertion = new Assertion(this.obj, name, this)\n\n        if ('function' == typeof Assertion.prototype[name]) {\n          // clone the function, make sure we dont touch the prot reference\n          var old = this[name];\n          this[name] = function () {\n            return old.apply(self, arguments);\n          };\n\n          for (var fn in Assertion.prototype) {\n            if (Assertion.prototype.hasOwnProperty(fn) && fn != name) {\n              this[name][fn] = bind(assertion[fn], assertion);\n            }\n          }\n        } else {\n          this[name] = assertion;\n        }\n      }\n    }\n  }\n\n  /**\n   * Performs an assertion\n   *\n   * @api private\n   */\n\n  Assertion.prototype.assert = function (truth, msg, error, expected) {\n    var msg = this.flags.not ? error : msg\n      , ok = this.flags.not ? !truth : truth\n      , err;\n\n    if (!ok) {\n      err = new Error(msg.call(this));\n      if (arguments.length > 3) {\n        err.actual = this.obj;\n        err.expected = expected;\n        err.showDiff = true;\n      }\n      throw err;\n    }\n\n    this.and = new Assertion(this.obj);\n  };\n\n  /**\n   * Check if the value is truthy\n   *\n   * @api public\n   */\n\n  Assertion.prototype.ok = function () {\n    this.assert(\n        !!this.obj\n      , function(){ return 'expected ' + i(this.obj) + ' to be truthy' }\n      , function(){ return 'expected ' + i(this.obj) + ' to be falsy' });\n  };\n\n  /**\n   * Creates an anonymous function which calls fn with arguments.\n   *\n   * @api public\n   */\n\n  Assertion.prototype.withArgs = function() {\n    expect(this.obj).to.be.a('function');\n    var fn = this.obj;\n    var args = Array.prototype.slice.call(arguments);\n    return expect(function() { fn.apply(null, args); });\n  };\n\n  /**\n   * Assert that the function throws.\n   *\n   * @param {Function|RegExp} callback, or regexp to match error string against\n   * @api public\n   */\n\n  Assertion.prototype.throwError =\n  Assertion.prototype.throwException = function (fn) {\n    expect(this.obj).to.be.a('function');\n\n    var thrown = false\n      , not = this.flags.not;\n\n    try {\n      this.obj();\n    } catch (e) {\n      if (isRegExp(fn)) {\n        var subject = 'string' == typeof e ? e : e.message;\n        if (not) {\n          expect(subject).to.not.match(fn);\n        } else {\n          expect(subject).to.match(fn);\n        }\n      } else if ('function' == typeof fn) {\n        fn(e);\n      }\n      thrown = true;\n    }\n\n    if (isRegExp(fn) && not) {\n      // in the presence of a matcher, ensure the `not` only applies to\n      // the matching.\n      this.flags.not = false;\n    }\n\n    var name = this.obj.name || 'fn';\n    this.assert(\n        thrown\n      , function(){ return 'expected ' + name + ' to throw an exception' }\n      , function(){ return 'expected ' + name + ' not to throw an exception' });\n  };\n\n  /**\n   * Checks if the array is empty.\n   *\n   * @api public\n   */\n\n  Assertion.prototype.empty = function () {\n    var expectation;\n\n    if ('object' == typeof this.obj && null !== this.obj && !isArray(this.obj)) {\n      if ('number' == typeof this.obj.length) {\n        expectation = !this.obj.length;\n      } else {\n        expectation = !keys(this.obj).length;\n      }\n    } else {\n      if ('string' != typeof this.obj) {\n        expect(this.obj).to.be.an('object');\n      }\n\n      expect(this.obj).to.have.property('length');\n      expectation = !this.obj.length;\n    }\n\n    this.assert(\n        expectation\n      , function(){ return 'expected ' + i(this.obj) + ' to be empty' }\n      , function(){ return 'expected ' + i(this.obj) + ' to not be empty' });\n    return this;\n  };\n\n  /**\n   * Checks if the obj exactly equals another.\n   *\n   * @api public\n   */\n\n  Assertion.prototype.be =\n  Assertion.prototype.equal = function (obj) {\n    this.assert(\n        obj === this.obj\n      , function(){ return 'expected ' + i(this.obj) + ' to equal ' + i(obj) }\n      , function(){ return 'expected ' + i(this.obj) + ' to not equal ' + i(obj) });\n    return this;\n  };\n\n  /**\n   * Checks if the obj sortof equals another.\n   *\n   * @api public\n   */\n\n  Assertion.prototype.eql = function (obj) {\n    this.assert(\n        expect.eql(this.obj, obj)\n      , function(){ return 'expected ' + i(this.obj) + ' to sort of equal ' + i(obj) }\n      , function(){ return 'expected ' + i(this.obj) + ' to sort of not equal ' + i(obj) }\n      , obj);\n    return this;\n  };\n\n  /**\n   * Assert within start to finish (inclusive).\n   *\n   * @param {Number} start\n   * @param {Number} finish\n   * @api public\n   */\n\n  Assertion.prototype.within = function (start, finish) {\n    var range = start + '..' + finish;\n    this.assert(\n        this.obj >= start && this.obj <= finish\n      , function(){ return 'expected ' + i(this.obj) + ' to be within ' + range }\n      , function(){ return 'expected ' + i(this.obj) + ' to not be within ' + range });\n    return this;\n  };\n\n  /**\n   * Assert typeof / instance of\n   *\n   * @api public\n   */\n\n  Assertion.prototype.a =\n  Assertion.prototype.an = function (type) {\n    if ('string' == typeof type) {\n      // proper english in error msg\n      var n = /^[aeiou]/.test(type) ? 'n' : '';\n\n      // typeof with support for 'array'\n      this.assert(\n          'array' == type ? isArray(this.obj) :\n            'regexp' == type ? isRegExp(this.obj) :\n              'object' == type\n                ? 'object' == typeof this.obj && null !== this.obj\n                : type == typeof this.obj\n        , function(){ return 'expected ' + i(this.obj) + ' to be a' + n + ' ' + type }\n        , function(){ return 'expected ' + i(this.obj) + ' not to be a' + n + ' ' + type });\n    } else {\n      // instanceof\n      var name = type.name || 'supplied constructor';\n      this.assert(\n          this.obj instanceof type\n        , function(){ return 'expected ' + i(this.obj) + ' to be an instance of ' + name }\n        , function(){ return 'expected ' + i(this.obj) + ' not to be an instance of ' + name });\n    }\n\n    return this;\n  };\n\n  /**\n   * Assert numeric value above _n_.\n   *\n   * @param {Number} n\n   * @api public\n   */\n\n  Assertion.prototype.greaterThan =\n  Assertion.prototype.above = function (n) {\n    this.assert(\n        this.obj > n\n      , function(){ return 'expected ' + i(this.obj) + ' to be above ' + n }\n      , function(){ return 'expected ' + i(this.obj) + ' to be below ' + n });\n    return this;\n  };\n\n  /**\n   * Assert numeric value below _n_.\n   *\n   * @param {Number} n\n   * @api public\n   */\n\n  Assertion.prototype.lessThan =\n  Assertion.prototype.below = function (n) {\n    this.assert(\n        this.obj < n\n      , function(){ return 'expected ' + i(this.obj) + ' to be below ' + n }\n      , function(){ return 'expected ' + i(this.obj) + ' to be above ' + n });\n    return this;\n  };\n\n  /**\n   * Assert string value matches _regexp_.\n   *\n   * @param {RegExp} regexp\n   * @api public\n   */\n\n  Assertion.prototype.match = function (regexp) {\n    this.assert(\n        regexp.exec(this.obj)\n      , function(){ return 'expected ' + i(this.obj) + ' to match ' + regexp }\n      , function(){ return 'expected ' + i(this.obj) + ' not to match ' + regexp });\n    return this;\n  };\n\n  /**\n   * Assert property \"length\" exists and has value of _n_.\n   *\n   * @param {Number} n\n   * @api public\n   */\n\n  Assertion.prototype.length = function (n) {\n    expect(this.obj).to.have.property('length');\n    var len = this.obj.length;\n    this.assert(\n        n == len\n      , function(){ return 'expected ' + i(this.obj) + ' to have a length of ' + n + ' but got ' + len }\n      , function(){ return 'expected ' + i(this.obj) + ' to not have a length of ' + len });\n    return this;\n  };\n\n  /**\n   * Assert property _name_ exists, with optional _val_.\n   *\n   * @param {String} name\n   * @param {Mixed} val\n   * @api public\n   */\n\n  Assertion.prototype.property = function (name, val) {\n    if (this.flags.own) {\n      this.assert(\n          Object.prototype.hasOwnProperty.call(this.obj, name)\n        , function(){ return 'expected ' + i(this.obj) + ' to have own property ' + i(name) }\n        , function(){ return 'expected ' + i(this.obj) + ' to not have own property ' + i(name) });\n      return this;\n    }\n\n    if (this.flags.not && undefined !== val) {\n      if (undefined === this.obj[name]) {\n        throw new Error(i(this.obj) + ' has no property ' + i(name));\n      }\n    } else {\n      var hasProp;\n      try {\n        hasProp = name in this.obj\n      } catch (e) {\n        hasProp = undefined !== this.obj[name]\n      }\n\n      this.assert(\n          hasProp\n        , function(){ return 'expected ' + i(this.obj) + ' to have a property ' + i(name) }\n        , function(){ return 'expected ' + i(this.obj) + ' to not have a property ' + i(name) });\n    }\n\n    if (undefined !== val) {\n      this.assert(\n          val === this.obj[name]\n        , function(){ return 'expected ' + i(this.obj) + ' to have a property ' + i(name)\n          + ' of ' + i(val) + ', but got ' + i(this.obj[name]) }\n        , function(){ return 'expected ' + i(this.obj) + ' to not have a property ' + i(name)\n          + ' of ' + i(val) });\n    }\n\n    this.obj = this.obj[name];\n    return this;\n  };\n\n  /**\n   * Assert that the array contains _obj_ or string contains _obj_.\n   *\n   * @param {Mixed} obj|string\n   * @api public\n   */\n\n  Assertion.prototype.string =\n  Assertion.prototype.contain = function (obj) {\n    if ('string' == typeof this.obj) {\n      this.assert(\n          ~this.obj.indexOf(obj)\n        , function(){ return 'expected ' + i(this.obj) + ' to contain ' + i(obj) }\n        , function(){ return 'expected ' + i(this.obj) + ' to not contain ' + i(obj) });\n    } else {\n      this.assert(\n          ~indexOf(this.obj, obj)\n        , function(){ return 'expected ' + i(this.obj) + ' to contain ' + i(obj) }\n        , function(){ return 'expected ' + i(this.obj) + ' to not contain ' + i(obj) });\n    }\n    return this;\n  };\n\n  /**\n   * Assert exact keys or inclusion of keys by using\n   * the `.own` modifier.\n   *\n   * @param {Array|String ...} keys\n   * @api public\n   */\n\n  Assertion.prototype.key =\n  Assertion.prototype.keys = function ($keys) {\n    var str\n      , ok = true;\n\n    $keys = isArray($keys)\n      ? $keys\n      : Array.prototype.slice.call(arguments);\n\n    if (!$keys.length) throw new Error('keys required');\n\n    var actual = keys(this.obj)\n      , len = $keys.length;\n\n    // Inclusion\n    ok = every($keys, function (key) {\n      return ~indexOf(actual, key);\n    });\n\n    // Strict\n    if (!this.flags.not && this.flags.only) {\n      ok = ok && $keys.length == actual.length;\n    }\n\n    // Key string\n    if (len > 1) {\n      $keys = map($keys, function (key) {\n        return i(key);\n      });\n      var last = $keys.pop();\n      str = $keys.join(', ') + ', and ' + last;\n    } else {\n      str = i($keys[0]);\n    }\n\n    // Form\n    str = (len > 1 ? 'keys ' : 'key ') + str;\n\n    // Have / include\n    str = (!this.flags.only ? 'include ' : 'only have ') + str;\n\n    // Assertion\n    this.assert(\n        ok\n      , function(){ return 'expected ' + i(this.obj) + ' to ' + str }\n      , function(){ return 'expected ' + i(this.obj) + ' to not ' + str });\n\n    return this;\n  };\n\n  /**\n   * Assert a failure.\n   *\n   * @param {String ...} custom message\n   * @api public\n   */\n  Assertion.prototype.fail = function (msg) {\n    var error = function() { return msg || \"explicit failure\"; }\n    this.assert(false, error, error);\n    return this;\n  };\n\n  /**\n   * Function bind implementation.\n   */\n\n  function bind (fn, scope) {\n    return function () {\n      return fn.apply(scope, arguments);\n    }\n  }\n\n  /**\n   * Array every compatibility\n   *\n   * @see bit.ly/5Fq1N2\n   * @api public\n   */\n\n  function every (arr, fn, thisObj) {\n    var scope = thisObj || global;\n    for (var i = 0, j = arr.length; i < j; ++i) {\n      if (!fn.call(scope, arr[i], i, arr)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * Array indexOf compatibility.\n   *\n   * @see bit.ly/a5Dxa2\n   * @api public\n   */\n\n  function indexOf (arr, o, i) {\n    if (Array.prototype.indexOf) {\n      return Array.prototype.indexOf.call(arr, o, i);\n    }\n\n    if (arr.length === undefined) {\n      return -1;\n    }\n\n    for (var j = arr.length, i = i < 0 ? i + j < 0 ? 0 : i + j : i || 0\n        ; i < j && arr[i] !== o; i++);\n\n    return j <= i ? -1 : i;\n  }\n\n  // https://gist.github.com/1044128/\n  var getOuterHTML = function(element) {\n    if ('outerHTML' in element) return element.outerHTML;\n    var ns = \"http://www.w3.org/1999/xhtml\";\n    var container = document.createElementNS(ns, '_');\n    var xmlSerializer = new XMLSerializer();\n    var html;\n    if (document.xmlVersion) {\n      return xmlSerializer.serializeToString(element);\n    } else {\n      container.appendChild(element.cloneNode(false));\n      html = container.innerHTML.replace('><', '>' + element.innerHTML + '<');\n      container.innerHTML = '';\n      return html;\n    }\n  };\n\n  // Returns true if object is a DOM element.\n  var isDOMElement = function (object) {\n    if (typeof HTMLElement === 'object') {\n      return object instanceof HTMLElement;\n    } else {\n      return object &&\n        typeof object === 'object' &&\n        object.nodeType === 1 &&\n        typeof object.nodeName === 'string';\n    }\n  };\n\n  /**\n   * Inspects an object.\n   *\n   * @see taken from node.js `util` module (copyright Joyent, MIT license)\n   * @api private\n   */\n\n  function i (obj, showHidden, depth) {\n    var seen = [];\n\n    function stylize (str) {\n      return str;\n    }\n\n    function format (value, recurseTimes) {\n      // Provide a hook for user-specified inspect functions.\n      // Check that value is an object with an inspect function on it\n      if (value && typeof value.inspect === 'function' &&\n          // Filter out the util module, it's inspect function is special\n          value !== exports &&\n          // Also filter out any prototype objects using the circular check.\n          !(value.constructor && value.constructor.prototype === value)) {\n        return value.inspect(recurseTimes);\n      }\n\n      // Primitive types cannot have properties\n      switch (typeof value) {\n        case 'undefined':\n          return stylize('undefined', 'undefined');\n\n        case 'string':\n          var simple = '\\'' + json.stringify(value).replace(/^\"|\"$/g, '')\n                                                   .replace(/'/g, \"\\\\'\")\n                                                   .replace(/\\\\\"/g, '\"') + '\\'';\n          return stylize(simple, 'string');\n\n        case 'number':\n          return stylize('' + value, 'number');\n\n        case 'boolean':\n          return stylize('' + value, 'boolean');\n      }\n      // For some reason typeof null is \"object\", so special case here.\n      if (value === null) {\n        return stylize('null', 'null');\n      }\n\n      if (isDOMElement(value)) {\n        return getOuterHTML(value);\n      }\n\n      // Look up the keys of the object.\n      var visible_keys = keys(value);\n      var $keys = showHidden ? Object.getOwnPropertyNames(value) : visible_keys;\n\n      // Functions without properties can be shortcutted.\n      if (typeof value === 'function' && $keys.length === 0) {\n        if (isRegExp(value)) {\n          return stylize('' + value, 'regexp');\n        } else {\n          var name = value.name ? ': ' + value.name : '';\n          return stylize('[Function' + name + ']', 'special');\n        }\n      }\n\n      // Dates without properties can be shortcutted\n      if (isDate(value) && $keys.length === 0) {\n        return stylize(value.toUTCString(), 'date');\n      }\n      \n      // Error objects can be shortcutted\n      if (value instanceof Error) {\n        return stylize(\"[\"+value.toString()+\"]\", 'Error');\n      }\n\n      var base, type, braces;\n      // Determine the object type\n      if (isArray(value)) {\n        type = 'Array';\n        braces = ['[', ']'];\n      } else {\n        type = 'Object';\n        braces = ['{', '}'];\n      }\n\n      // Make functions say that they are functions\n      if (typeof value === 'function') {\n        var n = value.name ? ': ' + value.name : '';\n        base = (isRegExp(value)) ? ' ' + value : ' [Function' + n + ']';\n      } else {\n        base = '';\n      }\n\n      // Make dates with properties first say the date\n      if (isDate(value)) {\n        base = ' ' + value.toUTCString();\n      }\n\n      if ($keys.length === 0) {\n        return braces[0] + base + braces[1];\n      }\n\n      if (recurseTimes < 0) {\n        if (isRegExp(value)) {\n          return stylize('' + value, 'regexp');\n        } else {\n          return stylize('[Object]', 'special');\n        }\n      }\n\n      seen.push(value);\n\n      var output = map($keys, function (key) {\n        var name, str;\n        if (value.__lookupGetter__) {\n          if (value.__lookupGetter__(key)) {\n            if (value.__lookupSetter__(key)) {\n              str = stylize('[Getter/Setter]', 'special');\n            } else {\n              str = stylize('[Getter]', 'special');\n            }\n          } else {\n            if (value.__lookupSetter__(key)) {\n              str = stylize('[Setter]', 'special');\n            }\n          }\n        }\n        if (indexOf(visible_keys, key) < 0) {\n          name = '[' + key + ']';\n        }\n        if (!str) {\n          if (indexOf(seen, value[key]) < 0) {\n            if (recurseTimes === null) {\n              str = format(value[key]);\n            } else {\n              str = format(value[key], recurseTimes - 1);\n            }\n            if (str.indexOf('\\n') > -1) {\n              if (isArray(value)) {\n                str = map(str.split('\\n'), function (line) {\n                  return '  ' + line;\n                }).join('\\n').substr(2);\n              } else {\n                str = '\\n' + map(str.split('\\n'), function (line) {\n                  return '   ' + line;\n                }).join('\\n');\n              }\n            }\n          } else {\n            str = stylize('[Circular]', 'special');\n          }\n        }\n        if (typeof name === 'undefined') {\n          if (type === 'Array' && key.match(/^\\d+$/)) {\n            return str;\n          }\n          name = json.stringify('' + key);\n          if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n            name = name.substr(1, name.length - 2);\n            name = stylize(name, 'name');\n          } else {\n            name = name.replace(/'/g, \"\\\\'\")\n                       .replace(/\\\\\"/g, '\"')\n                       .replace(/(^\"|\"$)/g, \"'\");\n            name = stylize(name, 'string');\n          }\n        }\n\n        return name + ': ' + str;\n      });\n\n      seen.pop();\n\n      var numLinesEst = 0;\n      var length = reduce(output, function (prev, cur) {\n        numLinesEst++;\n        if (indexOf(cur, '\\n') >= 0) numLinesEst++;\n        return prev + cur.length + 1;\n      }, 0);\n\n      if (length > 50) {\n        output = braces[0] +\n                 (base === '' ? '' : base + '\\n ') +\n                 ' ' +\n                 output.join(',\\n  ') +\n                 ' ' +\n                 braces[1];\n\n      } else {\n        output = braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n      }\n\n      return output;\n    }\n    return format(obj, (typeof depth === 'undefined' ? 2 : depth));\n  }\n\n  expect.stringify = i;\n\n  function isArray (ar) {\n    return Object.prototype.toString.call(ar) === '[object Array]';\n  }\n\n  function isRegExp(re) {\n    var s;\n    try {\n      s = '' + re;\n    } catch (e) {\n      return false;\n    }\n\n    return re instanceof RegExp || // easy case\n           // duck-type for context-switching evalcx case\n           typeof(re) === 'function' &&\n           re.constructor.name === 'RegExp' &&\n           re.compile &&\n           re.test &&\n           re.exec &&\n           s.match(/^\\/.*\\/[gim]{0,3}$/);\n  }\n\n  function isDate(d) {\n    return d instanceof Date;\n  }\n\n  function keys (obj) {\n    if (Object.keys) {\n      return Object.keys(obj);\n    }\n\n    var keys = [];\n\n    for (var i in obj) {\n      if (Object.prototype.hasOwnProperty.call(obj, i)) {\n        keys.push(i);\n      }\n    }\n\n    return keys;\n  }\n\n  function map (arr, mapper, that) {\n    if (Array.prototype.map) {\n      return Array.prototype.map.call(arr, mapper, that);\n    }\n\n    var other= new Array(arr.length);\n\n    for (var i= 0, n = arr.length; i<n; i++)\n      if (i in arr)\n        other[i] = mapper.call(that, arr[i], i, arr);\n\n    return other;\n  }\n\n  function reduce (arr, fun) {\n    if (Array.prototype.reduce) {\n      return Array.prototype.reduce.apply(\n          arr\n        , Array.prototype.slice.call(arguments, 1)\n      );\n    }\n\n    var len = +this.length;\n\n    if (typeof fun !== \"function\")\n      throw new TypeError();\n\n    // no value to return if no initial value and an empty array\n    if (len === 0 && arguments.length === 1)\n      throw new TypeError();\n\n    var i = 0;\n    if (arguments.length >= 2) {\n      var rv = arguments[1];\n    } else {\n      do {\n        if (i in this) {\n          rv = this[i++];\n          break;\n        }\n\n        // if array contains no values, no initial value to return\n        if (++i >= len)\n          throw new TypeError();\n      } while (true);\n    }\n\n    for (; i < len; i++) {\n      if (i in this)\n        rv = fun.call(null, rv, this[i], i, this);\n    }\n\n    return rv;\n  }\n\n  /**\n   * Asserts deep equality\n   *\n   * @see taken from node.js `assert` module (copyright Joyent, MIT license)\n   * @api private\n   */\n\n  expect.eql = function eql(actual, expected) {\n    // 7.1. All identical values are equivalent, as determined by ===.\n    if (actual === expected) {\n      return true;\n    } else if ('undefined' != typeof Buffer\n      && Buffer.isBuffer(actual) && Buffer.isBuffer(expected)) {\n      if (actual.length != expected.length) return false;\n\n      for (var i = 0; i < actual.length; i++) {\n        if (actual[i] !== expected[i]) return false;\n      }\n\n      return true;\n\n      // 7.2. If the expected value is a Date object, the actual value is\n      // equivalent if it is also a Date object that refers to the same time.\n    } else if (actual instanceof Date && expected instanceof Date) {\n      return actual.getTime() === expected.getTime();\n\n      // 7.3. Other pairs that do not both pass typeof value == \"object\",\n      // equivalence is determined by ==.\n    } else if (typeof actual != 'object' && typeof expected != 'object') {\n      return actual == expected;\n    // If both are regular expression use the special `regExpEquiv` method\n    // to determine equivalence.\n    } else if (isRegExp(actual) && isRegExp(expected)) {\n      return regExpEquiv(actual, expected);\n    // 7.4. For all other Object pairs, including Array objects, equivalence is\n    // determined by having the same number of owned properties (as verified\n    // with Object.prototype.hasOwnProperty.call), the same set of keys\n    // (although not necessarily the same order), equivalent values for every\n    // corresponding key, and an identical \"prototype\" property. Note: this\n    // accounts for both named and indexed properties on Arrays.\n    } else {\n      return objEquiv(actual, expected);\n    }\n  };\n\n  function isUndefinedOrNull (value) {\n    return value === null || value === undefined;\n  }\n\n  function isArguments (object) {\n    return Object.prototype.toString.call(object) == '[object Arguments]';\n  }\n\n  function regExpEquiv (a, b) {\n    return a.source === b.source && a.global === b.global &&\n           a.ignoreCase === b.ignoreCase && a.multiline === b.multiline;\n  }\n\n  function objEquiv (a, b) {\n    if (isUndefinedOrNull(a) || isUndefinedOrNull(b))\n      return false;\n    // an identical \"prototype\" property.\n    if (a.prototype !== b.prototype) return false;\n    //~~~I've managed to break Object.keys through screwy arguments passing.\n    //   Converting to array solves the problem.\n    if (isArguments(a)) {\n      if (!isArguments(b)) {\n        return false;\n      }\n      a = pSlice.call(a);\n      b = pSlice.call(b);\n      return expect.eql(a, b);\n    }\n    try{\n      var ka = keys(a),\n        kb = keys(b),\n        key, i;\n    } catch (e) {//happens when one is a string literal and the other isn't\n      return false;\n    }\n    // having the same number of owned properties (keys incorporates hasOwnProperty)\n    if (ka.length != kb.length)\n      return false;\n    //the same set of keys (although not necessarily the same order),\n    ka.sort();\n    kb.sort();\n    //~~~cheap key test\n    for (i = ka.length - 1; i >= 0; i--) {\n      if (ka[i] != kb[i])\n        return false;\n    }\n    //equivalent values for every corresponding key, and\n    //~~~possibly expensive deep test\n    for (i = ka.length - 1; i >= 0; i--) {\n      key = ka[i];\n      if (!expect.eql(a[key], b[key]))\n         return false;\n    }\n    return true;\n  }\n\n  var json = (function () {\n    \"use strict\";\n\n    if ('object' == typeof JSON && JSON.parse && JSON.stringify) {\n      return {\n          parse: nativeJSON.parse\n        , stringify: nativeJSON.stringify\n      }\n    }\n\n    var JSON = {};\n\n    function f(n) {\n        // Format integers to have at least two digits.\n        return n < 10 ? '0' + n : n;\n    }\n\n    function date(d, key) {\n      return isFinite(d.valueOf()) ?\n          d.getUTCFullYear()     + '-' +\n          f(d.getUTCMonth() + 1) + '-' +\n          f(d.getUTCDate())      + 'T' +\n          f(d.getUTCHours())     + ':' +\n          f(d.getUTCMinutes())   + ':' +\n          f(d.getUTCSeconds())   + 'Z' : null;\n    }\n\n    var cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n        escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n        gap,\n        indent,\n        meta = {    // table of character substitutions\n            '\\b': '\\\\b',\n            '\\t': '\\\\t',\n            '\\n': '\\\\n',\n            '\\f': '\\\\f',\n            '\\r': '\\\\r',\n            '\"' : '\\\\\"',\n            '\\\\': '\\\\\\\\'\n        },\n        rep;\n\n\n    function quote(string) {\n\n  // If the string contains no control characters, no quote characters, and no\n  // backslash characters, then we can safely slap some quotes around it.\n  // Otherwise we must also replace the offending characters with safe escape\n  // sequences.\n\n        escapable.lastIndex = 0;\n        return escapable.test(string) ? '\"' + string.replace(escapable, function (a) {\n            var c = meta[a];\n            return typeof c === 'string' ? c :\n                '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n        }) + '\"' : '\"' + string + '\"';\n    }\n\n\n    function str(key, holder) {\n\n  // Produce a string from holder[key].\n\n        var i,          // The loop counter.\n            k,          // The member key.\n            v,          // The member value.\n            length,\n            mind = gap,\n            partial,\n            value = holder[key];\n\n  // If the value has a toJSON method, call it to obtain a replacement value.\n\n        if (value instanceof Date) {\n            value = date(key);\n        }\n\n  // If we were called with a replacer function, then call the replacer to\n  // obtain a replacement value.\n\n        if (typeof rep === 'function') {\n            value = rep.call(holder, key, value);\n        }\n\n  // What happens next depends on the value's type.\n\n        switch (typeof value) {\n        case 'string':\n            return quote(value);\n\n        case 'number':\n\n  // JSON numbers must be finite. Encode non-finite numbers as null.\n\n            return isFinite(value) ? String(value) : 'null';\n\n        case 'boolean':\n        case 'null':\n\n  // If the value is a boolean or null, convert it to a string. Note:\n  // typeof null does not produce 'null'. The case is included here in\n  // the remote chance that this gets fixed someday.\n\n            return String(value);\n\n  // If the type is 'object', we might be dealing with an object or an array or\n  // null.\n\n        case 'object':\n\n  // Due to a specification blunder in ECMAScript, typeof null is 'object',\n  // so watch out for that case.\n\n            if (!value) {\n                return 'null';\n            }\n\n  // Make an array to hold the partial results of stringifying this object value.\n\n            gap += indent;\n            partial = [];\n\n  // Is the value an array?\n\n            if (Object.prototype.toString.apply(value) === '[object Array]') {\n\n  // The value is an array. Stringify every element. Use null as a placeholder\n  // for non-JSON values.\n\n                length = value.length;\n                for (i = 0; i < length; i += 1) {\n                    partial[i] = str(i, value) || 'null';\n                }\n\n  // Join all of the elements together, separated with commas, and wrap them in\n  // brackets.\n\n                v = partial.length === 0 ? '[]' : gap ?\n                    '[\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + ']' :\n                    '[' + partial.join(',') + ']';\n                gap = mind;\n                return v;\n            }\n\n  // If the replacer is an array, use it to select the members to be stringified.\n\n            if (rep && typeof rep === 'object') {\n                length = rep.length;\n                for (i = 0; i < length; i += 1) {\n                    if (typeof rep[i] === 'string') {\n                        k = rep[i];\n                        v = str(k, value);\n                        if (v) {\n                            partial.push(quote(k) + (gap ? ': ' : ':') + v);\n                        }\n                    }\n                }\n            } else {\n\n  // Otherwise, iterate through all of the keys in the object.\n\n                for (k in value) {\n                    if (Object.prototype.hasOwnProperty.call(value, k)) {\n                        v = str(k, value);\n                        if (v) {\n                            partial.push(quote(k) + (gap ? ': ' : ':') + v);\n                        }\n                    }\n                }\n            }\n\n  // Join all of the member texts together, separated with commas,\n  // and wrap them in braces.\n\n            v = partial.length === 0 ? '{}' : gap ?\n                '{\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + '}' :\n                '{' + partial.join(',') + '}';\n            gap = mind;\n            return v;\n        }\n    }\n\n  // If the JSON object does not yet have a stringify method, give it one.\n\n    JSON.stringify = function (value, replacer, space) {\n\n  // The stringify method takes a value and an optional replacer, and an optional\n  // space parameter, and returns a JSON text. The replacer can be a function\n  // that can replace values, or an array of strings that will select the keys.\n  // A default replacer method can be provided. Use of the space parameter can\n  // produce text that is more easily readable.\n\n        var i;\n        gap = '';\n        indent = '';\n\n  // If the space parameter is a number, make an indent string containing that\n  // many spaces.\n\n        if (typeof space === 'number') {\n            for (i = 0; i < space; i += 1) {\n                indent += ' ';\n            }\n\n  // If the space parameter is a string, it will be used as the indent string.\n\n        } else if (typeof space === 'string') {\n            indent = space;\n        }\n\n  // If there is a replacer, it must be a function or an array.\n  // Otherwise, throw an error.\n\n        rep = replacer;\n        if (replacer && typeof replacer !== 'function' &&\n                (typeof replacer !== 'object' ||\n                typeof replacer.length !== 'number')) {\n            throw new Error('JSON.stringify');\n        }\n\n  // Make a fake root object containing our value under the key of ''.\n  // Return the result of stringifying the value.\n\n        return str('', {'': value});\n    };\n\n  // If the JSON object does not yet have a parse method, give it one.\n\n    JSON.parse = function (text, reviver) {\n    // The parse method takes a text and an optional reviver function, and returns\n    // a JavaScript value if the text is a valid JSON text.\n\n        var j;\n\n        function walk(holder, key) {\n\n    // The walk method is used to recursively walk the resulting structure so\n    // that modifications can be made.\n\n            var k, v, value = holder[key];\n            if (value && typeof value === 'object') {\n                for (k in value) {\n                    if (Object.prototype.hasOwnProperty.call(value, k)) {\n                        v = walk(value, k);\n                        if (v !== undefined) {\n                            value[k] = v;\n                        } else {\n                            delete value[k];\n                        }\n                    }\n                }\n            }\n            return reviver.call(holder, key, value);\n        }\n\n\n    // Parsing happens in four stages. In the first stage, we replace certain\n    // Unicode characters with escape sequences. JavaScript handles many characters\n    // incorrectly, either silently deleting them, or treating them as line endings.\n\n        text = String(text);\n        cx.lastIndex = 0;\n        if (cx.test(text)) {\n            text = text.replace(cx, function (a) {\n                return '\\\\u' +\n                    ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n            });\n        }\n\n    // In the second stage, we run the text against regular expressions that look\n    // for non-JSON patterns. We are especially concerned with '()' and 'new'\n    // because they can cause invocation, and '=' because it can cause mutation.\n    // But just to be safe, we want to reject all unexpected forms.\n\n    // We split the second stage into 4 regexp operations in order to work around\n    // crippling inefficiencies in IE's and Safari's regexp engines. First we\n    // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we\n    // replace all simple value tokens with ']' characters. Third, we delete all\n    // open brackets that follow a colon or comma or that begin the text. Finally,\n    // we look to see that the remaining characters are only whitespace or ']' or\n    // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.\n\n        if (/^[\\],:{}\\s]*$/\n                .test(text.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')\n                    .replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g, ']')\n                    .replace(/(?:^|:|,)(?:\\s*\\[)+/g, ''))) {\n\n    // In the third stage we use the eval function to compile the text into a\n    // JavaScript structure. The '{' operator is subject to a syntactic ambiguity\n    // in JavaScript: it can begin a block or an object literal. We wrap the text\n    // in parens to eliminate the ambiguity.\n\n            j = eval('(' + text + ')');\n\n    // In the optional fourth stage, we recursively walk the new structure, passing\n    // each name/value pair to a reviver function for possible transformation.\n\n            return typeof reviver === 'function' ?\n                walk({'': j}, '') : j;\n        }\n\n    // If the text is not JSON parseable, then a SyntaxError is thrown.\n\n        throw new SyntaxError('JSON.parse');\n    };\n\n    return JSON;\n  })();\n\n  if ('undefined' != typeof window) {\n    window.expect = module.exports;\n  }\n\n})(\n    this\n  , 'undefined' != typeof module ? module : {exports: {}}\n);\n"
  },
  {
    "path": "bower_components/expect.js/package.json",
    "content": "{\n    \"name\": \"expect.js\"\n  , \"version\": \"0.3.1\"\n  , \"description\": \"BDD style assertions for node and the browser.\"\n  , \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"git://github.com/LearnBoost/expect.js.git\"\n    }\n  , \"devDependencies\": {\n        \"mocha\": \"*\"\n      , \"serve\": \"*\"\n    }\n}\n"
  },
  {
    "path": "bower_components/expect.js/support/jquery.js",
    "content": "/*!\n * jQuery JavaScript Library v1.7.1\n * http://jquery.com/\n *\n * Copyright 2011, John Resig\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n * Copyright 2011, The Dojo Foundation\n * Released under the MIT, BSD, and GPL Licenses.\n *\n * Date: Mon Nov 21 21:11:03 2011 -0500\n */\n(function( window, undefined ) {\n\n// Use the correct document accordingly with window argument (sandbox)\nvar document = window.document,\n  navigator = window.navigator,\n  location = window.location;\nvar jQuery = (function() {\n\n// Define a local copy of jQuery\nvar jQuery = function( selector, context ) {\n    // The jQuery object is actually just the init constructor 'enhanced'\n    return new jQuery.fn.init( selector, context, rootjQuery );\n  },\n\n  // Map over jQuery in case of overwrite\n  _jQuery = window.jQuery,\n\n  // Map over the $ in case of overwrite\n  _$ = window.$,\n\n  // A central reference to the root jQuery(document)\n  rootjQuery,\n\n  // A simple way to check for HTML strings or ID strings\n  // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n  quickExpr = /^(?:[^#<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)/,\n\n  // Check if a string has a non-whitespace character in it\n  rnotwhite = /\\S/,\n\n  // Used for trimming whitespace\n  trimLeft = /^\\s+/,\n  trimRight = /\\s+$/,\n\n  // Match a standalone tag\n  rsingleTag = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>)?$/,\n\n  // JSON RegExp\n  rvalidchars = /^[\\],:{}\\s]*$/,\n  rvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,\n  rvalidtokens = /\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,\n  rvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g,\n\n  // Useragent RegExp\n  rwebkit = /(webkit)[ \\/]([\\w.]+)/,\n  ropera = /(opera)(?:.*version)?[ \\/]([\\w.]+)/,\n  rmsie = /(msie) ([\\w.]+)/,\n  rmozilla = /(mozilla)(?:.*? rv:([\\w.]+))?/,\n\n  // Matches dashed string for camelizing\n  rdashAlpha = /-([a-z]|[0-9])/ig,\n  rmsPrefix = /^-ms-/,\n\n  // Used by jQuery.camelCase as callback to replace()\n  fcamelCase = function( all, letter ) {\n    return ( letter + \"\" ).toUpperCase();\n  },\n\n  // Keep a UserAgent string for use with jQuery.browser\n  userAgent = navigator.userAgent,\n\n  // For matching the engine and version of the browser\n  browserMatch,\n\n  // The deferred used on DOM ready\n  readyList,\n\n  // The ready event handler\n  DOMContentLoaded,\n\n  // Save a reference to some core methods\n  toString = Object.prototype.toString,\n  hasOwn = Object.prototype.hasOwnProperty,\n  push = Array.prototype.push,\n  slice = Array.prototype.slice,\n  trim = String.prototype.trim,\n  indexOf = Array.prototype.indexOf,\n\n  // [[Class]] -> type pairs\n  class2type = {};\n\njQuery.fn = jQuery.prototype = {\n  constructor: jQuery,\n  init: function( selector, context, rootjQuery ) {\n    var match, elem, ret, doc;\n\n    // Handle $(\"\"), $(null), or $(undefined)\n    if ( !selector ) {\n      return this;\n    }\n\n    // Handle $(DOMElement)\n    if ( selector.nodeType ) {\n      this.context = this[0] = selector;\n      this.length = 1;\n      return this;\n    }\n\n    // The body element only exists once, optimize finding it\n    if ( selector === \"body\" && !context && document.body ) {\n      this.context = document;\n      this[0] = document.body;\n      this.selector = selector;\n      this.length = 1;\n      return this;\n    }\n\n    // Handle HTML strings\n    if ( typeof selector === \"string\" ) {\n      // Are we dealing with HTML string or an ID?\n      if ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\n        // Assume that strings that start and end with <> are HTML and skip the regex check\n        match = [ null, selector, null ];\n\n      } else {\n        match = quickExpr.exec( selector );\n      }\n\n      // Verify a match, and that no context was specified for #id\n      if ( match && (match[1] || !context) ) {\n\n        // HANDLE: $(html) -> $(array)\n        if ( match[1] ) {\n          context = context instanceof jQuery ? context[0] : context;\n          doc = ( context ? context.ownerDocument || context : document );\n\n          // If a single string is passed in and it's a single tag\n          // just do a createElement and skip the rest\n          ret = rsingleTag.exec( selector );\n\n          if ( ret ) {\n            if ( jQuery.isPlainObject( context ) ) {\n              selector = [ document.createElement( ret[1] ) ];\n              jQuery.fn.attr.call( selector, context, true );\n\n            } else {\n              selector = [ doc.createElement( ret[1] ) ];\n            }\n\n          } else {\n            ret = jQuery.buildFragment( [ match[1] ], [ doc ] );\n            selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;\n          }\n\n          return jQuery.merge( this, selector );\n\n        // HANDLE: $(\"#id\")\n        } else {\n          elem = document.getElementById( match[2] );\n\n          // Check parentNode to catch when Blackberry 4.6 returns\n          // nodes that are no longer in the document #6963\n          if ( elem && elem.parentNode ) {\n            // Handle the case where IE and Opera return items\n            // by name instead of ID\n            if ( elem.id !== match[2] ) {\n              return rootjQuery.find( selector );\n            }\n\n            // Otherwise, we inject the element directly into the jQuery object\n            this.length = 1;\n            this[0] = elem;\n          }\n\n          this.context = document;\n          this.selector = selector;\n          return this;\n        }\n\n      // HANDLE: $(expr, $(...))\n      } else if ( !context || context.jquery ) {\n        return ( context || rootjQuery ).find( selector );\n\n      // HANDLE: $(expr, context)\n      // (which is just equivalent to: $(context).find(expr)\n      } else {\n        return this.constructor( context ).find( selector );\n      }\n\n    // HANDLE: $(function)\n    // Shortcut for document ready\n    } else if ( jQuery.isFunction( selector ) ) {\n      return rootjQuery.ready( selector );\n    }\n\n    if ( selector.selector !== undefined ) {\n      this.selector = selector.selector;\n      this.context = selector.context;\n    }\n\n    return jQuery.makeArray( selector, this );\n  },\n\n  // Start with an empty selector\n  selector: \"\",\n\n  // The current version of jQuery being used\n  jquery: \"1.7.1\",\n\n  // The default length of a jQuery object is 0\n  length: 0,\n\n  // The number of elements contained in the matched element set\n  size: function() {\n    return this.length;\n  },\n\n  toArray: function() {\n    return slice.call( this, 0 );\n  },\n\n  // Get the Nth element in the matched element set OR\n  // Get the whole matched element set as a clean array\n  get: function( num ) {\n    return num == null ?\n\n      // Return a 'clean' array\n      this.toArray() :\n\n      // Return just the object\n      ( num < 0 ? this[ this.length + num ] : this[ num ] );\n  },\n\n  // Take an array of elements and push it onto the stack\n  // (returning the new matched element set)\n  pushStack: function( elems, name, selector ) {\n    // Build a new jQuery matched element set\n    var ret = this.constructor();\n\n    if ( jQuery.isArray( elems ) ) {\n      push.apply( ret, elems );\n\n    } else {\n      jQuery.merge( ret, elems );\n    }\n\n    // Add the old object onto the stack (as a reference)\n    ret.prevObject = this;\n\n    ret.context = this.context;\n\n    if ( name === \"find\" ) {\n      ret.selector = this.selector + ( this.selector ? \" \" : \"\" ) + selector;\n    } else if ( name ) {\n      ret.selector = this.selector + \".\" + name + \"(\" + selector + \")\";\n    }\n\n    // Return the newly-formed element set\n    return ret;\n  },\n\n  // Execute a callback for every element in the matched set.\n  // (You can seed the arguments with an array of args, but this is\n  // only used internally.)\n  each: function( callback, args ) {\n    return jQuery.each( this, callback, args );\n  },\n\n  ready: function( fn ) {\n    // Attach the listeners\n    jQuery.bindReady();\n\n    // Add the callback\n    readyList.add( fn );\n\n    return this;\n  },\n\n  eq: function( i ) {\n    i = +i;\n    return i === -1 ?\n      this.slice( i ) :\n      this.slice( i, i + 1 );\n  },\n\n  first: function() {\n    return this.eq( 0 );\n  },\n\n  last: function() {\n    return this.eq( -1 );\n  },\n\n  slice: function() {\n    return this.pushStack( slice.apply( this, arguments ),\n      \"slice\", slice.call(arguments).join(\",\") );\n  },\n\n  map: function( callback ) {\n    return this.pushStack( jQuery.map(this, function( elem, i ) {\n      return callback.call( elem, i, elem );\n    }));\n  },\n\n  end: function() {\n    return this.prevObject || this.constructor(null);\n  },\n\n  // For internal use only.\n  // Behaves like an Array's method, not like a jQuery method.\n  push: push,\n  sort: [].sort,\n  splice: [].splice\n};\n\n// Give the init function the jQuery prototype for later instantiation\njQuery.fn.init.prototype = jQuery.fn;\n\njQuery.extend = jQuery.fn.extend = function() {\n  var options, name, src, copy, copyIsArray, clone,\n    target = arguments[0] || {},\n    i = 1,\n    length = arguments.length,\n    deep = false;\n\n  // Handle a deep copy situation\n  if ( typeof target === \"boolean\" ) {\n    deep = target;\n    target = arguments[1] || {};\n    // skip the boolean and the target\n    i = 2;\n  }\n\n  // Handle case when target is a string or something (possible in deep copy)\n  if ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n    target = {};\n  }\n\n  // extend jQuery itself if only one argument is passed\n  if ( length === i ) {\n    target = this;\n    --i;\n  }\n\n  for ( ; i < length; i++ ) {\n    // Only deal with non-null/undefined values\n    if ( (options = arguments[ i ]) != null ) {\n      // Extend the base object\n      for ( name in options ) {\n        src = target[ name ];\n        copy = options[ name ];\n\n        // Prevent never-ending loop\n        if ( target === copy ) {\n          continue;\n        }\n\n        // Recurse if we're merging plain objects or arrays\n        if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n          if ( copyIsArray ) {\n            copyIsArray = false;\n            clone = src && jQuery.isArray(src) ? src : [];\n\n          } else {\n            clone = src && jQuery.isPlainObject(src) ? src : {};\n          }\n\n          // Never move original objects, clone them\n          target[ name ] = jQuery.extend( deep, clone, copy );\n\n        // Don't bring in undefined values\n        } else if ( copy !== undefined ) {\n          target[ name ] = copy;\n        }\n      }\n    }\n  }\n\n  // Return the modified object\n  return target;\n};\n\njQuery.extend({\n  noConflict: function( deep ) {\n    if ( window.$ === jQuery ) {\n      window.$ = _$;\n    }\n\n    if ( deep && window.jQuery === jQuery ) {\n      window.jQuery = _jQuery;\n    }\n\n    return jQuery;\n  },\n\n  // Is the DOM ready to be used? Set to true once it occurs.\n  isReady: false,\n\n  // A counter to track how many items to wait for before\n  // the ready event fires. See #6781\n  readyWait: 1,\n\n  // Hold (or release) the ready event\n  holdReady: function( hold ) {\n    if ( hold ) {\n      jQuery.readyWait++;\n    } else {\n      jQuery.ready( true );\n    }\n  },\n\n  // Handle when the DOM is ready\n  ready: function( wait ) {\n    // Either a released hold or an DOMready/load event and not yet ready\n    if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {\n      // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n      if ( !document.body ) {\n        return setTimeout( jQuery.ready, 1 );\n      }\n\n      // Remember that the DOM is ready\n      jQuery.isReady = true;\n\n      // If a normal DOM Ready event fired, decrement, and wait if need be\n      if ( wait !== true && --jQuery.readyWait > 0 ) {\n        return;\n      }\n\n      // If there are functions bound, to execute\n      readyList.fireWith( document, [ jQuery ] );\n\n      // Trigger any bound ready events\n      if ( jQuery.fn.trigger ) {\n        jQuery( document ).trigger( \"ready\" ).off( \"ready\" );\n      }\n    }\n  },\n\n  bindReady: function() {\n    if ( readyList ) {\n      return;\n    }\n\n    readyList = jQuery.Callbacks( \"once memory\" );\n\n    // Catch cases where $(document).ready() is called after the\n    // browser event has already occurred.\n    if ( document.readyState === \"complete\" ) {\n      // Handle it asynchronously to allow scripts the opportunity to delay ready\n      return setTimeout( jQuery.ready, 1 );\n    }\n\n    // Mozilla, Opera and webkit nightlies currently support this event\n    if ( document.addEventListener ) {\n      // Use the handy event callback\n      document.addEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\n\n      // A fallback to window.onload, that will always work\n      window.addEventListener( \"load\", jQuery.ready, false );\n\n    // If IE event model is used\n    } else if ( document.attachEvent ) {\n      // ensure firing before onload,\n      // maybe late but safe also for iframes\n      document.attachEvent( \"onreadystatechange\", DOMContentLoaded );\n\n      // A fallback to window.onload, that will always work\n      window.attachEvent( \"onload\", jQuery.ready );\n\n      // If IE and not a frame\n      // continually check to see if the document is ready\n      var toplevel = false;\n\n      try {\n        toplevel = window.frameElement == null;\n      } catch(e) {}\n\n      if ( document.documentElement.doScroll && toplevel ) {\n        doScrollCheck();\n      }\n    }\n  },\n\n  // See test/unit/core.js for details concerning isFunction.\n  // Since version 1.3, DOM methods and functions like alert\n  // aren't supported. They return false on IE (#2968).\n  isFunction: function( obj ) {\n    return jQuery.type(obj) === \"function\";\n  },\n\n  isArray: Array.isArray || function( obj ) {\n    return jQuery.type(obj) === \"array\";\n  },\n\n  // A crude way of determining if an object is a window\n  isWindow: function( obj ) {\n    return obj && typeof obj === \"object\" && \"setInterval\" in obj;\n  },\n\n  isNumeric: function( obj ) {\n    return !isNaN( parseFloat(obj) ) && isFinite( obj );\n  },\n\n  type: function( obj ) {\n    return obj == null ?\n      String( obj ) :\n      class2type[ toString.call(obj) ] || \"object\";\n  },\n\n  isPlainObject: function( obj ) {\n    // Must be an Object.\n    // Because of IE, we also have to check the presence of the constructor property.\n    // Make sure that DOM nodes and window objects don't pass through, as well\n    if ( !obj || jQuery.type(obj) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n      return false;\n    }\n\n    try {\n      // Not own constructor property must be Object\n      if ( obj.constructor &&\n        !hasOwn.call(obj, \"constructor\") &&\n        !hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n        return false;\n      }\n    } catch ( e ) {\n      // IE8,9 Will throw exceptions on certain host objects #9897\n      return false;\n    }\n\n    // Own properties are enumerated firstly, so to speed up,\n    // if last one is own, then all properties are own.\n\n    var key;\n    for ( key in obj ) {}\n\n    return key === undefined || hasOwn.call( obj, key );\n  },\n\n  isEmptyObject: function( obj ) {\n    for ( var name in obj ) {\n      return false;\n    }\n    return true;\n  },\n\n  error: function( msg ) {\n    throw new Error( msg );\n  },\n\n  parseJSON: function( data ) {\n    if ( typeof data !== \"string\" || !data ) {\n      return null;\n    }\n\n    // Make sure leading/trailing whitespace is removed (IE can't handle it)\n    data = jQuery.trim( data );\n\n    // Attempt to parse using the native JSON parser first\n    if ( window.JSON && window.JSON.parse ) {\n      return window.JSON.parse( data );\n    }\n\n    // Make sure the incoming data is actual JSON\n    // Logic borrowed from http://json.org/json2.js\n    if ( rvalidchars.test( data.replace( rvalidescape, \"@\" )\n      .replace( rvalidtokens, \"]\" )\n      .replace( rvalidbraces, \"\")) ) {\n\n      return ( new Function( \"return \" + data ) )();\n\n    }\n    jQuery.error( \"Invalid JSON: \" + data );\n  },\n\n  // Cross-browser xml parsing\n  parseXML: function( data ) {\n    var xml, tmp;\n    try {\n      if ( window.DOMParser ) { // Standard\n        tmp = new DOMParser();\n        xml = tmp.parseFromString( data , \"text/xml\" );\n      } else { // IE\n        xml = new ActiveXObject( \"Microsoft.XMLDOM\" );\n        xml.async = \"false\";\n        xml.loadXML( data );\n      }\n    } catch( e ) {\n      xml = undefined;\n    }\n    if ( !xml || !xml.documentElement || xml.getElementsByTagName( \"parsererror\" ).length ) {\n      jQuery.error( \"Invalid XML: \" + data );\n    }\n    return xml;\n  },\n\n  noop: function() {},\n\n  // Evaluates a script in a global context\n  // Workarounds based on findings by Jim Driscoll\n  // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\n  globalEval: function( data ) {\n    if ( data && rnotwhite.test( data ) ) {\n      // We use execScript on Internet Explorer\n      // We use an anonymous function so that context is window\n      // rather than jQuery in Firefox\n      ( window.execScript || function( data ) {\n        window[ \"eval\" ].call( window, data );\n      } )( data );\n    }\n  },\n\n  // Convert dashed to camelCase; used by the css and data modules\n  // Microsoft forgot to hump their vendor prefix (#9572)\n  camelCase: function( string ) {\n    return string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n  },\n\n  nodeName: function( elem, name ) {\n    return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();\n  },\n\n  // args is for internal usage only\n  each: function( object, callback, args ) {\n    var name, i = 0,\n      length = object.length,\n      isObj = length === undefined || jQuery.isFunction( object );\n\n    if ( args ) {\n      if ( isObj ) {\n        for ( name in object ) {\n          if ( callback.apply( object[ name ], args ) === false ) {\n            break;\n          }\n        }\n      } else {\n        for ( ; i < length; ) {\n          if ( callback.apply( object[ i++ ], args ) === false ) {\n            break;\n          }\n        }\n      }\n\n    // A special, fast, case for the most common use of each\n    } else {\n      if ( isObj ) {\n        for ( name in object ) {\n          if ( callback.call( object[ name ], name, object[ name ] ) === false ) {\n            break;\n          }\n        }\n      } else {\n        for ( ; i < length; ) {\n          if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {\n            break;\n          }\n        }\n      }\n    }\n\n    return object;\n  },\n\n  // Use native String.trim function wherever possible\n  trim: trim ?\n    function( text ) {\n      return text == null ?\n        \"\" :\n        trim.call( text );\n    } :\n\n    // Otherwise use our own trimming functionality\n    function( text ) {\n      return text == null ?\n        \"\" :\n        text.toString().replace( trimLeft, \"\" ).replace( trimRight, \"\" );\n    },\n\n  // results is for internal usage only\n  makeArray: function( array, results ) {\n    var ret = results || [];\n\n    if ( array != null ) {\n      // The window, strings (and functions) also have 'length'\n      // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930\n      var type = jQuery.type( array );\n\n      if ( array.length == null || type === \"string\" || type === \"function\" || type === \"regexp\" || jQuery.isWindow( array ) ) {\n        push.call( ret, array );\n      } else {\n        jQuery.merge( ret, array );\n      }\n    }\n\n    return ret;\n  },\n\n  inArray: function( elem, array, i ) {\n    var len;\n\n    if ( array ) {\n      if ( indexOf ) {\n        return indexOf.call( array, elem, i );\n      }\n\n      len = array.length;\n      i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;\n\n      for ( ; i < len; i++ ) {\n        // Skip accessing in sparse arrays\n        if ( i in array && array[ i ] === elem ) {\n          return i;\n        }\n      }\n    }\n\n    return -1;\n  },\n\n  merge: function( first, second ) {\n    var i = first.length,\n      j = 0;\n\n    if ( typeof second.length === \"number\" ) {\n      for ( var l = second.length; j < l; j++ ) {\n        first[ i++ ] = second[ j ];\n      }\n\n    } else {\n      while ( second[j] !== undefined ) {\n        first[ i++ ] = second[ j++ ];\n      }\n    }\n\n    first.length = i;\n\n    return first;\n  },\n\n  grep: function( elems, callback, inv ) {\n    var ret = [], retVal;\n    inv = !!inv;\n\n    // Go through the array, only saving the items\n    // that pass the validator function\n    for ( var i = 0, length = elems.length; i < length; i++ ) {\n      retVal = !!callback( elems[ i ], i );\n      if ( inv !== retVal ) {\n        ret.push( elems[ i ] );\n      }\n    }\n\n    return ret;\n  },\n\n  // arg is for internal usage only\n  map: function( elems, callback, arg ) {\n    var value, key, ret = [],\n      i = 0,\n      length = elems.length,\n      // jquery objects are treated as arrays\n      isArray = elems instanceof jQuery || length !== undefined && typeof length === \"number\" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;\n\n    // Go through the array, translating each of the items to their\n    if ( isArray ) {\n      for ( ; i < length; i++ ) {\n        value = callback( elems[ i ], i, arg );\n\n        if ( value != null ) {\n          ret[ ret.length ] = value;\n        }\n      }\n\n    // Go through every key on the object,\n    } else {\n      for ( key in elems ) {\n        value = callback( elems[ key ], key, arg );\n\n        if ( value != null ) {\n          ret[ ret.length ] = value;\n        }\n      }\n    }\n\n    // Flatten any nested arrays\n    return ret.concat.apply( [], ret );\n  },\n\n  // A global GUID counter for objects\n  guid: 1,\n\n  // Bind a function to a context, optionally partially applying any\n  // arguments.\n  proxy: function( fn, context ) {\n    if ( typeof context === \"string\" ) {\n      var tmp = fn[ context ];\n      context = fn;\n      fn = tmp;\n    }\n\n    // Quick check to determine if target is callable, in the spec\n    // this throws a TypeError, but we will just return undefined.\n    if ( !jQuery.isFunction( fn ) ) {\n      return undefined;\n    }\n\n    // Simulated bind\n    var args = slice.call( arguments, 2 ),\n      proxy = function() {\n        return fn.apply( context, args.concat( slice.call( arguments ) ) );\n      };\n\n    // Set the guid of unique handler to the same of original handler, so it can be removed\n    proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;\n\n    return proxy;\n  },\n\n  // Mutifunctional method to get and set values to a collection\n  // The value/s can optionally be executed if it's a function\n  access: function( elems, key, value, exec, fn, pass ) {\n    var length = elems.length;\n\n    // Setting many attributes\n    if ( typeof key === \"object\" ) {\n      for ( var k in key ) {\n        jQuery.access( elems, k, key[k], exec, fn, value );\n      }\n      return elems;\n    }\n\n    // Setting one attribute\n    if ( value !== undefined ) {\n      // Optionally, function values get executed if exec is true\n      exec = !pass && exec && jQuery.isFunction(value);\n\n      for ( var i = 0; i < length; i++ ) {\n        fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );\n      }\n\n      return elems;\n    }\n\n    // Getting an attribute\n    return length ? fn( elems[0], key ) : undefined;\n  },\n\n  now: function() {\n    return ( new Date() ).getTime();\n  },\n\n  // Use of jQuery.browser is frowned upon.\n  // More details: http://docs.jquery.com/Utilities/jQuery.browser\n  uaMatch: function( ua ) {\n    ua = ua.toLowerCase();\n\n    var match = rwebkit.exec( ua ) ||\n      ropera.exec( ua ) ||\n      rmsie.exec( ua ) ||\n      ua.indexOf(\"compatible\") < 0 && rmozilla.exec( ua ) ||\n      [];\n\n    return { browser: match[1] || \"\", version: match[2] || \"0\" };\n  },\n\n  sub: function() {\n    function jQuerySub( selector, context ) {\n      return new jQuerySub.fn.init( selector, context );\n    }\n    jQuery.extend( true, jQuerySub, this );\n    jQuerySub.superclass = this;\n    jQuerySub.fn = jQuerySub.prototype = this();\n    jQuerySub.fn.constructor = jQuerySub;\n    jQuerySub.sub = this.sub;\n    jQuerySub.fn.init = function init( selector, context ) {\n      if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {\n        context = jQuerySub( context );\n      }\n\n      return jQuery.fn.init.call( this, selector, context, rootjQuerySub );\n    };\n    jQuerySub.fn.init.prototype = jQuerySub.fn;\n    var rootjQuerySub = jQuerySub(document);\n    return jQuerySub;\n  },\n\n  browser: {}\n});\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object\".split(\" \"), function(i, name) {\n  class2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nbrowserMatch = jQuery.uaMatch( userAgent );\nif ( browserMatch.browser ) {\n  jQuery.browser[ browserMatch.browser ] = true;\n  jQuery.browser.version = browserMatch.version;\n}\n\n// Deprecated, use jQuery.browser.webkit instead\nif ( jQuery.browser.webkit ) {\n  jQuery.browser.safari = true;\n}\n\n// IE doesn't match non-breaking spaces with \\s\nif ( rnotwhite.test( \"\\xA0\" ) ) {\n  trimLeft = /^[\\s\\xA0]+/;\n  trimRight = /[\\s\\xA0]+$/;\n}\n\n// All jQuery objects should point back to these\nrootjQuery = jQuery(document);\n\n// Cleanup functions for the document ready method\nif ( document.addEventListener ) {\n  DOMContentLoaded = function() {\n    document.removeEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\n    jQuery.ready();\n  };\n\n} else if ( document.attachEvent ) {\n  DOMContentLoaded = function() {\n    // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n    if ( document.readyState === \"complete\" ) {\n      document.detachEvent( \"onreadystatechange\", DOMContentLoaded );\n      jQuery.ready();\n    }\n  };\n}\n\n// The DOM ready check for Internet Explorer\nfunction doScrollCheck() {\n  if ( jQuery.isReady ) {\n    return;\n  }\n\n  try {\n    // If IE is used, use the trick by Diego Perini\n    // http://javascript.nwbox.com/IEContentLoaded/\n    document.documentElement.doScroll(\"left\");\n  } catch(e) {\n    setTimeout( doScrollCheck, 1 );\n    return;\n  }\n\n  // and execute any waiting functions\n  jQuery.ready();\n}\n\nreturn jQuery;\n\n})();\n\n\n// String to Object flags format cache\nvar flagsCache = {};\n\n// Convert String-formatted flags into Object-formatted ones and store in cache\nfunction createFlags( flags ) {\n  var object = flagsCache[ flags ] = {},\n    i, length;\n  flags = flags.split( /\\s+/ );\n  for ( i = 0, length = flags.length; i < length; i++ ) {\n    object[ flags[i] ] = true;\n  }\n  return object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *  flags:  an optional list of space-separated flags that will change how\n *      the callback list behaves\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible flags:\n *\n *  once:     will ensure the callback list can only be fired once (like a Deferred)\n *\n *  memory:     will keep track of previous values and will call any callback added\n *          after the list has been fired right away with the latest \"memorized\"\n *          values (like a Deferred)\n *\n *  unique:     will ensure a callback can only be added once (no duplicate in the list)\n *\n *  stopOnFalse:  interrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( flags ) {\n\n  // Convert flags from String-formatted to Object-formatted\n  // (we check in cache first)\n  flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};\n\n  var // Actual callback list\n    list = [],\n    // Stack of fire calls for repeatable lists\n    stack = [],\n    // Last fire value (for non-forgettable lists)\n    memory,\n    // Flag to know if list is currently firing\n    firing,\n    // First callback to fire (used internally by add and fireWith)\n    firingStart,\n    // End of the loop when firing\n    firingLength,\n    // Index of currently firing callback (modified by remove if needed)\n    firingIndex,\n    // Add one or several callbacks to the list\n    add = function( args ) {\n      var i,\n        length,\n        elem,\n        type,\n        actual;\n      for ( i = 0, length = args.length; i < length; i++ ) {\n        elem = args[ i ];\n        type = jQuery.type( elem );\n        if ( type === \"array\" ) {\n          // Inspect recursively\n          add( elem );\n        } else if ( type === \"function\" ) {\n          // Add if not in unique mode and callback is not in\n          if ( !flags.unique || !self.has( elem ) ) {\n            list.push( elem );\n          }\n        }\n      }\n    },\n    // Fire callbacks\n    fire = function( context, args ) {\n      args = args || [];\n      memory = !flags.memory || [ context, args ];\n      firing = true;\n      firingIndex = firingStart || 0;\n      firingStart = 0;\n      firingLength = list.length;\n      for ( ; list && firingIndex < firingLength; firingIndex++ ) {\n        if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {\n          memory = true; // Mark as halted\n          break;\n        }\n      }\n      firing = false;\n      if ( list ) {\n        if ( !flags.once ) {\n          if ( stack && stack.length ) {\n            memory = stack.shift();\n            self.fireWith( memory[ 0 ], memory[ 1 ] );\n          }\n        } else if ( memory === true ) {\n          self.disable();\n        } else {\n          list = [];\n        }\n      }\n    },\n    // Actual Callbacks object\n    self = {\n      // Add a callback or a collection of callbacks to the list\n      add: function() {\n        if ( list ) {\n          var length = list.length;\n          add( arguments );\n          // Do we need to add the callbacks to the\n          // current firing batch?\n          if ( firing ) {\n            firingLength = list.length;\n          // With memory, if we're not firing then\n          // we should call right away, unless previous\n          // firing was halted (stopOnFalse)\n          } else if ( memory && memory !== true ) {\n            firingStart = length;\n            fire( memory[ 0 ], memory[ 1 ] );\n          }\n        }\n        return this;\n      },\n      // Remove a callback from the list\n      remove: function() {\n        if ( list ) {\n          var args = arguments,\n            argIndex = 0,\n            argLength = args.length;\n          for ( ; argIndex < argLength ; argIndex++ ) {\n            for ( var i = 0; i < list.length; i++ ) {\n              if ( args[ argIndex ] === list[ i ] ) {\n                // Handle firingIndex and firingLength\n                if ( firing ) {\n                  if ( i <= firingLength ) {\n                    firingLength--;\n                    if ( i <= firingIndex ) {\n                      firingIndex--;\n                    }\n                  }\n                }\n                // Remove the element\n                list.splice( i--, 1 );\n                // If we have some unicity property then\n                // we only need to do this once\n                if ( flags.unique ) {\n                  break;\n                }\n              }\n            }\n          }\n        }\n        return this;\n      },\n      // Control if a given callback is in the list\n      has: function( fn ) {\n        if ( list ) {\n          var i = 0,\n            length = list.length;\n          for ( ; i < length; i++ ) {\n            if ( fn === list[ i ] ) {\n              return true;\n            }\n          }\n        }\n        return false;\n      },\n      // Remove all callbacks from the list\n      empty: function() {\n        list = [];\n        return this;\n      },\n      // Have the list do nothing anymore\n      disable: function() {\n        list = stack = memory = undefined;\n        return this;\n      },\n      // Is it disabled?\n      disabled: function() {\n        return !list;\n      },\n      // Lock the list in its current state\n      lock: function() {\n        stack = undefined;\n        if ( !memory || memory === true ) {\n          self.disable();\n        }\n        return this;\n      },\n      // Is it locked?\n      locked: function() {\n        return !stack;\n      },\n      // Call all callbacks with the given context and arguments\n      fireWith: function( context, args ) {\n        if ( stack ) {\n          if ( firing ) {\n            if ( !flags.once ) {\n              stack.push( [ context, args ] );\n            }\n          } else if ( !( flags.once && memory ) ) {\n            fire( context, args );\n          }\n        }\n        return this;\n      },\n      // Call all the callbacks with the given arguments\n      fire: function() {\n        self.fireWith( this, arguments );\n        return this;\n      },\n      // To know if the callbacks have already been called at least once\n      fired: function() {\n        return !!memory;\n      }\n    };\n\n  return self;\n};\n\n\n\n\nvar // Static reference to slice\n  sliceDeferred = [].slice;\n\njQuery.extend({\n\n  Deferred: function( func ) {\n    var doneList = jQuery.Callbacks( \"once memory\" ),\n      failList = jQuery.Callbacks( \"once memory\" ),\n      progressList = jQuery.Callbacks( \"memory\" ),\n      state = \"pending\",\n      lists = {\n        resolve: doneList,\n        reject: failList,\n        notify: progressList\n      },\n      promise = {\n        done: doneList.add,\n        fail: failList.add,\n        progress: progressList.add,\n\n        state: function() {\n          return state;\n        },\n\n        // Deprecated\n        isResolved: doneList.fired,\n        isRejected: failList.fired,\n\n        then: function( doneCallbacks, failCallbacks, progressCallbacks ) {\n          deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );\n          return this;\n        },\n        always: function() {\n          deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );\n          return this;\n        },\n        pipe: function( fnDone, fnFail, fnProgress ) {\n          return jQuery.Deferred(function( newDefer ) {\n            jQuery.each( {\n              done: [ fnDone, \"resolve\" ],\n              fail: [ fnFail, \"reject\" ],\n              progress: [ fnProgress, \"notify\" ]\n            }, function( handler, data ) {\n              var fn = data[ 0 ],\n                action = data[ 1 ],\n                returned;\n              if ( jQuery.isFunction( fn ) ) {\n                deferred[ handler ](function() {\n                  returned = fn.apply( this, arguments );\n                  if ( returned && jQuery.isFunction( returned.promise ) ) {\n                    returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );\n                  } else {\n                    newDefer[ action + \"With\" ]( this === deferred ? newDefer : this, [ returned ] );\n                  }\n                });\n              } else {\n                deferred[ handler ]( newDefer[ action ] );\n              }\n            });\n          }).promise();\n        },\n        // Get a promise for this deferred\n        // If obj is provided, the promise aspect is added to the object\n        promise: function( obj ) {\n          if ( obj == null ) {\n            obj = promise;\n          } else {\n            for ( var key in promise ) {\n              obj[ key ] = promise[ key ];\n            }\n          }\n          return obj;\n        }\n      },\n      deferred = promise.promise({}),\n      key;\n\n    for ( key in lists ) {\n      deferred[ key ] = lists[ key ].fire;\n      deferred[ key + \"With\" ] = lists[ key ].fireWith;\n    }\n\n    // Handle state\n    deferred.done( function() {\n      state = \"resolved\";\n    }, failList.disable, progressList.lock ).fail( function() {\n      state = \"rejected\";\n    }, doneList.disable, progressList.lock );\n\n    // Call given func if any\n    if ( func ) {\n      func.call( deferred, deferred );\n    }\n\n    // All done!\n    return deferred;\n  },\n\n  // Deferred helper\n  when: function( firstParam ) {\n    var args = sliceDeferred.call( arguments, 0 ),\n      i = 0,\n      length = args.length,\n      pValues = new Array( length ),\n      count = length,\n      pCount = length,\n      deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?\n        firstParam :\n        jQuery.Deferred(),\n      promise = deferred.promise();\n    function resolveFunc( i ) {\n      return function( value ) {\n        args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;\n        if ( !( --count ) ) {\n          deferred.resolveWith( deferred, args );\n        }\n      };\n    }\n    function progressFunc( i ) {\n      return function( value ) {\n        pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;\n        deferred.notifyWith( promise, pValues );\n      };\n    }\n    if ( length > 1 ) {\n      for ( ; i < length; i++ ) {\n        if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {\n          args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );\n        } else {\n          --count;\n        }\n      }\n      if ( !count ) {\n        deferred.resolveWith( deferred, args );\n      }\n    } else if ( deferred !== firstParam ) {\n      deferred.resolveWith( deferred, length ? [ firstParam ] : [] );\n    }\n    return promise;\n  }\n});\n\n\n\n\njQuery.support = (function() {\n\n  var support,\n    all,\n    a,\n    select,\n    opt,\n    input,\n    marginDiv,\n    fragment,\n    tds,\n    events,\n    eventName,\n    i,\n    isSupported,\n    div = document.createElement( \"div\" ),\n    documentElement = document.documentElement;\n\n  // Preliminary tests\n  div.setAttribute(\"className\", \"t\");\n  div.innerHTML = \"   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>\";\n\n  all = div.getElementsByTagName( \"*\" );\n  a = div.getElementsByTagName( \"a\" )[ 0 ];\n\n  // Can't get basic test support\n  if ( !all || !all.length || !a ) {\n    return {};\n  }\n\n  // First batch of supports tests\n  select = document.createElement( \"select\" );\n  opt = select.appendChild( document.createElement(\"option\") );\n  input = div.getElementsByTagName( \"input\" )[ 0 ];\n\n  support = {\n    // IE strips leading whitespace when .innerHTML is used\n    leadingWhitespace: ( div.firstChild.nodeType === 3 ),\n\n    // Make sure that tbody elements aren't automatically inserted\n    // IE will insert them into empty tables\n    tbody: !div.getElementsByTagName(\"tbody\").length,\n\n    // Make sure that link elements get serialized correctly by innerHTML\n    // This requires a wrapper element in IE\n    htmlSerialize: !!div.getElementsByTagName(\"link\").length,\n\n    // Get the style information from getAttribute\n    // (IE uses .cssText instead)\n    style: /top/.test( a.getAttribute(\"style\") ),\n\n    // Make sure that URLs aren't manipulated\n    // (IE normalizes it by default)\n    hrefNormalized: ( a.getAttribute(\"href\") === \"/a\" ),\n\n    // Make sure that element opacity exists\n    // (IE uses filter instead)\n    // Use a regex to work around a WebKit issue. See #5145\n    opacity: /^0.55/.test( a.style.opacity ),\n\n    // Verify style float existence\n    // (IE uses styleFloat instead of cssFloat)\n    cssFloat: !!a.style.cssFloat,\n\n    // Make sure that if no value is specified for a checkbox\n    // that it defaults to \"on\".\n    // (WebKit defaults to \"\" instead)\n    checkOn: ( input.value === \"on\" ),\n\n    // Make sure that a selected-by-default option has a working selected property.\n    // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n    optSelected: opt.selected,\n\n    // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\n    getSetAttribute: div.className !== \"t\",\n\n    // Tests for enctype support on a form(#6743)\n    enctype: !!document.createElement(\"form\").enctype,\n\n    // Makes sure cloning an html5 element does not cause problems\n    // Where outerHTML is undefined, this still works\n    html5Clone: document.createElement(\"nav\").cloneNode( true ).outerHTML !== \"<:nav></:nav>\",\n\n    // Will be defined later\n    submitBubbles: true,\n    changeBubbles: true,\n    focusinBubbles: false,\n    deleteExpando: true,\n    noCloneEvent: true,\n    inlineBlockNeedsLayout: false,\n    shrinkWrapBlocks: false,\n    reliableMarginRight: true\n  };\n\n  // Make sure checked status is properly cloned\n  input.checked = true;\n  support.noCloneChecked = input.cloneNode( true ).checked;\n\n  // Make sure that the options inside disabled selects aren't marked as disabled\n  // (WebKit marks them as disabled)\n  select.disabled = true;\n  support.optDisabled = !opt.disabled;\n\n  // Test to see if it's possible to delete an expando from an element\n  // Fails in Internet Explorer\n  try {\n    delete div.test;\n  } catch( e ) {\n    support.deleteExpando = false;\n  }\n\n  if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {\n    div.attachEvent( \"onclick\", function() {\n      // Cloning a node shouldn't copy over any\n      // bound event handlers (IE does this)\n      support.noCloneEvent = false;\n    });\n    div.cloneNode( true ).fireEvent( \"onclick\" );\n  }\n\n  // Check if a radio maintains its value\n  // after being appended to the DOM\n  input = document.createElement(\"input\");\n  input.value = \"t\";\n  input.setAttribute(\"type\", \"radio\");\n  support.radioValue = input.value === \"t\";\n\n  input.setAttribute(\"checked\", \"checked\");\n  div.appendChild( input );\n  fragment = document.createDocumentFragment();\n  fragment.appendChild( div.lastChild );\n\n  // WebKit doesn't clone checked state correctly in fragments\n  support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n  // Check if a disconnected checkbox will retain its checked\n  // value of true after appended to the DOM (IE6/7)\n  support.appendChecked = input.checked;\n\n  fragment.removeChild( input );\n  fragment.appendChild( div );\n\n  div.innerHTML = \"\";\n\n  // Check if div with explicit width and no margin-right incorrectly\n  // gets computed margin-right based on width of container. For more\n  // info see bug #3333\n  // Fails in WebKit before Feb 2011 nightlies\n  // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n  if ( window.getComputedStyle ) {\n    marginDiv = document.createElement( \"div\" );\n    marginDiv.style.width = \"0\";\n    marginDiv.style.marginRight = \"0\";\n    div.style.width = \"2px\";\n    div.appendChild( marginDiv );\n    support.reliableMarginRight =\n      ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;\n  }\n\n  // Technique from Juriy Zaytsev\n  // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/\n  // We only care about the case where non-standard event systems\n  // are used, namely in IE. Short-circuiting here helps us to\n  // avoid an eval call (in setAttribute) which can cause CSP\n  // to go haywire. See: https://developer.mozilla.org/en/Security/CSP\n  if ( div.attachEvent ) {\n    for( i in {\n      submit: 1,\n      change: 1,\n      focusin: 1\n    }) {\n      eventName = \"on\" + i;\n      isSupported = ( eventName in div );\n      if ( !isSupported ) {\n        div.setAttribute( eventName, \"return;\" );\n        isSupported = ( typeof div[ eventName ] === \"function\" );\n      }\n      support[ i + \"Bubbles\" ] = isSupported;\n    }\n  }\n\n  fragment.removeChild( div );\n\n  // Null elements to avoid leaks in IE\n  fragment = select = opt = marginDiv = div = input = null;\n\n  // Run tests that need a body at doc ready\n  jQuery(function() {\n    var container, outer, inner, table, td, offsetSupport,\n      conMarginTop, ptlm, vb, style, html,\n      body = document.getElementsByTagName(\"body\")[0];\n\n    if ( !body ) {\n      // Return for frameset docs that don't have a body\n      return;\n    }\n\n    conMarginTop = 1;\n    ptlm = \"position:absolute;top:0;left:0;width:1px;height:1px;margin:0;\";\n    vb = \"visibility:hidden;border:0;\";\n    style = \"style='\" + ptlm + \"border:5px solid #000;padding:0;'\";\n    html = \"<div \" + style + \"><div></div></div>\" +\n      \"<table \" + style + \" cellpadding='0' cellspacing='0'>\" +\n      \"<tr><td></td></tr></table>\";\n\n    container = document.createElement(\"div\");\n    container.style.cssText = vb + \"width:0;height:0;position:static;top:0;margin-top:\" + conMarginTop + \"px\";\n    body.insertBefore( container, body.firstChild );\n\n    // Construct the test element\n    div = document.createElement(\"div\");\n    container.appendChild( div );\n\n    // Check if table cells still have offsetWidth/Height when they are set\n    // to display:none and there are still other visible table cells in a\n    // table row; if so, offsetWidth/Height are not reliable for use when\n    // determining if an element has been hidden directly using\n    // display:none (it is still safe to use offsets if a parent element is\n    // hidden; don safety goggles and see bug #4512 for more information).\n    // (only IE 8 fails this test)\n    div.innerHTML = \"<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>\";\n    tds = div.getElementsByTagName( \"td\" );\n    isSupported = ( tds[ 0 ].offsetHeight === 0 );\n\n    tds[ 0 ].style.display = \"\";\n    tds[ 1 ].style.display = \"none\";\n\n    // Check if empty table cells still have offsetWidth/Height\n    // (IE <= 8 fail this test)\n    support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );\n\n    // Figure out if the W3C box model works as expected\n    div.innerHTML = \"\";\n    div.style.width = div.style.paddingLeft = \"1px\";\n    jQuery.boxModel = support.boxModel = div.offsetWidth === 2;\n\n    if ( typeof div.style.zoom !== \"undefined\" ) {\n      // Check if natively block-level elements act like inline-block\n      // elements when setting their display to 'inline' and giving\n      // them layout\n      // (IE < 8 does this)\n      div.style.display = \"inline\";\n      div.style.zoom = 1;\n      support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );\n\n      // Check if elements with layout shrink-wrap their children\n      // (IE 6 does this)\n      div.style.display = \"\";\n      div.innerHTML = \"<div style='width:4px;'></div>\";\n      support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );\n    }\n\n    div.style.cssText = ptlm + vb;\n    div.innerHTML = html;\n\n    outer = div.firstChild;\n    inner = outer.firstChild;\n    td = outer.nextSibling.firstChild.firstChild;\n\n    offsetSupport = {\n      doesNotAddBorder: ( inner.offsetTop !== 5 ),\n      doesAddBorderForTableAndCells: ( td.offsetTop === 5 )\n    };\n\n    inner.style.position = \"fixed\";\n    inner.style.top = \"20px\";\n\n    // safari subtracts parent border width here which is 5px\n    offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );\n    inner.style.position = inner.style.top = \"\";\n\n    outer.style.overflow = \"hidden\";\n    outer.style.position = \"relative\";\n\n    offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );\n    offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );\n\n    body.removeChild( container );\n    div  = container = null;\n\n    jQuery.extend( support, offsetSupport );\n  });\n\n  return support;\n})();\n\n\n\n\nvar rbrace = /^(?:\\{.*\\}|\\[.*\\])$/,\n  rmultiDash = /([A-Z])/g;\n\njQuery.extend({\n  cache: {},\n\n  // Please use with caution\n  uuid: 0,\n\n  // Unique for each copy of jQuery on the page\n  // Non-digits removed to match rinlinejQuery\n  expando: \"jQuery\" + ( jQuery.fn.jquery + Math.random() ).replace( /\\D/g, \"\" ),\n\n  // The following elements throw uncatchable exceptions if you\n  // attempt to add expando properties to them.\n  noData: {\n    \"embed\": true,\n    // Ban all objects except for Flash (which handle expandos)\n    \"object\": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",\n    \"applet\": true\n  },\n\n  hasData: function( elem ) {\n    elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];\n    return !!elem && !isEmptyDataObject( elem );\n  },\n\n  data: function( elem, name, data, pvt /* Internal Use Only */ ) {\n    if ( !jQuery.acceptData( elem ) ) {\n      return;\n    }\n\n    var privateCache, thisCache, ret,\n      internalKey = jQuery.expando,\n      getByName = typeof name === \"string\",\n\n      // We have to handle DOM nodes and JS objects differently because IE6-7\n      // can't GC object references properly across the DOM-JS boundary\n      isNode = elem.nodeType,\n\n      // Only DOM nodes need the global jQuery cache; JS object data is\n      // attached directly to the object so GC can occur automatically\n      cache = isNode ? jQuery.cache : elem,\n\n      // Only defining an ID for JS objects if its cache already exists allows\n      // the code to shortcut on the same path as a DOM node with no cache\n      id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,\n      isEvents = name === \"events\";\n\n    // Avoid doing any more work than we need to when trying to get data on an\n    // object that has no data at all\n    if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {\n      return;\n    }\n\n    if ( !id ) {\n      // Only DOM nodes need a new unique ID for each element since their data\n      // ends up in the global cache\n      if ( isNode ) {\n        elem[ internalKey ] = id = ++jQuery.uuid;\n      } else {\n        id = internalKey;\n      }\n    }\n\n    if ( !cache[ id ] ) {\n      cache[ id ] = {};\n\n      // Avoids exposing jQuery metadata on plain JS objects when the object\n      // is serialized using JSON.stringify\n      if ( !isNode ) {\n        cache[ id ].toJSON = jQuery.noop;\n      }\n    }\n\n    // An object can be passed to jQuery.data instead of a key/value pair; this gets\n    // shallow copied over onto the existing cache\n    if ( typeof name === \"object\" || typeof name === \"function\" ) {\n      if ( pvt ) {\n        cache[ id ] = jQuery.extend( cache[ id ], name );\n      } else {\n        cache[ id ].data = jQuery.extend( cache[ id ].data, name );\n      }\n    }\n\n    privateCache = thisCache = cache[ id ];\n\n    // jQuery data() is stored in a separate object inside the object's internal data\n    // cache in order to avoid key collisions between internal data and user-defined\n    // data.\n    if ( !pvt ) {\n      if ( !thisCache.data ) {\n        thisCache.data = {};\n      }\n\n      thisCache = thisCache.data;\n    }\n\n    if ( data !== undefined ) {\n      thisCache[ jQuery.camelCase( name ) ] = data;\n    }\n\n    // Users should not attempt to inspect the internal events object using jQuery.data,\n    // it is undocumented and subject to change. But does anyone listen? No.\n    if ( isEvents && !thisCache[ name ] ) {\n      return privateCache.events;\n    }\n\n    // Check for both converted-to-camel and non-converted data property names\n    // If a data property was specified\n    if ( getByName ) {\n\n      // First Try to find as-is property data\n      ret = thisCache[ name ];\n\n      // Test for null|undefined property data\n      if ( ret == null ) {\n\n        // Try to find the camelCased property\n        ret = thisCache[ jQuery.camelCase( name ) ];\n      }\n    } else {\n      ret = thisCache;\n    }\n\n    return ret;\n  },\n\n  removeData: function( elem, name, pvt /* Internal Use Only */ ) {\n    if ( !jQuery.acceptData( elem ) ) {\n      return;\n    }\n\n    var thisCache, i, l,\n\n      // Reference to internal data cache key\n      internalKey = jQuery.expando,\n\n      isNode = elem.nodeType,\n\n      // See jQuery.data for more information\n      cache = isNode ? jQuery.cache : elem,\n\n      // See jQuery.data for more information\n      id = isNode ? elem[ internalKey ] : internalKey;\n\n    // If there is already no cache entry for this object, there is no\n    // purpose in continuing\n    if ( !cache[ id ] ) {\n      return;\n    }\n\n    if ( name ) {\n\n      thisCache = pvt ? cache[ id ] : cache[ id ].data;\n\n      if ( thisCache ) {\n\n        // Support array or space separated string names for data keys\n        if ( !jQuery.isArray( name ) ) {\n\n          // try the string as a key before any manipulation\n          if ( name in thisCache ) {\n            name = [ name ];\n          } else {\n\n            // split the camel cased version by spaces unless a key with the spaces exists\n            name = jQuery.camelCase( name );\n            if ( name in thisCache ) {\n              name = [ name ];\n            } else {\n              name = name.split( \" \" );\n            }\n          }\n        }\n\n        for ( i = 0, l = name.length; i < l; i++ ) {\n          delete thisCache[ name[i] ];\n        }\n\n        // If there is no data left in the cache, we want to continue\n        // and let the cache object itself get destroyed\n        if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {\n          return;\n        }\n      }\n    }\n\n    // See jQuery.data for more information\n    if ( !pvt ) {\n      delete cache[ id ].data;\n\n      // Don't destroy the parent cache unless the internal data object\n      // had been the only thing left in it\n      if ( !isEmptyDataObject(cache[ id ]) ) {\n        return;\n      }\n    }\n\n    // Browsers that fail expando deletion also refuse to delete expandos on\n    // the window, but it will allow it on all other JS objects; other browsers\n    // don't care\n    // Ensure that `cache` is not a window object #10080\n    if ( jQuery.support.deleteExpando || !cache.setInterval ) {\n      delete cache[ id ];\n    } else {\n      cache[ id ] = null;\n    }\n\n    // We destroyed the cache and need to eliminate the expando on the node to avoid\n    // false lookups in the cache for entries that no longer exist\n    if ( isNode ) {\n      // IE does not allow us to delete expando properties from nodes,\n      // nor does it have a removeAttribute function on Document nodes;\n      // we must handle all of these cases\n      if ( jQuery.support.deleteExpando ) {\n        delete elem[ internalKey ];\n      } else if ( elem.removeAttribute ) {\n        elem.removeAttribute( internalKey );\n      } else {\n        elem[ internalKey ] = null;\n      }\n    }\n  },\n\n  // For internal use only.\n  _data: function( elem, name, data ) {\n    return jQuery.data( elem, name, data, true );\n  },\n\n  // A method for determining if a DOM node can handle the data expando\n  acceptData: function( elem ) {\n    if ( elem.nodeName ) {\n      var match = jQuery.noData[ elem.nodeName.toLowerCase() ];\n\n      if ( match ) {\n        return !(match === true || elem.getAttribute(\"classid\") !== match);\n      }\n    }\n\n    return true;\n  }\n});\n\njQuery.fn.extend({\n  data: function( key, value ) {\n    var parts, attr, name,\n      data = null;\n\n    if ( typeof key === \"undefined\" ) {\n      if ( this.length ) {\n        data = jQuery.data( this[0] );\n\n        if ( this[0].nodeType === 1 && !jQuery._data( this[0], \"parsedAttrs\" ) ) {\n          attr = this[0].attributes;\n          for ( var i = 0, l = attr.length; i < l; i++ ) {\n            name = attr[i].name;\n\n            if ( name.indexOf( \"data-\" ) === 0 ) {\n              name = jQuery.camelCase( name.substring(5) );\n\n              dataAttr( this[0], name, data[ name ] );\n            }\n          }\n          jQuery._data( this[0], \"parsedAttrs\", true );\n        }\n      }\n\n      return data;\n\n    } else if ( typeof key === \"object\" ) {\n      return this.each(function() {\n        jQuery.data( this, key );\n      });\n    }\n\n    parts = key.split(\".\");\n    parts[1] = parts[1] ? \".\" + parts[1] : \"\";\n\n    if ( value === undefined ) {\n      data = this.triggerHandler(\"getData\" + parts[1] + \"!\", [parts[0]]);\n\n      // Try to fetch any internally stored data first\n      if ( data === undefined && this.length ) {\n        data = jQuery.data( this[0], key );\n        data = dataAttr( this[0], key, data );\n      }\n\n      return data === undefined && parts[1] ?\n        this.data( parts[0] ) :\n        data;\n\n    } else {\n      return this.each(function() {\n        var self = jQuery( this ),\n          args = [ parts[0], value ];\n\n        self.triggerHandler( \"setData\" + parts[1] + \"!\", args );\n        jQuery.data( this, key, value );\n        self.triggerHandler( \"changeData\" + parts[1] + \"!\", args );\n      });\n    }\n  },\n\n  removeData: function( key ) {\n    return this.each(function() {\n      jQuery.removeData( this, key );\n    });\n  }\n});\n\nfunction dataAttr( elem, key, data ) {\n  // If nothing was found internally, try to fetch any\n  // data from the HTML5 data-* attribute\n  if ( data === undefined && elem.nodeType === 1 ) {\n\n    var name = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\n    data = elem.getAttribute( name );\n\n    if ( typeof data === \"string\" ) {\n      try {\n        data = data === \"true\" ? true :\n        data === \"false\" ? false :\n        data === \"null\" ? null :\n        jQuery.isNumeric( data ) ? parseFloat( data ) :\n          rbrace.test( data ) ? jQuery.parseJSON( data ) :\n          data;\n      } catch( e ) {}\n\n      // Make sure we set the data so it isn't changed later\n      jQuery.data( elem, key, data );\n\n    } else {\n      data = undefined;\n    }\n  }\n\n  return data;\n}\n\n// checks a cache object for emptiness\nfunction isEmptyDataObject( obj ) {\n  for ( var name in obj ) {\n\n    // if the public data object is empty, the private is still empty\n    if ( name === \"data\" && jQuery.isEmptyObject( obj[name] ) ) {\n      continue;\n    }\n    if ( name !== \"toJSON\" ) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\n\n\n\nfunction handleQueueMarkDefer( elem, type, src ) {\n  var deferDataKey = type + \"defer\",\n    queueDataKey = type + \"queue\",\n    markDataKey = type + \"mark\",\n    defer = jQuery._data( elem, deferDataKey );\n  if ( defer &&\n    ( src === \"queue\" || !jQuery._data(elem, queueDataKey) ) &&\n    ( src === \"mark\" || !jQuery._data(elem, markDataKey) ) ) {\n    // Give room for hard-coded callbacks to fire first\n    // and eventually mark/queue something else on the element\n    setTimeout( function() {\n      if ( !jQuery._data( elem, queueDataKey ) &&\n        !jQuery._data( elem, markDataKey ) ) {\n        jQuery.removeData( elem, deferDataKey, true );\n        defer.fire();\n      }\n    }, 0 );\n  }\n}\n\njQuery.extend({\n\n  _mark: function( elem, type ) {\n    if ( elem ) {\n      type = ( type || \"fx\" ) + \"mark\";\n      jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );\n    }\n  },\n\n  _unmark: function( force, elem, type ) {\n    if ( force !== true ) {\n      type = elem;\n      elem = force;\n      force = false;\n    }\n    if ( elem ) {\n      type = type || \"fx\";\n      var key = type + \"mark\",\n        count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );\n      if ( count ) {\n        jQuery._data( elem, key, count );\n      } else {\n        jQuery.removeData( elem, key, true );\n        handleQueueMarkDefer( elem, type, \"mark\" );\n      }\n    }\n  },\n\n  queue: function( elem, type, data ) {\n    var q;\n    if ( elem ) {\n      type = ( type || \"fx\" ) + \"queue\";\n      q = jQuery._data( elem, type );\n\n      // Speed up dequeue by getting out quickly if this is just a lookup\n      if ( data ) {\n        if ( !q || jQuery.isArray(data) ) {\n          q = jQuery._data( elem, type, jQuery.makeArray(data) );\n        } else {\n          q.push( data );\n        }\n      }\n      return q || [];\n    }\n  },\n\n  dequeue: function( elem, type ) {\n    type = type || \"fx\";\n\n    var queue = jQuery.queue( elem, type ),\n      fn = queue.shift(),\n      hooks = {};\n\n    // If the fx queue is dequeued, always remove the progress sentinel\n    if ( fn === \"inprogress\" ) {\n      fn = queue.shift();\n    }\n\n    if ( fn ) {\n      // Add a progress sentinel to prevent the fx queue from being\n      // automatically dequeued\n      if ( type === \"fx\" ) {\n        queue.unshift( \"inprogress\" );\n      }\n\n      jQuery._data( elem, type + \".run\", hooks );\n      fn.call( elem, function() {\n        jQuery.dequeue( elem, type );\n      }, hooks );\n    }\n\n    if ( !queue.length ) {\n      jQuery.removeData( elem, type + \"queue \" + type + \".run\", true );\n      handleQueueMarkDefer( elem, type, \"queue\" );\n    }\n  }\n});\n\njQuery.fn.extend({\n  queue: function( type, data ) {\n    if ( typeof type !== \"string\" ) {\n      data = type;\n      type = \"fx\";\n    }\n\n    if ( data === undefined ) {\n      return jQuery.queue( this[0], type );\n    }\n    return this.each(function() {\n      var queue = jQuery.queue( this, type, data );\n\n      if ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n        jQuery.dequeue( this, type );\n      }\n    });\n  },\n  dequeue: function( type ) {\n    return this.each(function() {\n      jQuery.dequeue( this, type );\n    });\n  },\n  // Based off of the plugin by Clint Helfers, with permission.\n  // http://blindsignals.com/index.php/2009/07/jquery-delay/\n  delay: function( time, type ) {\n    time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n    type = type || \"fx\";\n\n    return this.queue( type, function( next, hooks ) {\n      var timeout = setTimeout( next, time );\n      hooks.stop = function() {\n        clearTimeout( timeout );\n      };\n    });\n  },\n  clearQueue: function( type ) {\n    return this.queue( type || \"fx\", [] );\n  },\n  // Get a promise resolved when queues of a certain type\n  // are emptied (fx is the type by default)\n  promise: function( type, object ) {\n    if ( typeof type !== \"string\" ) {\n      object = type;\n      type = undefined;\n    }\n    type = type || \"fx\";\n    var defer = jQuery.Deferred(),\n      elements = this,\n      i = elements.length,\n      count = 1,\n      deferDataKey = type + \"defer\",\n      queueDataKey = type + \"queue\",\n      markDataKey = type + \"mark\",\n      tmp;\n    function resolve() {\n      if ( !( --count ) ) {\n        defer.resolveWith( elements, [ elements ] );\n      }\n    }\n    while( i-- ) {\n      if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||\n          ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||\n            jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&\n          jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( \"once memory\" ), true ) )) {\n        count++;\n        tmp.add( resolve );\n      }\n    }\n    resolve();\n    return defer.promise();\n  }\n});\n\n\n\n\nvar rclass = /[\\n\\t\\r]/g,\n  rspace = /\\s+/,\n  rreturn = /\\r/g,\n  rtype = /^(?:button|input)$/i,\n  rfocusable = /^(?:button|input|object|select|textarea)$/i,\n  rclickable = /^a(?:rea)?$/i,\n  rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,\n  getSetAttribute = jQuery.support.getSetAttribute,\n  nodeHook, boolHook, fixSpecified;\n\njQuery.fn.extend({\n  attr: function( name, value ) {\n    return jQuery.access( this, name, value, true, jQuery.attr );\n  },\n\n  removeAttr: function( name ) {\n    return this.each(function() {\n      jQuery.removeAttr( this, name );\n    });\n  },\n\n  prop: function( name, value ) {\n    return jQuery.access( this, name, value, true, jQuery.prop );\n  },\n\n  removeProp: function( name ) {\n    name = jQuery.propFix[ name ] || name;\n    return this.each(function() {\n      // try/catch handles cases where IE balks (such as removing a property on window)\n      try {\n        this[ name ] = undefined;\n        delete this[ name ];\n      } catch( e ) {}\n    });\n  },\n\n  addClass: function( value ) {\n    var classNames, i, l, elem,\n      setClass, c, cl;\n\n    if ( jQuery.isFunction( value ) ) {\n      return this.each(function( j ) {\n        jQuery( this ).addClass( value.call(this, j, this.className) );\n      });\n    }\n\n    if ( value && typeof value === \"string\" ) {\n      classNames = value.split( rspace );\n\n      for ( i = 0, l = this.length; i < l; i++ ) {\n        elem = this[ i ];\n\n        if ( elem.nodeType === 1 ) {\n          if ( !elem.className && classNames.length === 1 ) {\n            elem.className = value;\n\n          } else {\n            setClass = \" \" + elem.className + \" \";\n\n            for ( c = 0, cl = classNames.length; c < cl; c++ ) {\n              if ( !~setClass.indexOf( \" \" + classNames[ c ] + \" \" ) ) {\n                setClass += classNames[ c ] + \" \";\n              }\n            }\n            elem.className = jQuery.trim( setClass );\n          }\n        }\n      }\n    }\n\n    return this;\n  },\n\n  removeClass: function( value ) {\n    var classNames, i, l, elem, className, c, cl;\n\n    if ( jQuery.isFunction( value ) ) {\n      return this.each(function( j ) {\n        jQuery( this ).removeClass( value.call(this, j, this.className) );\n      });\n    }\n\n    if ( (value && typeof value === \"string\") || value === undefined ) {\n      classNames = ( value || \"\" ).split( rspace );\n\n      for ( i = 0, l = this.length; i < l; i++ ) {\n        elem = this[ i ];\n\n        if ( elem.nodeType === 1 && elem.className ) {\n          if ( value ) {\n            className = (\" \" + elem.className + \" \").replace( rclass, \" \" );\n            for ( c = 0, cl = classNames.length; c < cl; c++ ) {\n              className = className.replace(\" \" + classNames[ c ] + \" \", \" \");\n            }\n            elem.className = jQuery.trim( className );\n\n          } else {\n            elem.className = \"\";\n          }\n        }\n      }\n    }\n\n    return this;\n  },\n\n  toggleClass: function( value, stateVal ) {\n    var type = typeof value,\n      isBool = typeof stateVal === \"boolean\";\n\n    if ( jQuery.isFunction( value ) ) {\n      return this.each(function( i ) {\n        jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\n      });\n    }\n\n    return this.each(function() {\n      if ( type === \"string\" ) {\n        // toggle individual class names\n        var className,\n          i = 0,\n          self = jQuery( this ),\n          state = stateVal,\n          classNames = value.split( rspace );\n\n        while ( (className = classNames[ i++ ]) ) {\n          // check each className given, space seperated list\n          state = isBool ? state : !self.hasClass( className );\n          self[ state ? \"addClass\" : \"removeClass\" ]( className );\n        }\n\n      } else if ( type === \"undefined\" || type === \"boolean\" ) {\n        if ( this.className ) {\n          // store className if set\n          jQuery._data( this, \"__className__\", this.className );\n        }\n\n        // toggle whole className\n        this.className = this.className || value === false ? \"\" : jQuery._data( this, \"__className__\" ) || \"\";\n      }\n    });\n  },\n\n  hasClass: function( selector ) {\n    var className = \" \" + selector + \" \",\n      i = 0,\n      l = this.length;\n    for ( ; i < l; i++ ) {\n      if ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) > -1 ) {\n        return true;\n      }\n    }\n\n    return false;\n  },\n\n  val: function( value ) {\n    var hooks, ret, isFunction,\n      elem = this[0];\n\n    if ( !arguments.length ) {\n      if ( elem ) {\n        hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];\n\n        if ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n          return ret;\n        }\n\n        ret = elem.value;\n\n        return typeof ret === \"string\" ?\n          // handle most common string cases\n          ret.replace(rreturn, \"\") :\n          // handle cases where value is null/undef or number\n          ret == null ? \"\" : ret;\n      }\n\n      return;\n    }\n\n    isFunction = jQuery.isFunction( value );\n\n    return this.each(function( i ) {\n      var self = jQuery(this), val;\n\n      if ( this.nodeType !== 1 ) {\n        return;\n      }\n\n      if ( isFunction ) {\n        val = value.call( this, i, self.val() );\n      } else {\n        val = value;\n      }\n\n      // Treat null/undefined as \"\"; convert numbers to string\n      if ( val == null ) {\n        val = \"\";\n      } else if ( typeof val === \"number\" ) {\n        val += \"\";\n      } else if ( jQuery.isArray( val ) ) {\n        val = jQuery.map(val, function ( value ) {\n          return value == null ? \"\" : value + \"\";\n        });\n      }\n\n      hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];\n\n      // If set returns undefined, fall back to normal setting\n      if ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n        this.value = val;\n      }\n    });\n  }\n});\n\njQuery.extend({\n  valHooks: {\n    option: {\n      get: function( elem ) {\n        // attributes.value is undefined in Blackberry 4.7 but\n        // uses .value. See #6932\n        var val = elem.attributes.value;\n        return !val || val.specified ? elem.value : elem.text;\n      }\n    },\n    select: {\n      get: function( elem ) {\n        var value, i, max, option,\n          index = elem.selectedIndex,\n          values = [],\n          options = elem.options,\n          one = elem.type === \"select-one\";\n\n        // Nothing was selected\n        if ( index < 0 ) {\n          return null;\n        }\n\n        // Loop through all the selected options\n        i = one ? index : 0;\n        max = one ? index + 1 : options.length;\n        for ( ; i < max; i++ ) {\n          option = options[ i ];\n\n          // Don't return options that are disabled or in a disabled optgroup\n          if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null) &&\n              (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" )) ) {\n\n            // Get the specific value for the option\n            value = jQuery( option ).val();\n\n            // We don't need an array for one selects\n            if ( one ) {\n              return value;\n            }\n\n            // Multi-Selects return an array\n            values.push( value );\n          }\n        }\n\n        // Fixes Bug #2551 -- select.val() broken in IE after form.reset()\n        if ( one && !values.length && options.length ) {\n          return jQuery( options[ index ] ).val();\n        }\n\n        return values;\n      },\n\n      set: function( elem, value ) {\n        var values = jQuery.makeArray( value );\n\n        jQuery(elem).find(\"option\").each(function() {\n          this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;\n        });\n\n        if ( !values.length ) {\n          elem.selectedIndex = -1;\n        }\n        return values;\n      }\n    }\n  },\n\n  attrFn: {\n    val: true,\n    css: true,\n    html: true,\n    text: true,\n    data: true,\n    width: true,\n    height: true,\n    offset: true\n  },\n\n  attr: function( elem, name, value, pass ) {\n    var ret, hooks, notxml,\n      nType = elem.nodeType;\n\n    // don't get/set attributes on text, comment and attribute nodes\n    if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n      return;\n    }\n\n    if ( pass && name in jQuery.attrFn ) {\n      return jQuery( elem )[ name ]( value );\n    }\n\n    // Fallback to prop when attributes are not supported\n    if ( typeof elem.getAttribute === \"undefined\" ) {\n      return jQuery.prop( elem, name, value );\n    }\n\n    notxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n    // All attributes are lowercase\n    // Grab necessary hook if one is defined\n    if ( notxml ) {\n      name = name.toLowerCase();\n      hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );\n    }\n\n    if ( value !== undefined ) {\n\n      if ( value === null ) {\n        jQuery.removeAttr( elem, name );\n        return;\n\n      } else if ( hooks && \"set\" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {\n        return ret;\n\n      } else {\n        elem.setAttribute( name, \"\" + value );\n        return value;\n      }\n\n    } else if ( hooks && \"get\" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {\n      return ret;\n\n    } else {\n\n      ret = elem.getAttribute( name );\n\n      // Non-existent attributes return null, we normalize to undefined\n      return ret === null ?\n        undefined :\n        ret;\n    }\n  },\n\n  removeAttr: function( elem, value ) {\n    var propName, attrNames, name, l,\n      i = 0;\n\n    if ( value && elem.nodeType === 1 ) {\n      attrNames = value.toLowerCase().split( rspace );\n      l = attrNames.length;\n\n      for ( ; i < l; i++ ) {\n        name = attrNames[ i ];\n\n        if ( name ) {\n          propName = jQuery.propFix[ name ] || name;\n\n          // See #9699 for explanation of this approach (setting first, then removal)\n          jQuery.attr( elem, name, \"\" );\n          elem.removeAttribute( getSetAttribute ? name : propName );\n\n          // Set corresponding property to false for boolean attributes\n          if ( rboolean.test( name ) && propName in elem ) {\n            elem[ propName ] = false;\n          }\n        }\n      }\n    }\n  },\n\n  attrHooks: {\n    type: {\n      set: function( elem, value ) {\n        // We can't allow the type property to be changed (since it causes problems in IE)\n        if ( rtype.test( elem.nodeName ) && elem.parentNode ) {\n          jQuery.error( \"type property can't be changed\" );\n        } else if ( !jQuery.support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\n          // Setting the type on a radio button after the value resets the value in IE6-9\n          // Reset value to it's default in case type is set after value\n          // This is for element creation\n          var val = elem.value;\n          elem.setAttribute( \"type\", value );\n          if ( val ) {\n            elem.value = val;\n          }\n          return value;\n        }\n      }\n    },\n    // Use the value property for back compat\n    // Use the nodeHook for button elements in IE6/7 (#1954)\n    value: {\n      get: function( elem, name ) {\n        if ( nodeHook && jQuery.nodeName( elem, \"button\" ) ) {\n          return nodeHook.get( elem, name );\n        }\n        return name in elem ?\n          elem.value :\n          null;\n      },\n      set: function( elem, value, name ) {\n        if ( nodeHook && jQuery.nodeName( elem, \"button\" ) ) {\n          return nodeHook.set( elem, value, name );\n        }\n        // Does not return so that setAttribute is also used\n        elem.value = value;\n      }\n    }\n  },\n\n  propFix: {\n    tabindex: \"tabIndex\",\n    readonly: \"readOnly\",\n    \"for\": \"htmlFor\",\n    \"class\": \"className\",\n    maxlength: \"maxLength\",\n    cellspacing: \"cellSpacing\",\n    cellpadding: \"cellPadding\",\n    rowspan: \"rowSpan\",\n    colspan: \"colSpan\",\n    usemap: \"useMap\",\n    frameborder: \"frameBorder\",\n    contenteditable: \"contentEditable\"\n  },\n\n  prop: function( elem, name, value ) {\n    var ret, hooks, notxml,\n      nType = elem.nodeType;\n\n    // don't get/set properties on text, comment and attribute nodes\n    if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n      return;\n    }\n\n    notxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n    if ( notxml ) {\n      // Fix name and attach hooks\n      name = jQuery.propFix[ name ] || name;\n      hooks = jQuery.propHooks[ name ];\n    }\n\n    if ( value !== undefined ) {\n      if ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n        return ret;\n\n      } else {\n        return ( elem[ name ] = value );\n      }\n\n    } else {\n      if ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n        return ret;\n\n      } else {\n        return elem[ name ];\n      }\n    }\n  },\n\n  propHooks: {\n    tabIndex: {\n      get: function( elem ) {\n        // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set\n        // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n        var attributeNode = elem.getAttributeNode(\"tabindex\");\n\n        return attributeNode && attributeNode.specified ?\n          parseInt( attributeNode.value, 10 ) :\n          rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?\n            0 :\n            undefined;\n      }\n    }\n  }\n});\n\n// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)\njQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;\n\n// Hook for boolean attributes\nboolHook = {\n  get: function( elem, name ) {\n    // Align boolean attributes with corresponding properties\n    // Fall back to attribute presence where some booleans are not supported\n    var attrNode,\n      property = jQuery.prop( elem, name );\n    return property === true || typeof property !== \"boolean\" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?\n      name.toLowerCase() :\n      undefined;\n  },\n  set: function( elem, value, name ) {\n    var propName;\n    if ( value === false ) {\n      // Remove boolean attributes when set to false\n      jQuery.removeAttr( elem, name );\n    } else {\n      // value is true since we know at this point it's type boolean and not false\n      // Set boolean attributes to the same name and set the DOM property\n      propName = jQuery.propFix[ name ] || name;\n      if ( propName in elem ) {\n        // Only set the IDL specifically if it already exists on the element\n        elem[ propName ] = true;\n      }\n\n      elem.setAttribute( name, name.toLowerCase() );\n    }\n    return name;\n  }\n};\n\n// IE6/7 do not support getting/setting some attributes with get/setAttribute\nif ( !getSetAttribute ) {\n\n  fixSpecified = {\n    name: true,\n    id: true\n  };\n\n  // Use this for any attribute in IE6/7\n  // This fixes almost every IE6/7 issue\n  nodeHook = jQuery.valHooks.button = {\n    get: function( elem, name ) {\n      var ret;\n      ret = elem.getAttributeNode( name );\n      return ret && ( fixSpecified[ name ] ? ret.nodeValue !== \"\" : ret.specified ) ?\n        ret.nodeValue :\n        undefined;\n    },\n    set: function( elem, value, name ) {\n      // Set the existing or create a new attribute node\n      var ret = elem.getAttributeNode( name );\n      if ( !ret ) {\n        ret = document.createAttribute( name );\n        elem.setAttributeNode( ret );\n      }\n      return ( ret.nodeValue = value + \"\" );\n    }\n  };\n\n  // Apply the nodeHook to tabindex\n  jQuery.attrHooks.tabindex.set = nodeHook.set;\n\n  // Set width and height to auto instead of 0 on empty string( Bug #8150 )\n  // This is for removals\n  jQuery.each([ \"width\", \"height\" ], function( i, name ) {\n    jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\n      set: function( elem, value ) {\n        if ( value === \"\" ) {\n          elem.setAttribute( name, \"auto\" );\n          return value;\n        }\n      }\n    });\n  });\n\n  // Set contenteditable to false on removals(#10429)\n  // Setting to empty string throws an error as an invalid value\n  jQuery.attrHooks.contenteditable = {\n    get: nodeHook.get,\n    set: function( elem, value, name ) {\n      if ( value === \"\" ) {\n        value = \"false\";\n      }\n      nodeHook.set( elem, value, name );\n    }\n  };\n}\n\n\n// Some attributes require a special call on IE\nif ( !jQuery.support.hrefNormalized ) {\n  jQuery.each([ \"href\", \"src\", \"width\", \"height\" ], function( i, name ) {\n    jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\n      get: function( elem ) {\n        var ret = elem.getAttribute( name, 2 );\n        return ret === null ? undefined : ret;\n      }\n    });\n  });\n}\n\nif ( !jQuery.support.style ) {\n  jQuery.attrHooks.style = {\n    get: function( elem ) {\n      // Return undefined in the case of empty string\n      // Normalize to lowercase since IE uppercases css property names\n      return elem.style.cssText.toLowerCase() || undefined;\n    },\n    set: function( elem, value ) {\n      return ( elem.style.cssText = \"\" + value );\n    }\n  };\n}\n\n// Safari mis-reports the default selected property of an option\n// Accessing the parent's selectedIndex property fixes it\nif ( !jQuery.support.optSelected ) {\n  jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {\n    get: function( elem ) {\n      var parent = elem.parentNode;\n\n      if ( parent ) {\n        parent.selectedIndex;\n\n        // Make sure that it also works with optgroups, see #5701\n        if ( parent.parentNode ) {\n          parent.parentNode.selectedIndex;\n        }\n      }\n      return null;\n    }\n  });\n}\n\n// IE6/7 call enctype encoding\nif ( !jQuery.support.enctype ) {\n  jQuery.propFix.enctype = \"encoding\";\n}\n\n// Radios and checkboxes getter/setter\nif ( !jQuery.support.checkOn ) {\n  jQuery.each([ \"radio\", \"checkbox\" ], function() {\n    jQuery.valHooks[ this ] = {\n      get: function( elem ) {\n        // Handle the case where in Webkit \"\" is returned instead of \"on\" if a value isn't specified\n        return elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n      }\n    };\n  });\n}\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n  jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {\n    set: function( elem, value ) {\n      if ( jQuery.isArray( value ) ) {\n        return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\n      }\n    }\n  });\n});\n\n\n\n\nvar rformElems = /^(?:textarea|input|select)$/i,\n  rtypenamespace = /^([^\\.]*)?(?:\\.(.+))?$/,\n  rhoverHack = /\\bhover(\\.\\S+)?\\b/,\n  rkeyEvent = /^key/,\n  rmouseEvent = /^(?:mouse|contextmenu)|click/,\n  rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n  rquickIs = /^(\\w*)(?:#([\\w\\-]+))?(?:\\.([\\w\\-]+))?$/,\n  quickParse = function( selector ) {\n    var quick = rquickIs.exec( selector );\n    if ( quick ) {\n      //   0  1    2   3\n      // [ _, tag, id, class ]\n      quick[1] = ( quick[1] || \"\" ).toLowerCase();\n      quick[3] = quick[3] && new RegExp( \"(?:^|\\\\s)\" + quick[3] + \"(?:\\\\s|$)\" );\n    }\n    return quick;\n  },\n  quickIs = function( elem, m ) {\n    var attrs = elem.attributes || {};\n    return (\n      (!m[1] || elem.nodeName.toLowerCase() === m[1]) &&\n      (!m[2] || (attrs.id || {}).value === m[2]) &&\n      (!m[3] || m[3].test( (attrs[ \"class\" ] || {}).value ))\n    );\n  },\n  hoverHack = function( events ) {\n    return jQuery.event.special.hover ? events : events.replace( rhoverHack, \"mouseenter$1 mouseleave$1\" );\n  };\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n  add: function( elem, types, handler, data, selector ) {\n\n    var elemData, eventHandle, events,\n      t, tns, type, namespaces, handleObj,\n      handleObjIn, quick, handlers, special;\n\n    // Don't attach events to noData or text/comment nodes (allow plain objects tho)\n    if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {\n      return;\n    }\n\n    // Caller can pass in an object of custom data in lieu of the handler\n    if ( handler.handler ) {\n      handleObjIn = handler;\n      handler = handleObjIn.handler;\n    }\n\n    // Make sure that the handler has a unique ID, used to find/remove it later\n    if ( !handler.guid ) {\n      handler.guid = jQuery.guid++;\n    }\n\n    // Init the element's event structure and main handler, if this is the first\n    events = elemData.events;\n    if ( !events ) {\n      elemData.events = events = {};\n    }\n    eventHandle = elemData.handle;\n    if ( !eventHandle ) {\n      elemData.handle = eventHandle = function( e ) {\n        // Discard the second event of a jQuery.event.trigger() and\n        // when an event is called after a page has unloaded\n        return typeof jQuery !== \"undefined\" && (!e || jQuery.event.triggered !== e.type) ?\n          jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\n          undefined;\n      };\n      // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events\n      eventHandle.elem = elem;\n    }\n\n    // Handle multiple events separated by a space\n    // jQuery(...).bind(\"mouseover mouseout\", fn);\n    types = jQuery.trim( hoverHack(types) ).split( \" \" );\n    for ( t = 0; t < types.length; t++ ) {\n\n      tns = rtypenamespace.exec( types[t] ) || [];\n      type = tns[1];\n      namespaces = ( tns[2] || \"\" ).split( \".\" ).sort();\n\n      // If event changes its type, use the special event handlers for the changed type\n      special = jQuery.event.special[ type ] || {};\n\n      // If selector defined, determine special event api type, otherwise given type\n      type = ( selector ? special.delegateType : special.bindType ) || type;\n\n      // Update special based on newly reset type\n      special = jQuery.event.special[ type ] || {};\n\n      // handleObj is passed to all event handlers\n      handleObj = jQuery.extend({\n        type: type,\n        origType: tns[1],\n        data: data,\n        handler: handler,\n        guid: handler.guid,\n        selector: selector,\n        quick: quickParse( selector ),\n        namespace: namespaces.join(\".\")\n      }, handleObjIn );\n\n      // Init the event handler queue if we're the first\n      handlers = events[ type ];\n      if ( !handlers ) {\n        handlers = events[ type ] = [];\n        handlers.delegateCount = 0;\n\n        // Only use addEventListener/attachEvent if the special events handler returns false\n        if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n          // Bind the global event handler to the element\n          if ( elem.addEventListener ) {\n            elem.addEventListener( type, eventHandle, false );\n\n          } else if ( elem.attachEvent ) {\n            elem.attachEvent( \"on\" + type, eventHandle );\n          }\n        }\n      }\n\n      if ( special.add ) {\n        special.add.call( elem, handleObj );\n\n        if ( !handleObj.handler.guid ) {\n          handleObj.handler.guid = handler.guid;\n        }\n      }\n\n      // Add to the element's handler list, delegates in front\n      if ( selector ) {\n        handlers.splice( handlers.delegateCount++, 0, handleObj );\n      } else {\n        handlers.push( handleObj );\n      }\n\n      // Keep track of which events have ever been used, for event optimization\n      jQuery.event.global[ type ] = true;\n    }\n\n    // Nullify elem to prevent memory leaks in IE\n    elem = null;\n  },\n\n  global: {},\n\n  // Detach an event or set of events from an element\n  remove: function( elem, types, handler, selector, mappedTypes ) {\n\n    var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),\n      t, tns, type, origType, namespaces, origCount,\n      j, events, special, handle, eventType, handleObj;\n\n    if ( !elemData || !(events = elemData.events) ) {\n      return;\n    }\n\n    // Once for each type.namespace in types; type may be omitted\n    types = jQuery.trim( hoverHack( types || \"\" ) ).split(\" \");\n    for ( t = 0; t < types.length; t++ ) {\n      tns = rtypenamespace.exec( types[t] ) || [];\n      type = origType = tns[1];\n      namespaces = tns[2];\n\n      // Unbind all events (on this namespace, if provided) for the element\n      if ( !type ) {\n        for ( type in events ) {\n          jQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n        }\n        continue;\n      }\n\n      special = jQuery.event.special[ type ] || {};\n      type = ( selector? special.delegateType : special.bindType ) || type;\n      eventType = events[ type ] || [];\n      origCount = eventType.length;\n      namespaces = namespaces ? new RegExp(\"(^|\\\\.)\" + namespaces.split(\".\").sort().join(\"\\\\.(?:.*\\\\.)?\") + \"(\\\\.|$)\") : null;\n\n      // Remove matching events\n      for ( j = 0; j < eventType.length; j++ ) {\n        handleObj = eventType[ j ];\n\n        if ( ( mappedTypes || origType === handleObj.origType ) &&\n           ( !handler || handler.guid === handleObj.guid ) &&\n           ( !namespaces || namespaces.test( handleObj.namespace ) ) &&\n           ( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n          eventType.splice( j--, 1 );\n\n          if ( handleObj.selector ) {\n            eventType.delegateCount--;\n          }\n          if ( special.remove ) {\n            special.remove.call( elem, handleObj );\n          }\n        }\n      }\n\n      // Remove generic event handler if we removed something and no more handlers exist\n      // (avoids potential for endless recursion during removal of special event handlers)\n      if ( eventType.length === 0 && origCount !== eventType.length ) {\n        if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {\n          jQuery.removeEvent( elem, type, elemData.handle );\n        }\n\n        delete events[ type ];\n      }\n    }\n\n    // Remove the expando if it's no longer used\n    if ( jQuery.isEmptyObject( events ) ) {\n      handle = elemData.handle;\n      if ( handle ) {\n        handle.elem = null;\n      }\n\n      // removeData also checks for emptiness and clears the expando if empty\n      // so use it instead of delete\n      jQuery.removeData( elem, [ \"events\", \"handle\" ], true );\n    }\n  },\n\n  // Events that are safe to short-circuit if no handlers are attached.\n  // Native DOM events should not be added, they may have inline handlers.\n  customEvent: {\n    \"getData\": true,\n    \"setData\": true,\n    \"changeData\": true\n  },\n\n  trigger: function( event, data, elem, onlyHandlers ) {\n    // Don't do events on text and comment nodes\n    if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {\n      return;\n    }\n\n    // Event object or event type\n    var type = event.type || event,\n      namespaces = [],\n      cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;\n\n    // focus/blur morphs to focusin/out; ensure we're not firing them right now\n    if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n      return;\n    }\n\n    if ( type.indexOf( \"!\" ) >= 0 ) {\n      // Exclusive events trigger only for the exact event (no namespaces)\n      type = type.slice(0, -1);\n      exclusive = true;\n    }\n\n    if ( type.indexOf( \".\" ) >= 0 ) {\n      // Namespaced trigger; create a regexp to match event type in handle()\n      namespaces = type.split(\".\");\n      type = namespaces.shift();\n      namespaces.sort();\n    }\n\n    if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {\n      // No jQuery handlers for this event type, and it can't have inline handlers\n      return;\n    }\n\n    // Caller can pass in an Event, Object, or just an event type string\n    event = typeof event === \"object\" ?\n      // jQuery.Event object\n      event[ jQuery.expando ] ? event :\n      // Object literal\n      new jQuery.Event( type, event ) :\n      // Just the event type (string)\n      new jQuery.Event( type );\n\n    event.type = type;\n    event.isTrigger = true;\n    event.exclusive = exclusive;\n    event.namespace = namespaces.join( \".\" );\n    event.namespace_re = event.namespace? new RegExp(\"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.)?\") + \"(\\\\.|$)\") : null;\n    ontype = type.indexOf( \":\" ) < 0 ? \"on\" + type : \"\";\n\n    // Handle a global trigger\n    if ( !elem ) {\n\n      // TODO: Stop taunting the data cache; remove global events and always attach to document\n      cache = jQuery.cache;\n      for ( i in cache ) {\n        if ( cache[ i ].events && cache[ i ].events[ type ] ) {\n          jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );\n        }\n      }\n      return;\n    }\n\n    // Clean up the event in case it is being reused\n    event.result = undefined;\n    if ( !event.target ) {\n      event.target = elem;\n    }\n\n    // Clone any incoming data and prepend the event, creating the handler arg list\n    data = data != null ? jQuery.makeArray( data ) : [];\n    data.unshift( event );\n\n    // Allow special events to draw outside the lines\n    special = jQuery.event.special[ type ] || {};\n    if ( special.trigger && special.trigger.apply( elem, data ) === false ) {\n      return;\n    }\n\n    // Determine event propagation path in advance, per W3C events spec (#9951)\n    // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n    eventPath = [[ elem, special.bindType || type ]];\n    if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n      bubbleType = special.delegateType || type;\n      cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;\n      old = null;\n      for ( ; cur; cur = cur.parentNode ) {\n        eventPath.push([ cur, bubbleType ]);\n        old = cur;\n      }\n\n      // Only add window if we got to document (e.g., not plain obj or detached DOM)\n      if ( old && old === elem.ownerDocument ) {\n        eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);\n      }\n    }\n\n    // Fire handlers on the event path\n    for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {\n\n      cur = eventPath[i][0];\n      event.type = eventPath[i][1];\n\n      handle = ( jQuery._data( cur, \"events\" ) || {} )[ event.type ] && jQuery._data( cur, \"handle\" );\n      if ( handle ) {\n        handle.apply( cur, data );\n      }\n      // Note that this is a bare JS function and not a jQuery handler\n      handle = ontype && cur[ ontype ];\n      if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {\n        event.preventDefault();\n      }\n    }\n    event.type = type;\n\n    // If nobody prevented the default action, do it now\n    if ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n      if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&\n        !(type === \"click\" && jQuery.nodeName( elem, \"a\" )) && jQuery.acceptData( elem ) ) {\n\n        // Call a native DOM method on the target with the same name name as the event.\n        // Can't use an .isFunction() check here because IE6/7 fails that test.\n        // Don't do default actions on window, that's where global variables be (#6170)\n        // IE<9 dies on focus/blur to hidden element (#1486)\n        if ( ontype && elem[ type ] && ((type !== \"focus\" && type !== \"blur\") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {\n\n          // Don't re-trigger an onFOO event when we call its FOO() method\n          old = elem[ ontype ];\n\n          if ( old ) {\n            elem[ ontype ] = null;\n          }\n\n          // Prevent re-triggering of the same event, since we already bubbled it above\n          jQuery.event.triggered = type;\n          elem[ type ]();\n          jQuery.event.triggered = undefined;\n\n          if ( old ) {\n            elem[ ontype ] = old;\n          }\n        }\n      }\n    }\n\n    return event.result;\n  },\n\n  dispatch: function( event ) {\n\n    // Make a writable jQuery.Event from the native event object\n    event = jQuery.event.fix( event || window.event );\n\n    var handlers = ( (jQuery._data( this, \"events\" ) || {} )[ event.type ] || []),\n      delegateCount = handlers.delegateCount,\n      args = [].slice.call( arguments, 0 ),\n      run_all = !event.exclusive && !event.namespace,\n      handlerQueue = [],\n      i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;\n\n    // Use the fix-ed jQuery.Event rather than the (read-only) native event\n    args[0] = event;\n    event.delegateTarget = this;\n\n    // Determine handlers that should run if there are delegated events\n    // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861)\n    if ( delegateCount && !event.target.disabled && !(event.button && event.type === \"click\") ) {\n\n      // Pregenerate a single jQuery object for reuse with .is()\n      jqcur = jQuery(this);\n      jqcur.context = this.ownerDocument || this;\n\n      for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {\n        selMatch = {};\n        matches = [];\n        jqcur[0] = cur;\n        for ( i = 0; i < delegateCount; i++ ) {\n          handleObj = handlers[ i ];\n          sel = handleObj.selector;\n\n          if ( selMatch[ sel ] === undefined ) {\n            selMatch[ sel ] = (\n              handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )\n            );\n          }\n          if ( selMatch[ sel ] ) {\n            matches.push( handleObj );\n          }\n        }\n        if ( matches.length ) {\n          handlerQueue.push({ elem: cur, matches: matches });\n        }\n      }\n    }\n\n    // Add the remaining (directly-bound) handlers\n    if ( handlers.length > delegateCount ) {\n      handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });\n    }\n\n    // Run delegates first; they may want to stop propagation beneath us\n    for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {\n      matched = handlerQueue[ i ];\n      event.currentTarget = matched.elem;\n\n      for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {\n        handleObj = matched.matches[ j ];\n\n        // Triggered event must either 1) be non-exclusive and have no namespace, or\n        // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\n        if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {\n\n          event.data = handleObj.data;\n          event.handleObj = handleObj;\n\n          ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n              .apply( matched.elem, args );\n\n          if ( ret !== undefined ) {\n            event.result = ret;\n            if ( ret === false ) {\n              event.preventDefault();\n              event.stopPropagation();\n            }\n          }\n        }\n      }\n    }\n\n    return event.result;\n  },\n\n  // Includes some event props shared by KeyEvent and MouseEvent\n  // *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***\n  props: \"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\n  fixHooks: {},\n\n  keyHooks: {\n    props: \"char charCode key keyCode\".split(\" \"),\n    filter: function( event, original ) {\n\n      // Add which for key events\n      if ( event.which == null ) {\n        event.which = original.charCode != null ? original.charCode : original.keyCode;\n      }\n\n      return event;\n    }\n  },\n\n  mouseHooks: {\n    props: \"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n    filter: function( event, original ) {\n      var eventDoc, doc, body,\n        button = original.button,\n        fromElement = original.fromElement;\n\n      // Calculate pageX/Y if missing and clientX/Y available\n      if ( event.pageX == null && original.clientX != null ) {\n        eventDoc = event.target.ownerDocument || document;\n        doc = eventDoc.documentElement;\n        body = eventDoc.body;\n\n        event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n        event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );\n      }\n\n      // Add relatedTarget, if necessary\n      if ( !event.relatedTarget && fromElement ) {\n        event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;\n      }\n\n      // Add which for click: 1 === left; 2 === middle; 3 === right\n      // Note: button is not normalized, so don't use it\n      if ( !event.which && button !== undefined ) {\n        event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n      }\n\n      return event;\n    }\n  },\n\n  fix: function( event ) {\n    if ( event[ jQuery.expando ] ) {\n      return event;\n    }\n\n    // Create a writable copy of the event object and normalize some properties\n    var i, prop,\n      originalEvent = event,\n      fixHook = jQuery.event.fixHooks[ event.type ] || {},\n      copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n    event = jQuery.Event( originalEvent );\n\n    for ( i = copy.length; i; ) {\n      prop = copy[ --i ];\n      event[ prop ] = originalEvent[ prop ];\n    }\n\n    // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)\n    if ( !event.target ) {\n      event.target = originalEvent.srcElement || document;\n    }\n\n    // Target should not be a text node (#504, Safari)\n    if ( event.target.nodeType === 3 ) {\n      event.target = event.target.parentNode;\n    }\n\n    // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)\n    if ( event.metaKey === undefined ) {\n      event.metaKey = event.ctrlKey;\n    }\n\n    return fixHook.filter? fixHook.filter( event, originalEvent ) : event;\n  },\n\n  special: {\n    ready: {\n      // Make sure the ready event is setup\n      setup: jQuery.bindReady\n    },\n\n    load: {\n      // Prevent triggered image.load events from bubbling to window.load\n      noBubble: true\n    },\n\n    focus: {\n      delegateType: \"focusin\"\n    },\n    blur: {\n      delegateType: \"focusout\"\n    },\n\n    beforeunload: {\n      setup: function( data, namespaces, eventHandle ) {\n        // We only want to do this special case on windows\n        if ( jQuery.isWindow( this ) ) {\n          this.onbeforeunload = eventHandle;\n        }\n      },\n\n      teardown: function( namespaces, eventHandle ) {\n        if ( this.onbeforeunload === eventHandle ) {\n          this.onbeforeunload = null;\n        }\n      }\n    }\n  },\n\n  simulate: function( type, elem, event, bubble ) {\n    // Piggyback on a donor event to simulate a different one.\n    // Fake originalEvent to avoid donor's stopPropagation, but if the\n    // simulated event prevents default then we do the same on the donor.\n    var e = jQuery.extend(\n      new jQuery.Event(),\n      event,\n      { type: type,\n        isSimulated: true,\n        originalEvent: {}\n      }\n    );\n    if ( bubble ) {\n      jQuery.event.trigger( e, null, elem );\n    } else {\n      jQuery.event.dispatch.call( elem, e );\n    }\n    if ( e.isDefaultPrevented() ) {\n      event.preventDefault();\n    }\n  }\n};\n\n// Some plugins are using, but it's undocumented/deprecated and will be removed.\n// The 1.7 special event interface should provide all the hooks needed now.\njQuery.event.handle = jQuery.event.dispatch;\n\njQuery.removeEvent = document.removeEventListener ?\n  function( elem, type, handle ) {\n    if ( elem.removeEventListener ) {\n      elem.removeEventListener( type, handle, false );\n    }\n  } :\n  function( elem, type, handle ) {\n    if ( elem.detachEvent ) {\n      elem.detachEvent( \"on\" + type, handle );\n    }\n  };\n\njQuery.Event = function( src, props ) {\n  // Allow instantiation without the 'new' keyword\n  if ( !(this instanceof jQuery.Event) ) {\n    return new jQuery.Event( src, props );\n  }\n\n  // Event object\n  if ( src && src.type ) {\n    this.originalEvent = src;\n    this.type = src.type;\n\n    // Events bubbling up the document may have been marked as prevented\n    // by a handler lower down the tree; reflect the correct value.\n    this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||\n      src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;\n\n  // Event type\n  } else {\n    this.type = src;\n  }\n\n  // Put explicitly provided properties onto the event object\n  if ( props ) {\n    jQuery.extend( this, props );\n  }\n\n  // Create a timestamp if incoming event doesn't have one\n  this.timeStamp = src && src.timeStamp || jQuery.now();\n\n  // Mark it as fixed\n  this[ jQuery.expando ] = true;\n};\n\nfunction returnFalse() {\n  return false;\n}\nfunction returnTrue() {\n  return true;\n}\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n  preventDefault: function() {\n    this.isDefaultPrevented = returnTrue;\n\n    var e = this.originalEvent;\n    if ( !e ) {\n      return;\n    }\n\n    // if preventDefault exists run it on the original event\n    if ( e.preventDefault ) {\n      e.preventDefault();\n\n    // otherwise set the returnValue property of the original event to false (IE)\n    } else {\n      e.returnValue = false;\n    }\n  },\n  stopPropagation: function() {\n    this.isPropagationStopped = returnTrue;\n\n    var e = this.originalEvent;\n    if ( !e ) {\n      return;\n    }\n    // if stopPropagation exists run it on the original event\n    if ( e.stopPropagation ) {\n      e.stopPropagation();\n    }\n    // otherwise set the cancelBubble property of the original event to true (IE)\n    e.cancelBubble = true;\n  },\n  stopImmediatePropagation: function() {\n    this.isImmediatePropagationStopped = returnTrue;\n    this.stopPropagation();\n  },\n  isDefaultPrevented: returnFalse,\n  isPropagationStopped: returnFalse,\n  isImmediatePropagationStopped: returnFalse\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\njQuery.each({\n  mouseenter: \"mouseover\",\n  mouseleave: \"mouseout\"\n}, function( orig, fix ) {\n  jQuery.event.special[ orig ] = {\n    delegateType: fix,\n    bindType: fix,\n\n    handle: function( event ) {\n      var target = this,\n        related = event.relatedTarget,\n        handleObj = event.handleObj,\n        selector = handleObj.selector,\n        ret;\n\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 && !jQuery.contains( target, related )) ) {\n        event.type = handleObj.origType;\n        ret = handleObj.handler.apply( this, arguments );\n        event.type = fix;\n      }\n      return ret;\n    }\n  };\n});\n\n// IE submit delegation\nif ( !jQuery.support.submitBubbles ) {\n\n  jQuery.event.special.submit = {\n    setup: function() {\n      // Only need this for delegated form submit events\n      if ( jQuery.nodeName( this, \"form\" ) ) {\n        return false;\n      }\n\n      // Lazy-add a submit handler when a descendant form may potentially be submitted\n      jQuery.event.add( this, \"click._submit keypress._submit\", function( e ) {\n        // Node name check avoids a VML-related crash in IE (#9807)\n        var elem = e.target,\n          form = jQuery.nodeName( elem, \"input\" ) || jQuery.nodeName( elem, \"button\" ) ? elem.form : undefined;\n        if ( form && !form._submit_attached ) {\n          jQuery.event.add( form, \"submit._submit\", function( event ) {\n            // If form was submitted by the user, bubble the event up the tree\n            if ( this.parentNode && !event.isTrigger ) {\n              jQuery.event.simulate( \"submit\", this.parentNode, event, true );\n            }\n          });\n          form._submit_attached = true;\n        }\n      });\n      // return undefined since we don't need an event listener\n    },\n\n    teardown: function() {\n      // Only need this for delegated form submit events\n      if ( jQuery.nodeName( this, \"form\" ) ) {\n        return false;\n      }\n\n      // Remove delegated handlers; cleanData eventually reaps submit handlers attached above\n      jQuery.event.remove( this, \"._submit\" );\n    }\n  };\n}\n\n// IE change delegation and checkbox/radio fix\nif ( !jQuery.support.changeBubbles ) {\n\n  jQuery.event.special.change = {\n\n    setup: function() {\n\n      if ( rformElems.test( this.nodeName ) ) {\n        // IE doesn't fire change on a check/radio until blur; trigger it on click\n        // after a propertychange. Eat the blur-change in special.change.handle.\n        // This still fires onchange a second time for check/radio after blur.\n        if ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n          jQuery.event.add( this, \"propertychange._change\", function( event ) {\n            if ( event.originalEvent.propertyName === \"checked\" ) {\n              this._just_changed = true;\n            }\n          });\n          jQuery.event.add( this, \"click._change\", function( event ) {\n            if ( this._just_changed && !event.isTrigger ) {\n              this._just_changed = false;\n              jQuery.event.simulate( \"change\", this, event, true );\n            }\n          });\n        }\n        return false;\n      }\n      // Delegated event; lazy-add a change handler on descendant inputs\n      jQuery.event.add( this, \"beforeactivate._change\", function( e ) {\n        var elem = e.target;\n\n        if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {\n          jQuery.event.add( elem, \"change._change\", function( event ) {\n            if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {\n              jQuery.event.simulate( \"change\", this.parentNode, event, true );\n            }\n          });\n          elem._change_attached = true;\n        }\n      });\n    },\n\n    handle: function( event ) {\n      var elem = event.target;\n\n      // Swallow native change events from checkbox/radio, we already triggered them above\n      if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== \"radio\" && elem.type !== \"checkbox\") ) {\n        return event.handleObj.handler.apply( this, arguments );\n      }\n    },\n\n    teardown: function() {\n      jQuery.event.remove( this, \"._change\" );\n\n      return rformElems.test( this.nodeName );\n    }\n  };\n}\n\n// Create \"bubbling\" focus and blur events\nif ( !jQuery.support.focusinBubbles ) {\n  jQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n    // Attach a single capturing handler while someone wants focusin/focusout\n    var attaches = 0,\n      handler = function( event ) {\n        jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n      };\n\n    jQuery.event.special[ fix ] = {\n      setup: function() {\n        if ( attaches++ === 0 ) {\n          document.addEventListener( orig, handler, true );\n        }\n      },\n      teardown: function() {\n        if ( --attaches === 0 ) {\n          document.removeEventListener( orig, handler, true );\n        }\n      }\n    };\n  });\n}\n\njQuery.fn.extend({\n\n  on: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n    var origFn, type;\n\n    // Types can be a map of types/handlers\n    if ( typeof types === \"object\" ) {\n      // ( types-Object, selector, data )\n      if ( typeof selector !== \"string\" ) {\n        // ( types-Object, data )\n        data = selector;\n        selector = undefined;\n      }\n      for ( type in types ) {\n        this.on( type, selector, data, types[ type ], one );\n      }\n      return this;\n    }\n\n    if ( data == null && fn == null ) {\n      // ( types, fn )\n      fn = selector;\n      data = selector = undefined;\n    } else if ( fn == null ) {\n      if ( typeof selector === \"string\" ) {\n        // ( types, selector, fn )\n        fn = data;\n        data = undefined;\n      } else {\n        // ( types, data, fn )\n        fn = data;\n        data = selector;\n        selector = undefined;\n      }\n    }\n    if ( fn === false ) {\n      fn = returnFalse;\n    } else if ( !fn ) {\n      return this;\n    }\n\n    if ( one === 1 ) {\n      origFn = fn;\n      fn = function( event ) {\n        // Can use an empty set, since event contains the info\n        jQuery().off( event );\n        return origFn.apply( this, arguments );\n      };\n      // Use same guid so caller can remove using origFn\n      fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n    }\n    return this.each( function() {\n      jQuery.event.add( this, types, fn, data, selector );\n    });\n  },\n  one: function( types, selector, data, fn ) {\n    return this.on.call( this, types, selector, data, fn, 1 );\n  },\n  off: function( types, selector, fn ) {\n    if ( types && types.preventDefault && types.handleObj ) {\n      // ( event )  dispatched jQuery.Event\n      var handleObj = types.handleObj;\n      jQuery( types.delegateTarget ).off(\n        handleObj.namespace? handleObj.type + \".\" + handleObj.namespace : handleObj.type,\n        handleObj.selector,\n        handleObj.handler\n      );\n      return this;\n    }\n    if ( typeof types === \"object\" ) {\n      // ( types-object [, selector] )\n      for ( var type in types ) {\n        this.off( type, selector, types[ type ] );\n      }\n      return this;\n    }\n    if ( selector === false || typeof selector === \"function\" ) {\n      // ( types [, fn] )\n      fn = selector;\n      selector = undefined;\n    }\n    if ( fn === false ) {\n      fn = returnFalse;\n    }\n    return this.each(function() {\n      jQuery.event.remove( this, types, fn, selector );\n    });\n  },\n\n  bind: function( types, data, fn ) {\n    return this.on( types, null, data, fn );\n  },\n  unbind: function( types, fn ) {\n    return this.off( types, null, fn );\n  },\n\n  live: function( types, data, fn ) {\n    jQuery( this.context ).on( types, this.selector, data, fn );\n    return this;\n  },\n  die: function( types, fn ) {\n    jQuery( this.context ).off( types, this.selector || \"**\", fn );\n    return this;\n  },\n\n  delegate: function( selector, types, data, fn ) {\n    return this.on( types, selector, data, fn );\n  },\n  undelegate: function( selector, types, fn ) {\n    // ( namespace ) or ( selector, types [, fn] )\n    return arguments.length == 1? this.off( selector, \"**\" ) : this.off( types, selector, fn );\n  },\n\n  trigger: function( type, data ) {\n    return this.each(function() {\n      jQuery.event.trigger( type, data, this );\n    });\n  },\n  triggerHandler: function( type, data ) {\n    if ( this[0] ) {\n      return jQuery.event.trigger( type, data, this[0], true );\n    }\n  },\n\n  toggle: function( fn ) {\n    // Save reference to arguments for access in closure\n    var args = arguments,\n      guid = fn.guid || jQuery.guid++,\n      i = 0,\n      toggler = function( event ) {\n        // Figure out which function to execute\n        var lastToggle = ( jQuery._data( this, \"lastToggle\" + fn.guid ) || 0 ) % i;\n        jQuery._data( this, \"lastToggle\" + fn.guid, lastToggle + 1 );\n\n        // Make sure that clicks stop\n        event.preventDefault();\n\n        // and execute the function\n        return args[ lastToggle ].apply( this, arguments ) || false;\n      };\n\n    // link all the functions, so any of them can unbind this click handler\n    toggler.guid = guid;\n    while ( i < args.length ) {\n      args[ i++ ].guid = guid;\n    }\n\n    return this.click( toggler );\n  },\n\n  hover: function( fnOver, fnOut ) {\n    return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n  }\n});\n\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n  \"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n  \"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\n\n  // Handle event binding\n  jQuery.fn[ name ] = function( data, fn ) {\n    if ( fn == null ) {\n      fn = data;\n      data = null;\n    }\n\n    return arguments.length > 0 ?\n      this.on( name, null, data, fn ) :\n      this.trigger( name );\n  };\n\n  if ( jQuery.attrFn ) {\n    jQuery.attrFn[ name ] = true;\n  }\n\n  if ( rkeyEvent.test( name ) ) {\n    jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;\n  }\n\n  if ( rmouseEvent.test( name ) ) {\n    jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;\n  }\n});\n\n\n\n/*!\n * Sizzle CSS Selector Engine\n *  Copyright 2011, The Dojo Foundation\n *  Released under the MIT, BSD, and GPL Licenses.\n *  More information: http://sizzlejs.com/\n */\n(function(){\n\nvar chunker = /((?:\\((?:\\([^()]+\\)|[^()]+)+\\)|\\[(?:\\[[^\\[\\]]*\\]|['\"][^'\"]*['\"]|[^\\[\\]'\"]+)+\\]|\\\\.|[^ >+~,(\\[\\\\]+)+|[>+~])(\\s*,\\s*)?((?:.|\\r|\\n)*)/g,\n  expando = \"sizcache\" + (Math.random() + '').replace('.', ''),\n  done = 0,\n  toString = Object.prototype.toString,\n  hasDuplicate = false,\n  baseHasDuplicate = true,\n  rBackslash = /\\\\/g,\n  rReturn = /\\r\\n/g,\n  rNonWord = /\\W/;\n\n// Here we check if the JavaScript engine is using some sort of\n// optimization where it does not always call our comparision\n// function. If that is the case, discard the hasDuplicate value.\n//   Thus far that includes Google Chrome.\n[0, 0].sort(function() {\n  baseHasDuplicate = false;\n  return 0;\n});\n\nvar Sizzle = function( selector, context, results, seed ) {\n  results = results || [];\n  context = context || document;\n\n  var origContext = context;\n\n  if ( context.nodeType !== 1 && context.nodeType !== 9 ) {\n    return [];\n  }\n  \n  if ( !selector || typeof selector !== \"string\" ) {\n    return results;\n  }\n\n  var m, set, checkSet, extra, ret, cur, pop, i,\n    prune = true,\n    contextXML = Sizzle.isXML( context ),\n    parts = [],\n    soFar = selector;\n  \n  // Reset the position of the chunker regexp (start from head)\n  do {\n    chunker.exec( \"\" );\n    m = chunker.exec( soFar );\n\n    if ( m ) {\n      soFar = m[3];\n    \n      parts.push( m[1] );\n    \n      if ( m[2] ) {\n        extra = m[3];\n        break;\n      }\n    }\n  } while ( m );\n\n  if ( parts.length > 1 && origPOS.exec( selector ) ) {\n\n    if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {\n      set = posProcess( parts[0] + parts[1], context, seed );\n\n    } else {\n      set = Expr.relative[ parts[0] ] ?\n        [ context ] :\n        Sizzle( parts.shift(), context );\n\n      while ( parts.length ) {\n        selector = parts.shift();\n\n        if ( Expr.relative[ selector ] ) {\n          selector += parts.shift();\n        }\n        \n        set = posProcess( selector, set, seed );\n      }\n    }\n\n  } else {\n    // Take a shortcut and set the context if the root selector is an ID\n    // (but not if it'll be faster if the inner selector is an ID)\n    if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&\n        Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {\n\n      ret = Sizzle.find( parts.shift(), context, contextXML );\n      context = ret.expr ?\n        Sizzle.filter( ret.expr, ret.set )[0] :\n        ret.set[0];\n    }\n\n    if ( context ) {\n      ret = seed ?\n        { expr: parts.pop(), set: makeArray(seed) } :\n        Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === \"~\" || parts[0] === \"+\") && context.parentNode ? context.parentNode : context, contextXML );\n\n      set = ret.expr ?\n        Sizzle.filter( ret.expr, ret.set ) :\n        ret.set;\n\n      if ( parts.length > 0 ) {\n        checkSet = makeArray( set );\n\n      } else {\n        prune = false;\n      }\n\n      while ( parts.length ) {\n        cur = parts.pop();\n        pop = cur;\n\n        if ( !Expr.relative[ cur ] ) {\n          cur = \"\";\n        } else {\n          pop = parts.pop();\n        }\n\n        if ( pop == null ) {\n          pop = context;\n        }\n\n        Expr.relative[ cur ]( checkSet, pop, contextXML );\n      }\n\n    } else {\n      checkSet = parts = [];\n    }\n  }\n\n  if ( !checkSet ) {\n    checkSet = set;\n  }\n\n  if ( !checkSet ) {\n    Sizzle.error( cur || selector );\n  }\n\n  if ( toString.call(checkSet) === \"[object Array]\" ) {\n    if ( !prune ) {\n      results.push.apply( results, checkSet );\n\n    } else if ( context && context.nodeType === 1 ) {\n      for ( i = 0; checkSet[i] != null; i++ ) {\n        if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {\n          results.push( set[i] );\n        }\n      }\n\n    } else {\n      for ( i = 0; checkSet[i] != null; i++ ) {\n        if ( checkSet[i] && checkSet[i].nodeType === 1 ) {\n          results.push( set[i] );\n        }\n      }\n    }\n\n  } else {\n    makeArray( checkSet, results );\n  }\n\n  if ( extra ) {\n    Sizzle( extra, origContext, results, seed );\n    Sizzle.uniqueSort( results );\n  }\n\n  return results;\n};\n\nSizzle.uniqueSort = function( results ) {\n  if ( sortOrder ) {\n    hasDuplicate = baseHasDuplicate;\n    results.sort( sortOrder );\n\n    if ( hasDuplicate ) {\n      for ( var i = 1; i < results.length; i++ ) {\n        if ( results[i] === results[ i - 1 ] ) {\n          results.splice( i--, 1 );\n        }\n      }\n    }\n  }\n\n  return results;\n};\n\nSizzle.matches = function( expr, set ) {\n  return Sizzle( expr, null, null, set );\n};\n\nSizzle.matchesSelector = function( node, expr ) {\n  return Sizzle( expr, null, null, [node] ).length > 0;\n};\n\nSizzle.find = function( expr, context, isXML ) {\n  var set, i, len, match, type, left;\n\n  if ( !expr ) {\n    return [];\n  }\n\n  for ( i = 0, len = Expr.order.length; i < len; i++ ) {\n    type = Expr.order[i];\n    \n    if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {\n      left = match[1];\n      match.splice( 1, 1 );\n\n      if ( left.substr( left.length - 1 ) !== \"\\\\\" ) {\n        match[1] = (match[1] || \"\").replace( rBackslash, \"\" );\n        set = Expr.find[ type ]( match, context, isXML );\n\n        if ( set != null ) {\n          expr = expr.replace( Expr.match[ type ], \"\" );\n          break;\n        }\n      }\n    }\n  }\n\n  if ( !set ) {\n    set = typeof context.getElementsByTagName !== \"undefined\" ?\n      context.getElementsByTagName( \"*\" ) :\n      [];\n  }\n\n  return { set: set, expr: expr };\n};\n\nSizzle.filter = function( expr, set, inplace, not ) {\n  var match, anyFound,\n    type, found, item, filter, left,\n    i, pass,\n    old = expr,\n    result = [],\n    curLoop = set,\n    isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );\n\n  while ( expr && set.length ) {\n    for ( type in Expr.filter ) {\n      if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {\n        filter = Expr.filter[ type ];\n        left = match[1];\n\n        anyFound = false;\n\n        match.splice(1,1);\n\n        if ( left.substr( left.length - 1 ) === \"\\\\\" ) {\n          continue;\n        }\n\n        if ( curLoop === result ) {\n          result = [];\n        }\n\n        if ( Expr.preFilter[ type ] ) {\n          match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );\n\n          if ( !match ) {\n            anyFound = found = true;\n\n          } else if ( match === true ) {\n            continue;\n          }\n        }\n\n        if ( match ) {\n          for ( i = 0; (item = curLoop[i]) != null; i++ ) {\n            if ( item ) {\n              found = filter( item, match, i, curLoop );\n              pass = not ^ found;\n\n              if ( inplace && found != null ) {\n                if ( pass ) {\n                  anyFound = true;\n\n                } else {\n                  curLoop[i] = false;\n                }\n\n              } else if ( pass ) {\n                result.push( item );\n                anyFound = true;\n              }\n            }\n          }\n        }\n\n        if ( found !== undefined ) {\n          if ( !inplace ) {\n            curLoop = result;\n          }\n\n          expr = expr.replace( Expr.match[ type ], \"\" );\n\n          if ( !anyFound ) {\n            return [];\n          }\n\n          break;\n        }\n      }\n    }\n\n    // Improper expression\n    if ( expr === old ) {\n      if ( anyFound == null ) {\n        Sizzle.error( expr );\n\n      } else {\n        break;\n      }\n    }\n\n    old = expr;\n  }\n\n  return curLoop;\n};\n\nSizzle.error = function( msg ) {\n  throw new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Utility function for retreiving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\nvar getText = Sizzle.getText = function( elem ) {\n    var i, node,\n    nodeType = elem.nodeType,\n    ret = \"\";\n\n  if ( nodeType ) {\n    if ( nodeType === 1 || nodeType === 9 ) {\n      // Use textContent || innerText for elements\n      if ( typeof elem.textContent === 'string' ) {\n        return elem.textContent;\n      } else if ( typeof elem.innerText === 'string' ) {\n        // Replace IE's carriage returns\n        return elem.innerText.replace( rReturn, '' );\n      } else {\n        // Traverse it's children\n        for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {\n          ret += getText( elem );\n        }\n      }\n    } else if ( nodeType === 3 || nodeType === 4 ) {\n      return elem.nodeValue;\n    }\n  } else {\n\n    // If no nodeType, this is expected to be an array\n    for ( i = 0; (node = elem[i]); i++ ) {\n      // Do not traverse comment nodes\n      if ( node.nodeType !== 8 ) {\n        ret += getText( node );\n      }\n    }\n  }\n  return ret;\n};\n\nvar Expr = Sizzle.selectors = {\n  order: [ \"ID\", \"NAME\", \"TAG\" ],\n\n  match: {\n    ID: /#((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,\n    CLASS: /\\.((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,\n    NAME: /\\[name=['\"]*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)['\"]*\\]/,\n    ATTR: /\\[\\s*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)\\s*(?:(\\S?=)\\s*(?:(['\"])(.*?)\\3|(#?(?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)*)|)|)\\s*\\]/,\n    TAG: /^((?:[\\w\\u00c0-\\uFFFF\\*\\-]|\\\\.)+)/,\n    CHILD: /:(only|nth|last|first)-child(?:\\(\\s*(even|odd|(?:[+\\-]?\\d+|(?:[+\\-]?\\d*)?n\\s*(?:[+\\-]\\s*\\d+)?))\\s*\\))?/,\n    POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\))?(?=[^\\-]|$)/,\n    PSEUDO: /:((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)(?:\\((['\"]?)((?:\\([^\\)]+\\)|[^\\(\\)]*)+)\\2\\))?/\n  },\n\n  leftMatch: {},\n\n  attrMap: {\n    \"class\": \"className\",\n    \"for\": \"htmlFor\"\n  },\n\n  attrHandle: {\n    href: function( elem ) {\n      return elem.getAttribute( \"href\" );\n    },\n    type: function( elem ) {\n      return elem.getAttribute( \"type\" );\n    }\n  },\n\n  relative: {\n    \"+\": function(checkSet, part){\n      var isPartStr = typeof part === \"string\",\n        isTag = isPartStr && !rNonWord.test( part ),\n        isPartStrNotTag = isPartStr && !isTag;\n\n      if ( isTag ) {\n        part = part.toLowerCase();\n      }\n\n      for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {\n        if ( (elem = checkSet[i]) ) {\n          while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}\n\n          checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?\n            elem || false :\n            elem === part;\n        }\n      }\n\n      if ( isPartStrNotTag ) {\n        Sizzle.filter( part, checkSet, true );\n      }\n    },\n\n    \">\": function( checkSet, part ) {\n      var elem,\n        isPartStr = typeof part === \"string\",\n        i = 0,\n        l = checkSet.length;\n\n      if ( isPartStr && !rNonWord.test( part ) ) {\n        part = part.toLowerCase();\n\n        for ( ; i < l; i++ ) {\n          elem = checkSet[i];\n\n          if ( elem ) {\n            var parent = elem.parentNode;\n            checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;\n          }\n        }\n\n      } else {\n        for ( ; i < l; i++ ) {\n          elem = checkSet[i];\n\n          if ( elem ) {\n            checkSet[i] = isPartStr ?\n              elem.parentNode :\n              elem.parentNode === part;\n          }\n        }\n\n        if ( isPartStr ) {\n          Sizzle.filter( part, checkSet, true );\n        }\n      }\n    },\n\n    \"\": function(checkSet, part, isXML){\n      var nodeCheck,\n        doneName = done++,\n        checkFn = dirCheck;\n\n      if ( typeof part === \"string\" && !rNonWord.test( part ) ) {\n        part = part.toLowerCase();\n        nodeCheck = part;\n        checkFn = dirNodeCheck;\n      }\n\n      checkFn( \"parentNode\", part, doneName, checkSet, nodeCheck, isXML );\n    },\n\n    \"~\": function( checkSet, part, isXML ) {\n      var nodeCheck,\n        doneName = done++,\n        checkFn = dirCheck;\n\n      if ( typeof part === \"string\" && !rNonWord.test( part ) ) {\n        part = part.toLowerCase();\n        nodeCheck = part;\n        checkFn = dirNodeCheck;\n      }\n\n      checkFn( \"previousSibling\", part, doneName, checkSet, nodeCheck, isXML );\n    }\n  },\n\n  find: {\n    ID: function( match, context, isXML ) {\n      if ( typeof context.getElementById !== \"undefined\" && !isXML ) {\n        var m = context.getElementById(match[1]);\n        // Check parentNode to catch when Blackberry 4.6 returns\n        // nodes that are no longer in the document #6963\n        return m && m.parentNode ? [m] : [];\n      }\n    },\n\n    NAME: function( match, context ) {\n      if ( typeof context.getElementsByName !== \"undefined\" ) {\n        var ret = [],\n          results = context.getElementsByName( match[1] );\n\n        for ( var i = 0, l = results.length; i < l; i++ ) {\n          if ( results[i].getAttribute(\"name\") === match[1] ) {\n            ret.push( results[i] );\n          }\n        }\n\n        return ret.length === 0 ? null : ret;\n      }\n    },\n\n    TAG: function( match, context ) {\n      if ( typeof context.getElementsByTagName !== \"undefined\" ) {\n        return context.getElementsByTagName( match[1] );\n      }\n    }\n  },\n  preFilter: {\n    CLASS: function( match, curLoop, inplace, result, not, isXML ) {\n      match = \" \" + match[1].replace( rBackslash, \"\" ) + \" \";\n\n      if ( isXML ) {\n        return match;\n      }\n\n      for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {\n        if ( elem ) {\n          if ( not ^ (elem.className && (\" \" + elem.className + \" \").replace(/[\\t\\n\\r]/g, \" \").indexOf(match) >= 0) ) {\n            if ( !inplace ) {\n              result.push( elem );\n            }\n\n          } else if ( inplace ) {\n            curLoop[i] = false;\n          }\n        }\n      }\n\n      return false;\n    },\n\n    ID: function( match ) {\n      return match[1].replace( rBackslash, \"\" );\n    },\n\n    TAG: function( match, curLoop ) {\n      return match[1].replace( rBackslash, \"\" ).toLowerCase();\n    },\n\n    CHILD: function( match ) {\n      if ( match[1] === \"nth\" ) {\n        if ( !match[2] ) {\n          Sizzle.error( match[0] );\n        }\n\n        match[2] = match[2].replace(/^\\+|\\s*/g, '');\n\n        // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'\n        var test = /(-?)(\\d*)(?:n([+\\-]?\\d*))?/.exec(\n          match[2] === \"even\" && \"2n\" || match[2] === \"odd\" && \"2n+1\" ||\n          !/\\D/.test( match[2] ) && \"0n+\" + match[2] || match[2]);\n\n        // calculate the numbers (first)n+(last) including if they are negative\n        match[2] = (test[1] + (test[2] || 1)) - 0;\n        match[3] = test[3] - 0;\n      }\n      else if ( match[2] ) {\n        Sizzle.error( match[0] );\n      }\n\n      // TODO: Move to normal caching system\n      match[0] = done++;\n\n      return match;\n    },\n\n    ATTR: function( match, curLoop, inplace, result, not, isXML ) {\n      var name = match[1] = match[1].replace( rBackslash, \"\" );\n      \n      if ( !isXML && Expr.attrMap[name] ) {\n        match[1] = Expr.attrMap[name];\n      }\n\n      // Handle if an un-quoted value was used\n      match[4] = ( match[4] || match[5] || \"\" ).replace( rBackslash, \"\" );\n\n      if ( match[2] === \"~=\" ) {\n        match[4] = \" \" + match[4] + \" \";\n      }\n\n      return match;\n    },\n\n    PSEUDO: function( match, curLoop, inplace, result, not ) {\n      if ( match[1] === \"not\" ) {\n        // If we're dealing with a complex expression, or a simple one\n        if ( ( chunker.exec(match[3]) || \"\" ).length > 1 || /^\\w/.test(match[3]) ) {\n          match[3] = Sizzle(match[3], null, null, curLoop);\n\n        } else {\n          var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);\n\n          if ( !inplace ) {\n            result.push.apply( result, ret );\n          }\n\n          return false;\n        }\n\n      } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {\n        return true;\n      }\n      \n      return match;\n    },\n\n    POS: function( match ) {\n      match.unshift( true );\n\n      return match;\n    }\n  },\n  \n  filters: {\n    enabled: function( elem ) {\n      return elem.disabled === false && elem.type !== \"hidden\";\n    },\n\n    disabled: function( elem ) {\n      return elem.disabled === true;\n    },\n\n    checked: function( elem ) {\n      return elem.checked === true;\n    },\n    \n    selected: function( elem ) {\n      // Accessing this property makes selected-by-default\n      // options in Safari work properly\n      if ( elem.parentNode ) {\n        elem.parentNode.selectedIndex;\n      }\n      \n      return elem.selected === true;\n    },\n\n    parent: function( elem ) {\n      return !!elem.firstChild;\n    },\n\n    empty: function( elem ) {\n      return !elem.firstChild;\n    },\n\n    has: function( elem, i, match ) {\n      return !!Sizzle( match[3], elem ).length;\n    },\n\n    header: function( elem ) {\n      return (/h\\d/i).test( elem.nodeName );\n    },\n\n    text: function( elem ) {\n      var attr = elem.getAttribute( \"type\" ), type = elem.type;\n      // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) \n      // use getAttribute instead to test this case\n      return elem.nodeName.toLowerCase() === \"input\" && \"text\" === type && ( attr === type || attr === null );\n    },\n\n    radio: function( elem ) {\n      return elem.nodeName.toLowerCase() === \"input\" && \"radio\" === elem.type;\n    },\n\n    checkbox: function( elem ) {\n      return elem.nodeName.toLowerCase() === \"input\" && \"checkbox\" === elem.type;\n    },\n\n    file: function( elem ) {\n      return elem.nodeName.toLowerCase() === \"input\" && \"file\" === elem.type;\n    },\n\n    password: function( elem ) {\n      return elem.nodeName.toLowerCase() === \"input\" && \"password\" === elem.type;\n    },\n\n    submit: function( elem ) {\n      var name = elem.nodeName.toLowerCase();\n      return (name === \"input\" || name === \"button\") && \"submit\" === elem.type;\n    },\n\n    image: function( elem ) {\n      return elem.nodeName.toLowerCase() === \"input\" && \"image\" === elem.type;\n    },\n\n    reset: function( elem ) {\n      var name = elem.nodeName.toLowerCase();\n      return (name === \"input\" || name === \"button\") && \"reset\" === elem.type;\n    },\n\n    button: function( elem ) {\n      var name = elem.nodeName.toLowerCase();\n      return name === \"input\" && \"button\" === elem.type || name === \"button\";\n    },\n\n    input: function( elem ) {\n      return (/input|select|textarea|button/i).test( elem.nodeName );\n    },\n\n    focus: function( elem ) {\n      return elem === elem.ownerDocument.activeElement;\n    }\n  },\n  setFilters: {\n    first: function( elem, i ) {\n      return i === 0;\n    },\n\n    last: function( elem, i, match, array ) {\n      return i === array.length - 1;\n    },\n\n    even: function( elem, i ) {\n      return i % 2 === 0;\n    },\n\n    odd: function( elem, i ) {\n      return i % 2 === 1;\n    },\n\n    lt: function( elem, i, match ) {\n      return i < match[3] - 0;\n    },\n\n    gt: function( elem, i, match ) {\n      return i > match[3] - 0;\n    },\n\n    nth: function( elem, i, match ) {\n      return match[3] - 0 === i;\n    },\n\n    eq: function( elem, i, match ) {\n      return match[3] - 0 === i;\n    }\n  },\n  filter: {\n    PSEUDO: function( elem, match, i, array ) {\n      var name = match[1],\n        filter = Expr.filters[ name ];\n\n      if ( filter ) {\n        return filter( elem, i, match, array );\n\n      } else if ( name === \"contains\" ) {\n        return (elem.textContent || elem.innerText || getText([ elem ]) || \"\").indexOf(match[3]) >= 0;\n\n      } else if ( name === \"not\" ) {\n        var not = match[3];\n\n        for ( var j = 0, l = not.length; j < l; j++ ) {\n          if ( not[j] === elem ) {\n            return false;\n          }\n        }\n\n        return true;\n\n      } else {\n        Sizzle.error( name );\n      }\n    },\n\n    CHILD: function( elem, match ) {\n      var first, last,\n        doneName, parent, cache,\n        count, diff,\n        type = match[1],\n        node = elem;\n\n      switch ( type ) {\n        case \"only\":\n        case \"first\":\n          while ( (node = node.previousSibling) )  {\n            if ( node.nodeType === 1 ) { \n              return false; \n            }\n          }\n\n          if ( type === \"first\" ) { \n            return true; \n          }\n\n          node = elem;\n\n        case \"last\":\n          while ( (node = node.nextSibling) )  {\n            if ( node.nodeType === 1 ) { \n              return false; \n            }\n          }\n\n          return true;\n\n        case \"nth\":\n          first = match[2];\n          last = match[3];\n\n          if ( first === 1 && last === 0 ) {\n            return true;\n          }\n          \n          doneName = match[0];\n          parent = elem.parentNode;\n  \n          if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {\n            count = 0;\n            \n            for ( node = parent.firstChild; node; node = node.nextSibling ) {\n              if ( node.nodeType === 1 ) {\n                node.nodeIndex = ++count;\n              }\n            } \n\n            parent[ expando ] = doneName;\n          }\n          \n          diff = elem.nodeIndex - last;\n\n          if ( first === 0 ) {\n            return diff === 0;\n\n          } else {\n            return ( diff % first === 0 && diff / first >= 0 );\n          }\n      }\n    },\n\n    ID: function( elem, match ) {\n      return elem.nodeType === 1 && elem.getAttribute(\"id\") === match;\n    },\n\n    TAG: function( elem, match ) {\n      return (match === \"*\" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;\n    },\n    \n    CLASS: function( elem, match ) {\n      return (\" \" + (elem.className || elem.getAttribute(\"class\")) + \" \")\n        .indexOf( match ) > -1;\n    },\n\n    ATTR: function( elem, match ) {\n      var name = match[1],\n        result = Sizzle.attr ?\n          Sizzle.attr( elem, name ) :\n          Expr.attrHandle[ name ] ?\n          Expr.attrHandle[ name ]( elem ) :\n          elem[ name ] != null ?\n            elem[ name ] :\n            elem.getAttribute( name ),\n        value = result + \"\",\n        type = match[2],\n        check = match[4];\n\n      return result == null ?\n        type === \"!=\" :\n        !type && Sizzle.attr ?\n        result != null :\n        type === \"=\" ?\n        value === check :\n        type === \"*=\" ?\n        value.indexOf(check) >= 0 :\n        type === \"~=\" ?\n        (\" \" + value + \" \").indexOf(check) >= 0 :\n        !check ?\n        value && result !== false :\n        type === \"!=\" ?\n        value !== check :\n        type === \"^=\" ?\n        value.indexOf(check) === 0 :\n        type === \"$=\" ?\n        value.substr(value.length - check.length) === check :\n        type === \"|=\" ?\n        value === check || value.substr(0, check.length + 1) === check + \"-\" :\n        false;\n    },\n\n    POS: function( elem, match, i, array ) {\n      var name = match[2],\n        filter = Expr.setFilters[ name ];\n\n      if ( filter ) {\n        return filter( elem, i, match, array );\n      }\n    }\n  }\n};\n\nvar origPOS = Expr.match.POS,\n  fescape = function(all, num){\n    return \"\\\\\" + (num - 0 + 1);\n  };\n\nfor ( var type in Expr.match ) {\n  Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\\[]*\\])(?![^\\(]*\\))/.source) );\n  Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\\r|\\n)*?)/.source + Expr.match[ type ].source.replace(/\\\\(\\d+)/g, fescape) );\n}\n\nvar makeArray = function( array, results ) {\n  array = Array.prototype.slice.call( array, 0 );\n\n  if ( results ) {\n    results.push.apply( results, array );\n    return results;\n  }\n  \n  return array;\n};\n\n// Perform a simple check to determine if the browser is capable of\n// converting a NodeList to an array using builtin methods.\n// Also verifies that the returned array holds DOM nodes\n// (which is not the case in the Blackberry browser)\ntry {\n  Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;\n\n// Provide a fallback method if it does not work\n} catch( e ) {\n  makeArray = function( array, results ) {\n    var i = 0,\n      ret = results || [];\n\n    if ( toString.call(array) === \"[object Array]\" ) {\n      Array.prototype.push.apply( ret, array );\n\n    } else {\n      if ( typeof array.length === \"number\" ) {\n        for ( var l = array.length; i < l; i++ ) {\n          ret.push( array[i] );\n        }\n\n      } else {\n        for ( ; array[i]; i++ ) {\n          ret.push( array[i] );\n        }\n      }\n    }\n\n    return ret;\n  };\n}\n\nvar sortOrder, siblingCheck;\n\nif ( document.documentElement.compareDocumentPosition ) {\n  sortOrder = function( a, b ) {\n    if ( a === b ) {\n      hasDuplicate = true;\n      return 0;\n    }\n\n    if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {\n      return a.compareDocumentPosition ? -1 : 1;\n    }\n\n    return a.compareDocumentPosition(b) & 4 ? -1 : 1;\n  };\n\n} else {\n  sortOrder = function( a, b ) {\n    // The nodes are identical, we can exit early\n    if ( a === b ) {\n      hasDuplicate = true;\n      return 0;\n\n    // Fallback to using sourceIndex (in IE) if it's available on both nodes\n    } else if ( a.sourceIndex && b.sourceIndex ) {\n      return a.sourceIndex - b.sourceIndex;\n    }\n\n    var al, bl,\n      ap = [],\n      bp = [],\n      aup = a.parentNode,\n      bup = b.parentNode,\n      cur = aup;\n\n    // If the nodes are siblings (or identical) we can do a quick check\n    if ( aup === bup ) {\n      return siblingCheck( a, b );\n\n    // If no parents were found then the nodes are disconnected\n    } else if ( !aup ) {\n      return -1;\n\n    } else if ( !bup ) {\n      return 1;\n    }\n\n    // Otherwise they're somewhere else in the tree so we need\n    // to build up a full list of the parentNodes for comparison\n    while ( cur ) {\n      ap.unshift( cur );\n      cur = cur.parentNode;\n    }\n\n    cur = bup;\n\n    while ( cur ) {\n      bp.unshift( cur );\n      cur = cur.parentNode;\n    }\n\n    al = ap.length;\n    bl = bp.length;\n\n    // Start walking down the tree looking for a discrepancy\n    for ( var i = 0; i < al && i < bl; i++ ) {\n      if ( ap[i] !== bp[i] ) {\n        return siblingCheck( ap[i], bp[i] );\n      }\n    }\n\n    // We ended someplace up the tree so do a sibling check\n    return i === al ?\n      siblingCheck( a, bp[i], -1 ) :\n      siblingCheck( ap[i], b, 1 );\n  };\n\n  siblingCheck = function( a, b, ret ) {\n    if ( a === b ) {\n      return ret;\n    }\n\n    var cur = a.nextSibling;\n\n    while ( cur ) {\n      if ( cur === b ) {\n        return -1;\n      }\n\n      cur = cur.nextSibling;\n    }\n\n    return 1;\n  };\n}\n\n// Check to see if the browser returns elements by name when\n// querying by getElementById (and provide a workaround)\n(function(){\n  // We're going to inject a fake input element with a specified name\n  var form = document.createElement(\"div\"),\n    id = \"script\" + (new Date()).getTime(),\n    root = document.documentElement;\n\n  form.innerHTML = \"<a name='\" + id + \"'/>\";\n\n  // Inject it into the root element, check its status, and remove it quickly\n  root.insertBefore( form, root.firstChild );\n\n  // The workaround has to do additional checks after a getElementById\n  // Which slows things down for other browsers (hence the branching)\n  if ( document.getElementById( id ) ) {\n    Expr.find.ID = function( match, context, isXML ) {\n      if ( typeof context.getElementById !== \"undefined\" && !isXML ) {\n        var m = context.getElementById(match[1]);\n\n        return m ?\n          m.id === match[1] || typeof m.getAttributeNode !== \"undefined\" && m.getAttributeNode(\"id\").nodeValue === match[1] ?\n            [m] :\n            undefined :\n          [];\n      }\n    };\n\n    Expr.filter.ID = function( elem, match ) {\n      var node = typeof elem.getAttributeNode !== \"undefined\" && elem.getAttributeNode(\"id\");\n\n      return elem.nodeType === 1 && node && node.nodeValue === match;\n    };\n  }\n\n  root.removeChild( form );\n\n  // release memory in IE\n  root = form = null;\n})();\n\n(function(){\n  // Check to see if the browser returns only elements\n  // when doing getElementsByTagName(\"*\")\n\n  // Create a fake element\n  var div = document.createElement(\"div\");\n  div.appendChild( document.createComment(\"\") );\n\n  // Make sure no comments are found\n  if ( div.getElementsByTagName(\"*\").length > 0 ) {\n    Expr.find.TAG = function( match, context ) {\n      var results = context.getElementsByTagName( match[1] );\n\n      // Filter out possible comments\n      if ( match[1] === \"*\" ) {\n        var tmp = [];\n\n        for ( var i = 0; results[i]; i++ ) {\n          if ( results[i].nodeType === 1 ) {\n            tmp.push( results[i] );\n          }\n        }\n\n        results = tmp;\n      }\n\n      return results;\n    };\n  }\n\n  // Check to see if an attribute returns normalized href attributes\n  div.innerHTML = \"<a href='#'></a>\";\n\n  if ( div.firstChild && typeof div.firstChild.getAttribute !== \"undefined\" &&\n      div.firstChild.getAttribute(\"href\") !== \"#\" ) {\n\n    Expr.attrHandle.href = function( elem ) {\n      return elem.getAttribute( \"href\", 2 );\n    };\n  }\n\n  // release memory in IE\n  div = null;\n})();\n\nif ( document.querySelectorAll ) {\n  (function(){\n    var oldSizzle = Sizzle,\n      div = document.createElement(\"div\"),\n      id = \"__sizzle__\";\n\n    div.innerHTML = \"<p class='TEST'></p>\";\n\n    // Safari can't handle uppercase or unicode characters when\n    // in quirks mode.\n    if ( div.querySelectorAll && div.querySelectorAll(\".TEST\").length === 0 ) {\n      return;\n    }\n  \n    Sizzle = function( query, context, extra, seed ) {\n      context = context || document;\n\n      // Only use querySelectorAll on non-XML documents\n      // (ID selectors don't work in non-HTML documents)\n      if ( !seed && !Sizzle.isXML(context) ) {\n        // See if we find a selector to speed up\n        var match = /^(\\w+$)|^\\.([\\w\\-]+$)|^#([\\w\\-]+$)/.exec( query );\n        \n        if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {\n          // Speed-up: Sizzle(\"TAG\")\n          if ( match[1] ) {\n            return makeArray( context.getElementsByTagName( query ), extra );\n          \n          // Speed-up: Sizzle(\".CLASS\")\n          } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {\n            return makeArray( context.getElementsByClassName( match[2] ), extra );\n          }\n        }\n        \n        if ( context.nodeType === 9 ) {\n          // Speed-up: Sizzle(\"body\")\n          // The body element only exists once, optimize finding it\n          if ( query === \"body\" && context.body ) {\n            return makeArray( [ context.body ], extra );\n            \n          // Speed-up: Sizzle(\"#ID\")\n          } else if ( match && match[3] ) {\n            var elem = context.getElementById( match[3] );\n\n            // Check parentNode to catch when Blackberry 4.6 returns\n            // nodes that are no longer in the document #6963\n            if ( elem && elem.parentNode ) {\n              // Handle the case where IE and Opera return items\n              // by name instead of ID\n              if ( elem.id === match[3] ) {\n                return makeArray( [ elem ], extra );\n              }\n              \n            } else {\n              return makeArray( [], extra );\n            }\n          }\n          \n          try {\n            return makeArray( context.querySelectorAll(query), extra );\n          } catch(qsaError) {}\n\n        // qSA works strangely on Element-rooted queries\n        // We can work around this by specifying an extra ID on the root\n        // and working up from there (Thanks to Andrew Dupont for the technique)\n        // IE 8 doesn't work on object elements\n        } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n          var oldContext = context,\n            old = context.getAttribute( \"id\" ),\n            nid = old || id,\n            hasParent = context.parentNode,\n            relativeHierarchySelector = /^\\s*[+~]/.test( query );\n\n          if ( !old ) {\n            context.setAttribute( \"id\", nid );\n          } else {\n            nid = nid.replace( /'/g, \"\\\\$&\" );\n          }\n          if ( relativeHierarchySelector && hasParent ) {\n            context = context.parentNode;\n          }\n\n          try {\n            if ( !relativeHierarchySelector || hasParent ) {\n              return makeArray( context.querySelectorAll( \"[id='\" + nid + \"'] \" + query ), extra );\n            }\n\n          } catch(pseudoError) {\n          } finally {\n            if ( !old ) {\n              oldContext.removeAttribute( \"id\" );\n            }\n          }\n        }\n      }\n    \n      return oldSizzle(query, context, extra, seed);\n    };\n\n    for ( var prop in oldSizzle ) {\n      Sizzle[ prop ] = oldSizzle[ prop ];\n    }\n\n    // release memory in IE\n    div = null;\n  })();\n}\n\n(function(){\n  var html = document.documentElement,\n    matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;\n\n  if ( matches ) {\n    // Check to see if it's possible to do matchesSelector\n    // on a disconnected node (IE 9 fails this)\n    var disconnectedMatch = !matches.call( document.createElement( \"div\" ), \"div\" ),\n      pseudoWorks = false;\n\n    try {\n      // This should fail with an exception\n      // Gecko does not error, returns false instead\n      matches.call( document.documentElement, \"[test!='']:sizzle\" );\n  \n    } catch( pseudoError ) {\n      pseudoWorks = true;\n    }\n\n    Sizzle.matchesSelector = function( node, expr ) {\n      // Make sure that attribute selectors are quoted\n      expr = expr.replace(/\\=\\s*([^'\"\\]]*)\\s*\\]/g, \"='$1']\");\n\n      if ( !Sizzle.isXML( node ) ) {\n        try { \n          if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {\n            var ret = matches.call( node, expr );\n\n            // IE 9's matchesSelector returns false on disconnected nodes\n            if ( ret || !disconnectedMatch ||\n                // As well, disconnected nodes are said to be in a document\n                // fragment in IE 9, so check for that\n                node.document && node.document.nodeType !== 11 ) {\n              return ret;\n            }\n          }\n        } catch(e) {}\n      }\n\n      return Sizzle(expr, null, null, [node]).length > 0;\n    };\n  }\n})();\n\n(function(){\n  var div = document.createElement(\"div\");\n\n  div.innerHTML = \"<div class='test e'></div><div class='test'></div>\";\n\n  // Opera can't find a second classname (in 9.6)\n  // Also, make sure that getElementsByClassName actually exists\n  if ( !div.getElementsByClassName || div.getElementsByClassName(\"e\").length === 0 ) {\n    return;\n  }\n\n  // Safari caches class attributes, doesn't catch changes (in 3.2)\n  div.lastChild.className = \"e\";\n\n  if ( div.getElementsByClassName(\"e\").length === 1 ) {\n    return;\n  }\n  \n  Expr.order.splice(1, 0, \"CLASS\");\n  Expr.find.CLASS = function( match, context, isXML ) {\n    if ( typeof context.getElementsByClassName !== \"undefined\" && !isXML ) {\n      return context.getElementsByClassName(match[1]);\n    }\n  };\n\n  // release memory in IE\n  div = null;\n})();\n\nfunction dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {\n  for ( var i = 0, l = checkSet.length; i < l; i++ ) {\n    var elem = checkSet[i];\n\n    if ( elem ) {\n      var match = false;\n\n      elem = elem[dir];\n\n      while ( elem ) {\n        if ( elem[ expando ] === doneName ) {\n          match = checkSet[elem.sizset];\n          break;\n        }\n\n        if ( elem.nodeType === 1 && !isXML ){\n          elem[ expando ] = doneName;\n          elem.sizset = i;\n        }\n\n        if ( elem.nodeName.toLowerCase() === cur ) {\n          match = elem;\n          break;\n        }\n\n        elem = elem[dir];\n      }\n\n      checkSet[i] = match;\n    }\n  }\n}\n\nfunction dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {\n  for ( var i = 0, l = checkSet.length; i < l; i++ ) {\n    var elem = checkSet[i];\n\n    if ( elem ) {\n      var match = false;\n      \n      elem = elem[dir];\n\n      while ( elem ) {\n        if ( elem[ expando ] === doneName ) {\n          match = checkSet[elem.sizset];\n          break;\n        }\n\n        if ( elem.nodeType === 1 ) {\n          if ( !isXML ) {\n            elem[ expando ] = doneName;\n            elem.sizset = i;\n          }\n\n          if ( typeof cur !== \"string\" ) {\n            if ( elem === cur ) {\n              match = true;\n              break;\n            }\n\n          } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {\n            match = elem;\n            break;\n          }\n        }\n\n        elem = elem[dir];\n      }\n\n      checkSet[i] = match;\n    }\n  }\n}\n\nif ( document.documentElement.contains ) {\n  Sizzle.contains = function( a, b ) {\n    return a !== b && (a.contains ? a.contains(b) : true);\n  };\n\n} else if ( document.documentElement.compareDocumentPosition ) {\n  Sizzle.contains = function( a, b ) {\n    return !!(a.compareDocumentPosition(b) & 16);\n  };\n\n} else {\n  Sizzle.contains = function() {\n    return false;\n  };\n}\n\nSizzle.isXML = function( elem ) {\n  // documentElement is verified for cases where it doesn't yet exist\n  // (such as loading iframes in IE - #4833) \n  var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;\n\n  return documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\nvar posProcess = function( selector, context, seed ) {\n  var match,\n    tmpSet = [],\n    later = \"\",\n    root = context.nodeType ? [context] : context;\n\n  // Position selectors must be done after the filter\n  // And so must :not(positional) so we move all PSEUDOs to the end\n  while ( (match = Expr.match.PSEUDO.exec( selector )) ) {\n    later += match[0];\n    selector = selector.replace( Expr.match.PSEUDO, \"\" );\n  }\n\n  selector = Expr.relative[selector] ? selector + \"*\" : selector;\n\n  for ( var i = 0, l = root.length; i < l; i++ ) {\n    Sizzle( selector, root[i], tmpSet, seed );\n  }\n\n  return Sizzle.filter( later, tmpSet );\n};\n\n// EXPOSE\n// Override sizzle attribute retrieval\nSizzle.attr = jQuery.attr;\nSizzle.selectors.attrMap = {};\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.filters;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n})();\n\n\nvar runtil = /Until$/,\n  rparentsprev = /^(?:parents|prevUntil|prevAll)/,\n  // Note: This RegExp should be improved, or likely pulled from Sizzle\n  rmultiselector = /,/,\n  isSimple = /^.[^:#\\[\\.,]*$/,\n  slice = Array.prototype.slice,\n  POS = jQuery.expr.match.POS,\n  // methods guaranteed to produce a unique set when starting from a unique set\n  guaranteedUnique = {\n    children: true,\n    contents: true,\n    next: true,\n    prev: true\n  };\n\njQuery.fn.extend({\n  find: function( selector ) {\n    var self = this,\n      i, l;\n\n    if ( typeof selector !== \"string\" ) {\n      return jQuery( selector ).filter(function() {\n        for ( i = 0, l = self.length; i < l; i++ ) {\n          if ( jQuery.contains( self[ i ], this ) ) {\n            return true;\n          }\n        }\n      });\n    }\n\n    var ret = this.pushStack( \"\", \"find\", selector ),\n      length, n, r;\n\n    for ( i = 0, l = this.length; i < l; i++ ) {\n      length = ret.length;\n      jQuery.find( selector, this[i], ret );\n\n      if ( i > 0 ) {\n        // Make sure that the results are unique\n        for ( n = length; n < ret.length; n++ ) {\n          for ( r = 0; r < length; r++ ) {\n            if ( ret[r] === ret[n] ) {\n              ret.splice(n--, 1);\n              break;\n            }\n          }\n        }\n      }\n    }\n\n    return ret;\n  },\n\n  has: function( target ) {\n    var targets = jQuery( target );\n    return this.filter(function() {\n      for ( var i = 0, l = targets.length; i < l; i++ ) {\n        if ( jQuery.contains( this, targets[i] ) ) {\n          return true;\n        }\n      }\n    });\n  },\n\n  not: function( selector ) {\n    return this.pushStack( winnow(this, selector, false), \"not\", selector);\n  },\n\n  filter: function( selector ) {\n    return this.pushStack( winnow(this, selector, true), \"filter\", selector );\n  },\n\n  is: function( selector ) {\n    return !!selector && ( \n      typeof selector === \"string\" ?\n        // If this is a positional selector, check membership in the returned set\n        // so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n        POS.test( selector ) ? \n          jQuery( selector, this.context ).index( this[0] ) >= 0 :\n          jQuery.filter( selector, this ).length > 0 :\n        this.filter( selector ).length > 0 );\n  },\n\n  closest: function( selectors, context ) {\n    var ret = [], i, l, cur = this[0];\n    \n    // Array (deprecated as of jQuery 1.7)\n    if ( jQuery.isArray( selectors ) ) {\n      var level = 1;\n\n      while ( cur && cur.ownerDocument && cur !== context ) {\n        for ( i = 0; i < selectors.length; i++ ) {\n\n          if ( jQuery( cur ).is( selectors[ i ] ) ) {\n            ret.push({ selector: selectors[ i ], elem: cur, level: level });\n          }\n        }\n\n        cur = cur.parentNode;\n        level++;\n      }\n\n      return ret;\n    }\n\n    // String\n    var pos = POS.test( selectors ) || typeof selectors !== \"string\" ?\n        jQuery( selectors, context || this.context ) :\n        0;\n\n    for ( i = 0, l = this.length; i < l; i++ ) {\n      cur = this[i];\n\n      while ( cur ) {\n        if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {\n          ret.push( cur );\n          break;\n\n        } else {\n          cur = cur.parentNode;\n          if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {\n            break;\n          }\n        }\n      }\n    }\n\n    ret = ret.length > 1 ? jQuery.unique( ret ) : ret;\n\n    return this.pushStack( ret, \"closest\", selectors );\n  },\n\n  // Determine the position of an element within\n  // the matched set of elements\n  index: function( elem ) {\n\n    // No argument, return index in parent\n    if ( !elem ) {\n      return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;\n    }\n\n    // index in selector\n    if ( typeof elem === \"string\" ) {\n      return jQuery.inArray( this[0], jQuery( elem ) );\n    }\n\n    // Locate the position of the desired element\n    return jQuery.inArray(\n      // If it receives a jQuery object, the first element is used\n      elem.jquery ? elem[0] : elem, this );\n  },\n\n  add: function( selector, context ) {\n    var set = typeof selector === \"string\" ?\n        jQuery( selector, context ) :\n        jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),\n      all = jQuery.merge( this.get(), set );\n\n    return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?\n      all :\n      jQuery.unique( all ) );\n  },\n\n  andSelf: function() {\n    return this.add( this.prevObject );\n  }\n});\n\n// A painfully simple check to see if an element is disconnected\n// from a document (should be improved, where feasible).\nfunction isDisconnected( node ) {\n  return !node || !node.parentNode || node.parentNode.nodeType === 11;\n}\n\njQuery.each({\n  parent: function( elem ) {\n    var parent = elem.parentNode;\n    return parent && parent.nodeType !== 11 ? parent : null;\n  },\n  parents: function( elem ) {\n    return jQuery.dir( elem, \"parentNode\" );\n  },\n  parentsUntil: function( elem, i, until ) {\n    return jQuery.dir( elem, \"parentNode\", until );\n  },\n  next: function( elem ) {\n    return jQuery.nth( elem, 2, \"nextSibling\" );\n  },\n  prev: function( elem ) {\n    return jQuery.nth( elem, 2, \"previousSibling\" );\n  },\n  nextAll: function( elem ) {\n    return jQuery.dir( elem, \"nextSibling\" );\n  },\n  prevAll: function( elem ) {\n    return jQuery.dir( elem, \"previousSibling\" );\n  },\n  nextUntil: function( elem, i, until ) {\n    return jQuery.dir( elem, \"nextSibling\", until );\n  },\n  prevUntil: function( elem, i, until ) {\n    return jQuery.dir( elem, \"previousSibling\", until );\n  },\n  siblings: function( elem ) {\n    return jQuery.sibling( elem.parentNode.firstChild, elem );\n  },\n  children: function( elem ) {\n    return jQuery.sibling( elem.firstChild );\n  },\n  contents: function( elem ) {\n    return jQuery.nodeName( elem, \"iframe\" ) ?\n      elem.contentDocument || elem.contentWindow.document :\n      jQuery.makeArray( elem.childNodes );\n  }\n}, function( name, fn ) {\n  jQuery.fn[ name ] = function( until, selector ) {\n    var ret = jQuery.map( this, fn, until );\n\n    if ( !runtil.test( name ) ) {\n      selector = until;\n    }\n\n    if ( selector && typeof selector === \"string\" ) {\n      ret = jQuery.filter( selector, ret );\n    }\n\n    ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;\n\n    if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {\n      ret = ret.reverse();\n    }\n\n    return this.pushStack( ret, name, slice.call( arguments ).join(\",\") );\n  };\n});\n\njQuery.extend({\n  filter: function( expr, elems, not ) {\n    if ( not ) {\n      expr = \":not(\" + expr + \")\";\n    }\n\n    return elems.length === 1 ?\n      jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :\n      jQuery.find.matches(expr, elems);\n  },\n\n  dir: function( elem, dir, until ) {\n    var matched = [],\n      cur = elem[ dir ];\n\n    while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\n      if ( cur.nodeType === 1 ) {\n        matched.push( cur );\n      }\n      cur = cur[dir];\n    }\n    return matched;\n  },\n\n  nth: function( cur, result, dir, elem ) {\n    result = result || 1;\n    var num = 0;\n\n    for ( ; cur; cur = cur[dir] ) {\n      if ( cur.nodeType === 1 && ++num === result ) {\n        break;\n      }\n    }\n\n    return cur;\n  },\n\n  sibling: function( n, elem ) {\n    var r = [];\n\n    for ( ; n; n = n.nextSibling ) {\n      if ( n.nodeType === 1 && n !== elem ) {\n        r.push( n );\n      }\n    }\n\n    return r;\n  }\n});\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, keep ) {\n\n  // Can't pass null or undefined to indexOf in Firefox 4\n  // Set to 0 to skip string check\n  qualifier = qualifier || 0;\n\n  if ( jQuery.isFunction( qualifier ) ) {\n    return jQuery.grep(elements, function( elem, i ) {\n      var retVal = !!qualifier.call( elem, i, elem );\n      return retVal === keep;\n    });\n\n  } else if ( qualifier.nodeType ) {\n    return jQuery.grep(elements, function( elem, i ) {\n      return ( elem === qualifier ) === keep;\n    });\n\n  } else if ( typeof qualifier === \"string\" ) {\n    var filtered = jQuery.grep(elements, function( elem ) {\n      return elem.nodeType === 1;\n    });\n\n    if ( isSimple.test( qualifier ) ) {\n      return jQuery.filter(qualifier, filtered, !keep);\n    } else {\n      qualifier = jQuery.filter( qualifier, filtered );\n    }\n  }\n\n  return jQuery.grep(elements, function( elem, i ) {\n    return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;\n  });\n}\n\n\n\n\nfunction createSafeFragment( document ) {\n  var list = nodeNames.split( \"|\" ),\n  safeFrag = document.createDocumentFragment();\n\n  if ( safeFrag.createElement ) {\n    while ( list.length ) {\n      safeFrag.createElement(\n        list.pop()\n      );\n    }\n  }\n  return safeFrag;\n}\n\nvar nodeNames = \"abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|\" +\n    \"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",\n  rinlinejQuery = / jQuery\\d+=\"(?:\\d+|null)\"/g,\n  rleadingWhitespace = /^\\s+/,\n  rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/ig,\n  rtagName = /<([\\w:]+)/,\n  rtbody = /<tbody/i,\n  rhtml = /<|&#?\\w+;/,\n  rnoInnerhtml = /<(?:script|style)/i,\n  rnocache = /<(?:script|object|embed|option|style)/i,\n  rnoshimcache = new RegExp(\"<(?:\" + nodeNames + \")\", \"i\"),\n  // checked=\"checked\" or checked\n  rchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n  rscriptType = /\\/(java|ecma)script/i,\n  rcleanScript = /^\\s*<!(?:\\[CDATA\\[|\\-\\-)/,\n  wrapMap = {\n    option: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n    legend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\n    thead: [ 1, \"<table>\", \"</table>\" ],\n    tr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n    td: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n    col: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\n    area: [ 1, \"<map>\", \"</map>\" ],\n    _default: [ 0, \"\", \"\" ]\n  },\n  safeFragment = createSafeFragment( document );\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// IE can't serialize <link> and <script> tags normally\nif ( !jQuery.support.htmlSerialize ) {\n  wrapMap._default = [ 1, \"div<div>\", \"</div>\" ];\n}\n\njQuery.fn.extend({\n  text: function( text ) {\n    if ( jQuery.isFunction(text) ) {\n      return this.each(function(i) {\n        var self = jQuery( this );\n\n        self.text( text.call(this, i, self.text()) );\n      });\n    }\n\n    if ( typeof text !== \"object\" && text !== undefined ) {\n      return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );\n    }\n\n    return jQuery.text( this );\n  },\n\n  wrapAll: function( html ) {\n    if ( jQuery.isFunction( html ) ) {\n      return this.each(function(i) {\n        jQuery(this).wrapAll( html.call(this, i) );\n      });\n    }\n\n    if ( this[0] ) {\n      // The elements to wrap the target around\n      var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);\n\n      if ( this[0].parentNode ) {\n        wrap.insertBefore( this[0] );\n      }\n\n      wrap.map(function() {\n        var elem = this;\n\n        while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\n          elem = elem.firstChild;\n        }\n\n        return elem;\n      }).append( this );\n    }\n\n    return this;\n  },\n\n  wrapInner: function( html ) {\n    if ( jQuery.isFunction( html ) ) {\n      return this.each(function(i) {\n        jQuery(this).wrapInner( html.call(this, i) );\n      });\n    }\n\n    return this.each(function() {\n      var self = jQuery( this ),\n        contents = self.contents();\n\n      if ( contents.length ) {\n        contents.wrapAll( html );\n\n      } else {\n        self.append( html );\n      }\n    });\n  },\n\n  wrap: function( html ) {\n    var isFunction = jQuery.isFunction( html );\n\n    return this.each(function(i) {\n      jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\n    });\n  },\n\n  unwrap: function() {\n    return this.parent().each(function() {\n      if ( !jQuery.nodeName( this, \"body\" ) ) {\n        jQuery( this ).replaceWith( this.childNodes );\n      }\n    }).end();\n  },\n\n  append: function() {\n    return this.domManip(arguments, true, function( elem ) {\n      if ( this.nodeType === 1 ) {\n        this.appendChild( elem );\n      }\n    });\n  },\n\n  prepend: function() {\n    return this.domManip(arguments, true, function( elem ) {\n      if ( this.nodeType === 1 ) {\n        this.insertBefore( elem, this.firstChild );\n      }\n    });\n  },\n\n  before: function() {\n    if ( this[0] && this[0].parentNode ) {\n      return this.domManip(arguments, false, function( elem ) {\n        this.parentNode.insertBefore( elem, this );\n      });\n    } else if ( arguments.length ) {\n      var set = jQuery.clean( arguments );\n      set.push.apply( set, this.toArray() );\n      return this.pushStack( set, \"before\", arguments );\n    }\n  },\n\n  after: function() {\n    if ( this[0] && this[0].parentNode ) {\n      return this.domManip(arguments, false, function( elem ) {\n        this.parentNode.insertBefore( elem, this.nextSibling );\n      });\n    } else if ( arguments.length ) {\n      var set = this.pushStack( this, \"after\", arguments );\n      set.push.apply( set, jQuery.clean(arguments) );\n      return set;\n    }\n  },\n\n  // keepData is for internal use only--do not document\n  remove: function( selector, keepData ) {\n    for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {\n      if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {\n        if ( !keepData && elem.nodeType === 1 ) {\n          jQuery.cleanData( elem.getElementsByTagName(\"*\") );\n          jQuery.cleanData( [ elem ] );\n        }\n\n        if ( elem.parentNode ) {\n          elem.parentNode.removeChild( elem );\n        }\n      }\n    }\n\n    return this;\n  },\n\n  empty: function() {\n    for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {\n      // Remove element nodes and prevent memory leaks\n      if ( elem.nodeType === 1 ) {\n        jQuery.cleanData( elem.getElementsByTagName(\"*\") );\n      }\n\n      // Remove any remaining nodes\n      while ( elem.firstChild ) {\n        elem.removeChild( elem.firstChild );\n      }\n    }\n\n    return this;\n  },\n\n  clone: function( dataAndEvents, deepDataAndEvents ) {\n    dataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n    deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n    return this.map( function () {\n      return jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n    });\n  },\n\n  html: function( value ) {\n    if ( value === undefined ) {\n      return this[0] && this[0].nodeType === 1 ?\n        this[0].innerHTML.replace(rinlinejQuery, \"\") :\n        null;\n\n    // See if we can take a shortcut and just use innerHTML\n    } else if ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n      (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&\n      !wrapMap[ (rtagName.exec( value ) || [\"\", \"\"])[1].toLowerCase() ] ) {\n\n      value = value.replace(rxhtmlTag, \"<$1></$2>\");\n\n      try {\n        for ( var i = 0, l = this.length; i < l; i++ ) {\n          // Remove element nodes and prevent memory leaks\n          if ( this[i].nodeType === 1 ) {\n            jQuery.cleanData( this[i].getElementsByTagName(\"*\") );\n            this[i].innerHTML = value;\n          }\n        }\n\n      // If using innerHTML throws an exception, use the fallback method\n      } catch(e) {\n        this.empty().append( value );\n      }\n\n    } else if ( jQuery.isFunction( value ) ) {\n      this.each(function(i){\n        var self = jQuery( this );\n\n        self.html( value.call(this, i, self.html()) );\n      });\n\n    } else {\n      this.empty().append( value );\n    }\n\n    return this;\n  },\n\n  replaceWith: function( value ) {\n    if ( this[0] && this[0].parentNode ) {\n      // Make sure that the elements are removed from the DOM before they are inserted\n      // this can help fix replacing a parent with child elements\n      if ( jQuery.isFunction( value ) ) {\n        return this.each(function(i) {\n          var self = jQuery(this), old = self.html();\n          self.replaceWith( value.call( this, i, old ) );\n        });\n      }\n\n      if ( typeof value !== \"string\" ) {\n        value = jQuery( value ).detach();\n      }\n\n      return this.each(function() {\n        var next = this.nextSibling,\n          parent = this.parentNode;\n\n        jQuery( this ).remove();\n\n        if ( next ) {\n          jQuery(next).before( value );\n        } else {\n          jQuery(parent).append( value );\n        }\n      });\n    } else {\n      return this.length ?\n        this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), \"replaceWith\", value ) :\n        this;\n    }\n  },\n\n  detach: function( selector ) {\n    return this.remove( selector, true );\n  },\n\n  domManip: function( args, table, callback ) {\n    var results, first, fragment, parent,\n      value = args[0],\n      scripts = [];\n\n    // We can't cloneNode fragments that contain checked, in WebKit\n    if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === \"string\" && rchecked.test( value ) ) {\n      return this.each(function() {\n        jQuery(this).domManip( args, table, callback, true );\n      });\n    }\n\n    if ( jQuery.isFunction(value) ) {\n      return this.each(function(i) {\n        var self = jQuery(this);\n        args[0] = value.call(this, i, table ? self.html() : undefined);\n        self.domManip( args, table, callback );\n      });\n    }\n\n    if ( this[0] ) {\n      parent = value && value.parentNode;\n\n      // If we're in a fragment, just use that instead of building a new one\n      if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {\n        results = { fragment: parent };\n\n      } else {\n        results = jQuery.buildFragment( args, this, scripts );\n      }\n\n      fragment = results.fragment;\n\n      if ( fragment.childNodes.length === 1 ) {\n        first = fragment = fragment.firstChild;\n      } else {\n        first = fragment.firstChild;\n      }\n\n      if ( first ) {\n        table = table && jQuery.nodeName( first, \"tr\" );\n\n        for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {\n          callback.call(\n            table ?\n              root(this[i], first) :\n              this[i],\n            // Make sure that we do not leak memory by inadvertently discarding\n            // the original fragment (which might have attached data) instead of\n            // using it; in addition, use the original fragment object for the last\n            // item instead of first because it can end up being emptied incorrectly\n            // in certain situations (Bug #8070).\n            // Fragments from the fragment cache must always be cloned and never used\n            // in place.\n            results.cacheable || ( l > 1 && i < lastIndex ) ?\n              jQuery.clone( fragment, true, true ) :\n              fragment\n          );\n        }\n      }\n\n      if ( scripts.length ) {\n        jQuery.each( scripts, evalScript );\n      }\n    }\n\n    return this;\n  }\n});\n\nfunction root( elem, cur ) {\n  return jQuery.nodeName(elem, \"table\") ?\n    (elem.getElementsByTagName(\"tbody\")[0] ||\n    elem.appendChild(elem.ownerDocument.createElement(\"tbody\"))) :\n    elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\n  if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\n    return;\n  }\n\n  var type, i, l,\n    oldData = jQuery._data( src ),\n    curData = jQuery._data( dest, oldData ),\n    events = oldData.events;\n\n  if ( events ) {\n    delete curData.handle;\n    curData.events = {};\n\n    for ( type in events ) {\n      for ( i = 0, l = events[ type ].length; i < l; i++ ) {\n        jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? \".\" : \"\" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );\n      }\n    }\n  }\n\n  // make the cloned public data object a copy from the original\n  if ( curData.data ) {\n    curData.data = jQuery.extend( {}, curData.data );\n  }\n}\n\nfunction cloneFixAttributes( src, dest ) {\n  var nodeName;\n\n  // We do not need to do anything for non-Elements\n  if ( dest.nodeType !== 1 ) {\n    return;\n  }\n\n  // clearAttributes removes the attributes, which we don't want,\n  // but also removes the attachEvent events, which we *do* want\n  if ( dest.clearAttributes ) {\n    dest.clearAttributes();\n  }\n\n  // mergeAttributes, in contrast, only merges back on the\n  // original attributes, not the events\n  if ( dest.mergeAttributes ) {\n    dest.mergeAttributes( src );\n  }\n\n  nodeName = dest.nodeName.toLowerCase();\n\n  // IE6-8 fail to clone children inside object elements that use\n  // the proprietary classid attribute value (rather than the type\n  // attribute) to identify the type of content to display\n  if ( nodeName === \"object\" ) {\n    dest.outerHTML = src.outerHTML;\n\n  } else if ( nodeName === \"input\" && (src.type === \"checkbox\" || src.type === \"radio\") ) {\n    // IE6-8 fails to persist the checked state of a cloned checkbox\n    // or radio button. Worse, IE6-7 fail to give the cloned element\n    // a checked appearance if the defaultChecked value isn't also set\n    if ( src.checked ) {\n      dest.defaultChecked = dest.checked = src.checked;\n    }\n\n    // IE6-7 get confused and end up setting the value of a cloned\n    // checkbox/radio button to an empty string instead of \"on\"\n    if ( dest.value !== src.value ) {\n      dest.value = src.value;\n    }\n\n  // IE6-8 fails to return the selected option to the default selected\n  // state when cloning options\n  } else if ( nodeName === \"option\" ) {\n    dest.selected = src.defaultSelected;\n\n  // IE6-8 fails to set the defaultValue to the correct value when\n  // cloning other types of input fields\n  } else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n    dest.defaultValue = src.defaultValue;\n  }\n\n  // Event data gets referenced instead of copied if the expando\n  // gets copied too\n  dest.removeAttribute( jQuery.expando );\n}\n\njQuery.buildFragment = function( args, nodes, scripts ) {\n  var fragment, cacheable, cacheresults, doc,\n  first = args[ 0 ];\n\n  // nodes may contain either an explicit document object,\n  // a jQuery collection or context object.\n  // If nodes[0] contains a valid object to assign to doc\n  if ( nodes && nodes[0] ) {\n    doc = nodes[0].ownerDocument || nodes[0];\n  }\n\n  // Ensure that an attr object doesn't incorrectly stand in as a document object\n  // Chrome and Firefox seem to allow this to occur and will throw exception\n  // Fixes #8950\n  if ( !doc.createDocumentFragment ) {\n    doc = document;\n  }\n\n  // Only cache \"small\" (1/2 KB) HTML strings that are associated with the main document\n  // Cloning options loses the selected state, so don't cache them\n  // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment\n  // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache\n  // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501\n  if ( args.length === 1 && typeof first === \"string\" && first.length < 512 && doc === document &&\n    first.charAt(0) === \"<\" && !rnocache.test( first ) &&\n    (jQuery.support.checkClone || !rchecked.test( first )) &&\n    (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {\n\n    cacheable = true;\n\n    cacheresults = jQuery.fragments[ first ];\n    if ( cacheresults && cacheresults !== 1 ) {\n      fragment = cacheresults;\n    }\n  }\n\n  if ( !fragment ) {\n    fragment = doc.createDocumentFragment();\n    jQuery.clean( args, doc, fragment, scripts );\n  }\n\n  if ( cacheable ) {\n    jQuery.fragments[ first ] = cacheresults ? fragment : 1;\n  }\n\n  return { fragment: fragment, cacheable: cacheable };\n};\n\njQuery.fragments = {};\n\njQuery.each({\n  appendTo: \"append\",\n  prependTo: \"prepend\",\n  insertBefore: \"before\",\n  insertAfter: \"after\",\n  replaceAll: \"replaceWith\"\n}, function( name, original ) {\n  jQuery.fn[ name ] = function( selector ) {\n    var ret = [],\n      insert = jQuery( selector ),\n      parent = this.length === 1 && this[0].parentNode;\n\n    if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {\n      insert[ original ]( this[0] );\n      return this;\n\n    } else {\n      for ( var i = 0, l = insert.length; i < l; i++ ) {\n        var elems = ( i > 0 ? this.clone(true) : this ).get();\n        jQuery( insert[i] )[ original ]( elems );\n        ret = ret.concat( elems );\n      }\n\n      return this.pushStack( ret, name, insert.selector );\n    }\n  };\n});\n\nfunction getAll( elem ) {\n  if ( typeof elem.getElementsByTagName !== \"undefined\" ) {\n    return elem.getElementsByTagName( \"*\" );\n\n  } else if ( typeof elem.querySelectorAll !== \"undefined\" ) {\n    return elem.querySelectorAll( \"*\" );\n\n  } else {\n    return [];\n  }\n}\n\n// Used in clean, fixes the defaultChecked property\nfunction fixDefaultChecked( elem ) {\n  if ( elem.type === \"checkbox\" || elem.type === \"radio\" ) {\n    elem.defaultChecked = elem.checked;\n  }\n}\n// Finds all inputs and passes them to fixDefaultChecked\nfunction findInputs( elem ) {\n  var nodeName = ( elem.nodeName || \"\" ).toLowerCase();\n  if ( nodeName === \"input\" ) {\n    fixDefaultChecked( elem );\n  // Skip scripts, get other children\n  } else if ( nodeName !== \"script\" && typeof elem.getElementsByTagName !== \"undefined\" ) {\n    jQuery.grep( elem.getElementsByTagName(\"input\"), fixDefaultChecked );\n  }\n}\n\n// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js\nfunction shimCloneNode( elem ) {\n  var div = document.createElement( \"div\" );\n  safeFragment.appendChild( div );\n\n  div.innerHTML = elem.outerHTML;\n  return div.firstChild;\n}\n\njQuery.extend({\n  clone: function( elem, dataAndEvents, deepDataAndEvents ) {\n    var srcElements,\n      destElements,\n      i,\n      // IE<=8 does not properly clone detached, unknown element nodes\n      clone = jQuery.support.html5Clone || !rnoshimcache.test( \"<\" + elem.nodeName ) ?\n        elem.cloneNode( true ) :\n        shimCloneNode( elem );\n\n    if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&\n        (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {\n      // IE copies events bound via attachEvent when using cloneNode.\n      // Calling detachEvent on the clone will also remove the events\n      // from the original. In order to get around this, we use some\n      // proprietary methods to clear the events. Thanks to MooTools\n      // guys for this hotness.\n\n      cloneFixAttributes( elem, clone );\n\n      // Using Sizzle here is crazy slow, so we use getElementsByTagName instead\n      srcElements = getAll( elem );\n      destElements = getAll( clone );\n\n      // Weird iteration because IE will replace the length property\n      // with an element if you are cloning the body and one of the\n      // elements on the page has a name or id of \"length\"\n      for ( i = 0; srcElements[i]; ++i ) {\n        // Ensure that the destination node is not null; Fixes #9587\n        if ( destElements[i] ) {\n          cloneFixAttributes( srcElements[i], destElements[i] );\n        }\n      }\n    }\n\n    // Copy the events from the original to the clone\n    if ( dataAndEvents ) {\n      cloneCopyEvent( elem, clone );\n\n      if ( deepDataAndEvents ) {\n        srcElements = getAll( elem );\n        destElements = getAll( clone );\n\n        for ( i = 0; srcElements[i]; ++i ) {\n          cloneCopyEvent( srcElements[i], destElements[i] );\n        }\n      }\n    }\n\n    srcElements = destElements = null;\n\n    // Return the cloned set\n    return clone;\n  },\n\n  clean: function( elems, context, fragment, scripts ) {\n    var checkScriptType;\n\n    context = context || document;\n\n    // !context.createElement fails in IE with an error but returns typeof 'object'\n    if ( typeof context.createElement === \"undefined\" ) {\n      context = context.ownerDocument || context[0] && context[0].ownerDocument || document;\n    }\n\n    var ret = [], j;\n\n    for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {\n      if ( typeof elem === \"number\" ) {\n        elem += \"\";\n      }\n\n      if ( !elem ) {\n        continue;\n      }\n\n      // Convert html string into DOM nodes\n      if ( typeof elem === \"string\" ) {\n        if ( !rhtml.test( elem ) ) {\n          elem = context.createTextNode( elem );\n        } else {\n          // Fix \"XHTML\"-style tags in all browsers\n          elem = elem.replace(rxhtmlTag, \"<$1></$2>\");\n\n          // Trim whitespace, otherwise indexOf won't work as expected\n          var tag = ( rtagName.exec( elem ) || [\"\", \"\"] )[1].toLowerCase(),\n            wrap = wrapMap[ tag ] || wrapMap._default,\n            depth = wrap[0],\n            div = context.createElement(\"div\");\n\n          // Append wrapper element to unknown element safe doc fragment\n          if ( context === document ) {\n            // Use the fragment we've already created for this document\n            safeFragment.appendChild( div );\n          } else {\n            // Use a fragment created with the owner document\n            createSafeFragment( context ).appendChild( div );\n          }\n\n          // Go to html and back, then peel off extra wrappers\n          div.innerHTML = wrap[1] + elem + wrap[2];\n\n          // Move to the right depth\n          while ( depth-- ) {\n            div = div.lastChild;\n          }\n\n          // Remove IE's autoinserted <tbody> from table fragments\n          if ( !jQuery.support.tbody ) {\n\n            // String was a <table>, *may* have spurious <tbody>\n            var hasBody = rtbody.test(elem),\n              tbody = tag === \"table\" && !hasBody ?\n                div.firstChild && div.firstChild.childNodes :\n\n                // String was a bare <thead> or <tfoot>\n                wrap[1] === \"<table>\" && !hasBody ?\n                  div.childNodes :\n                  [];\n\n            for ( j = tbody.length - 1; j >= 0 ; --j ) {\n              if ( jQuery.nodeName( tbody[ j ], \"tbody\" ) && !tbody[ j ].childNodes.length ) {\n                tbody[ j ].parentNode.removeChild( tbody[ j ] );\n              }\n            }\n          }\n\n          // IE completely kills leading whitespace when innerHTML is used\n          if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\n            div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );\n          }\n\n          elem = div.childNodes;\n        }\n      }\n\n      // Resets defaultChecked for any radios and checkboxes\n      // about to be appended to the DOM in IE 6/7 (#8060)\n      var len;\n      if ( !jQuery.support.appendChecked ) {\n        if ( elem[0] && typeof (len = elem.length) === \"number\" ) {\n          for ( j = 0; j < len; j++ ) {\n            findInputs( elem[j] );\n          }\n        } else {\n          findInputs( elem );\n        }\n      }\n\n      if ( elem.nodeType ) {\n        ret.push( elem );\n      } else {\n        ret = jQuery.merge( ret, elem );\n      }\n    }\n\n    if ( fragment ) {\n      checkScriptType = function( elem ) {\n        return !elem.type || rscriptType.test( elem.type );\n      };\n      for ( i = 0; ret[i]; i++ ) {\n        if ( scripts && jQuery.nodeName( ret[i], \"script\" ) && (!ret[i].type || ret[i].type.toLowerCase() === \"text/javascript\") ) {\n          scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );\n\n        } else {\n          if ( ret[i].nodeType === 1 ) {\n            var jsTags = jQuery.grep( ret[i].getElementsByTagName( \"script\" ), checkScriptType );\n\n            ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );\n          }\n          fragment.appendChild( ret[i] );\n        }\n      }\n    }\n\n    return ret;\n  },\n\n  cleanData: function( elems ) {\n    var data, id,\n      cache = jQuery.cache,\n      special = jQuery.event.special,\n      deleteExpando = jQuery.support.deleteExpando;\n\n    for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {\n      if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {\n        continue;\n      }\n\n      id = elem[ jQuery.expando ];\n\n      if ( id ) {\n        data = cache[ id ];\n\n        if ( data && data.events ) {\n          for ( var type in data.events ) {\n            if ( special[ type ] ) {\n              jQuery.event.remove( elem, type );\n\n            // This is a shortcut to avoid jQuery.event.remove's overhead\n            } else {\n              jQuery.removeEvent( elem, type, data.handle );\n            }\n          }\n\n          // Null the DOM reference to avoid IE6/7/8 leak (#7054)\n          if ( data.handle ) {\n            data.handle.elem = null;\n          }\n        }\n\n        if ( deleteExpando ) {\n          delete elem[ jQuery.expando ];\n\n        } else if ( elem.removeAttribute ) {\n          elem.removeAttribute( jQuery.expando );\n        }\n\n        delete cache[ id ];\n      }\n    }\n  }\n});\n\nfunction evalScript( i, elem ) {\n  if ( elem.src ) {\n    jQuery.ajax({\n      url: elem.src,\n      async: false,\n      dataType: \"script\"\n    });\n  } else {\n    jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || \"\" ).replace( rcleanScript, \"/*$0*/\" ) );\n  }\n\n  if ( elem.parentNode ) {\n    elem.parentNode.removeChild( elem );\n  }\n}\n\n\n\n\nvar ralpha = /alpha\\([^)]*\\)/i,\n  ropacity = /opacity=([^)]*)/,\n  // fixed for IE9, see #8346\n  rupper = /([A-Z]|^ms)/g,\n  rnumpx = /^-?\\d+(?:px)?$/i,\n  rnum = /^-?\\d/,\n  rrelNum = /^([\\-+])=([\\-+.\\de]+)/,\n\n  cssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n  cssWidth = [ \"Left\", \"Right\" ],\n  cssHeight = [ \"Top\", \"Bottom\" ],\n  curCSS,\n\n  getComputedStyle,\n  currentStyle;\n\njQuery.fn.css = function( name, value ) {\n  // Setting 'undefined' is a no-op\n  if ( arguments.length === 2 && value === undefined ) {\n    return this;\n  }\n\n  return jQuery.access( this, name, value, true, function( elem, name, value ) {\n    return value !== undefined ?\n      jQuery.style( elem, name, value ) :\n      jQuery.css( elem, name );\n  });\n};\n\njQuery.extend({\n  // Add in style property hooks for overriding the default\n  // behavior of getting and setting a style property\n  cssHooks: {\n    opacity: {\n      get: function( elem, computed ) {\n        if ( computed ) {\n          // We should always get a number back from opacity\n          var ret = curCSS( elem, \"opacity\", \"opacity\" );\n          return ret === \"\" ? \"1\" : ret;\n\n        } else {\n          return elem.style.opacity;\n        }\n      }\n    }\n  },\n\n  // Exclude the following css properties to add px\n  cssNumber: {\n    \"fillOpacity\": true,\n    \"fontWeight\": true,\n    \"lineHeight\": true,\n    \"opacity\": true,\n    \"orphans\": true,\n    \"widows\": true,\n    \"zIndex\": true,\n    \"zoom\": true\n  },\n\n  // Add in properties whose names you wish to fix before\n  // setting or getting the value\n  cssProps: {\n    // normalize float css property\n    \"float\": jQuery.support.cssFloat ? \"cssFloat\" : \"styleFloat\"\n  },\n\n  // Get and set the style property on a DOM Node\n  style: function( elem, name, value, extra ) {\n    // Don't set styles on text and comment nodes\n    if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n      return;\n    }\n\n    // Make sure that we're working with the right name\n    var ret, type, origName = jQuery.camelCase( name ),\n      style = elem.style, hooks = jQuery.cssHooks[ origName ];\n\n    name = jQuery.cssProps[ origName ] || origName;\n\n    // Check if we're setting a value\n    if ( value !== undefined ) {\n      type = typeof value;\n\n      // convert relative number strings (+= or -=) to relative numbers. #7345\n      if ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n        value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );\n        // Fixes bug #9237\n        type = \"number\";\n      }\n\n      // Make sure that NaN and null values aren't set. See: #7116\n      if ( value == null || type === \"number\" && isNaN( value ) ) {\n        return;\n      }\n\n      // If a number was passed in, add 'px' to the (except for certain CSS properties)\n      if ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n        value += \"px\";\n      }\n\n      // If a hook was provided, use that value, otherwise just set the specified value\n      if ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {\n        // Wrapped to prevent IE from throwing errors when 'invalid' values are provided\n        // Fixes bug #5509\n        try {\n          style[ name ] = value;\n        } catch(e) {}\n      }\n\n    } else {\n      // If a hook was provided get the non-computed value from there\n      if ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n        return ret;\n      }\n\n      // Otherwise just get the value from the style object\n      return style[ name ];\n    }\n  },\n\n  css: function( elem, name, extra ) {\n    var ret, hooks;\n\n    // Make sure that we're working with the right name\n    name = jQuery.camelCase( name );\n    hooks = jQuery.cssHooks[ name ];\n    name = jQuery.cssProps[ name ] || name;\n\n    // cssFloat needs a special treatment\n    if ( name === \"cssFloat\" ) {\n      name = \"float\";\n    }\n\n    // If a hook was provided get the computed value from there\n    if ( hooks && \"get\" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {\n      return ret;\n\n    // Otherwise, if a way to get the computed value exists, use that\n    } else if ( curCSS ) {\n      return curCSS( elem, name );\n    }\n  },\n\n  // A method for quickly swapping in/out CSS properties to get correct calculations\n  swap: function( elem, options, callback ) {\n    var old = {};\n\n    // Remember the old values, and insert the new ones\n    for ( var name in options ) {\n      old[ name ] = elem.style[ name ];\n      elem.style[ name ] = options[ name ];\n    }\n\n    callback.call( elem );\n\n    // Revert the old values\n    for ( name in options ) {\n      elem.style[ name ] = old[ name ];\n    }\n  }\n});\n\n// DEPRECATED, Use jQuery.css() instead\njQuery.curCSS = jQuery.css;\n\njQuery.each([\"height\", \"width\"], function( i, name ) {\n  jQuery.cssHooks[ name ] = {\n    get: function( elem, computed, extra ) {\n      var val;\n\n      if ( computed ) {\n        if ( elem.offsetWidth !== 0 ) {\n          return getWH( elem, name, extra );\n        } else {\n          jQuery.swap( elem, cssShow, function() {\n            val = getWH( elem, name, extra );\n          });\n        }\n\n        return val;\n      }\n    },\n\n    set: function( elem, value ) {\n      if ( rnumpx.test( value ) ) {\n        // ignore negative width and height values #1599\n        value = parseFloat( value );\n\n        if ( value >= 0 ) {\n          return value + \"px\";\n        }\n\n      } else {\n        return value;\n      }\n    }\n  };\n});\n\nif ( !jQuery.support.opacity ) {\n  jQuery.cssHooks.opacity = {\n    get: function( elem, computed ) {\n      // IE uses filters for opacity\n      return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || \"\" ) ?\n        ( parseFloat( RegExp.$1 ) / 100 ) + \"\" :\n        computed ? \"1\" : \"\";\n    },\n\n    set: function( elem, value ) {\n      var style = elem.style,\n        currentStyle = elem.currentStyle,\n        opacity = jQuery.isNumeric( value ) ? \"alpha(opacity=\" + value * 100 + \")\" : \"\",\n        filter = currentStyle && currentStyle.filter || style.filter || \"\";\n\n      // IE has trouble with opacity if it does not have layout\n      // Force it by setting the zoom level\n      style.zoom = 1;\n\n      // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652\n      if ( value >= 1 && jQuery.trim( filter.replace( ralpha, \"\" ) ) === \"\" ) {\n\n        // Setting style.filter to null, \"\" & \" \" still leave \"filter:\" in the cssText\n        // if \"filter:\" is present at all, clearType is disabled, we want to avoid this\n        // style.removeAttribute is IE Only, but so apparently is this code path...\n        style.removeAttribute( \"filter\" );\n\n        // if there there is no filter style applied in a css rule, we are done\n        if ( currentStyle && !currentStyle.filter ) {\n          return;\n        }\n      }\n\n      // otherwise, set new filter values\n      style.filter = ralpha.test( filter ) ?\n        filter.replace( ralpha, opacity ) :\n        filter + \" \" + opacity;\n    }\n  };\n}\n\njQuery(function() {\n  // This hook cannot be added until DOM ready because the support test\n  // for it is not run until after DOM ready\n  if ( !jQuery.support.reliableMarginRight ) {\n    jQuery.cssHooks.marginRight = {\n      get: function( elem, computed ) {\n        // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n        // Work around by temporarily setting element display to inline-block\n        var ret;\n        jQuery.swap( elem, { \"display\": \"inline-block\" }, function() {\n          if ( computed ) {\n            ret = curCSS( elem, \"margin-right\", \"marginRight\" );\n          } else {\n            ret = elem.style.marginRight;\n          }\n        });\n        return ret;\n      }\n    };\n  }\n});\n\nif ( document.defaultView && document.defaultView.getComputedStyle ) {\n  getComputedStyle = function( elem, name ) {\n    var ret, defaultView, computedStyle;\n\n    name = name.replace( rupper, \"-$1\" ).toLowerCase();\n\n    if ( (defaultView = elem.ownerDocument.defaultView) &&\n        (computedStyle = defaultView.getComputedStyle( elem, null )) ) {\n      ret = computedStyle.getPropertyValue( name );\n      if ( ret === \"\" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {\n        ret = jQuery.style( elem, name );\n      }\n    }\n\n    return ret;\n  };\n}\n\nif ( document.documentElement.currentStyle ) {\n  currentStyle = function( elem, name ) {\n    var left, rsLeft, uncomputed,\n      ret = elem.currentStyle && elem.currentStyle[ name ],\n      style = elem.style;\n\n    // Avoid setting ret to empty string here\n    // so we don't default to auto\n    if ( ret === null && style && (uncomputed = style[ name ]) ) {\n      ret = uncomputed;\n    }\n\n    // From the awesome hack by Dean Edwards\n    // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\n    // If we're not dealing with a regular pixel number\n    // but a number that has a weird ending, we need to convert it to pixels\n    if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {\n\n      // Remember the original values\n      left = style.left;\n      rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;\n\n      // Put in the new values to get a computed value out\n      if ( rsLeft ) {\n        elem.runtimeStyle.left = elem.currentStyle.left;\n      }\n      style.left = name === \"fontSize\" ? \"1em\" : ( ret || 0 );\n      ret = style.pixelLeft + \"px\";\n\n      // Revert the changed values\n      style.left = left;\n      if ( rsLeft ) {\n        elem.runtimeStyle.left = rsLeft;\n      }\n    }\n\n    return ret === \"\" ? \"auto\" : ret;\n  };\n}\n\ncurCSS = getComputedStyle || currentStyle;\n\nfunction getWH( elem, name, extra ) {\n\n  // Start with offset property\n  var val = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n    which = name === \"width\" ? cssWidth : cssHeight,\n    i = 0,\n    len = which.length;\n\n  if ( val > 0 ) {\n    if ( extra !== \"border\" ) {\n      for ( ; i < len; i++ ) {\n        if ( !extra ) {\n          val -= parseFloat( jQuery.css( elem, \"padding\" + which[ i ] ) ) || 0;\n        }\n        if ( extra === \"margin\" ) {\n          val += parseFloat( jQuery.css( elem, extra + which[ i ] ) ) || 0;\n        } else {\n          val -= parseFloat( jQuery.css( elem, \"border\" + which[ i ] + \"Width\" ) ) || 0;\n        }\n      }\n    }\n\n    return val + \"px\";\n  }\n\n  // Fall back to computed then uncomputed css if necessary\n  val = curCSS( elem, name, name );\n  if ( val < 0 || val == null ) {\n    val = elem.style[ name ] || 0;\n  }\n  // Normalize \"\", auto, and prepare for extra\n  val = parseFloat( val ) || 0;\n\n  // Add padding, border, margin\n  if ( extra ) {\n    for ( ; i < len; i++ ) {\n      val += parseFloat( jQuery.css( elem, \"padding\" + which[ i ] ) ) || 0;\n      if ( extra !== \"padding\" ) {\n        val += parseFloat( jQuery.css( elem, \"border\" + which[ i ] + \"Width\" ) ) || 0;\n      }\n      if ( extra === \"margin\" ) {\n        val += parseFloat( jQuery.css( elem, extra + which[ i ] ) ) || 0;\n      }\n    }\n  }\n\n  return val + \"px\";\n}\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n  jQuery.expr.filters.hidden = function( elem ) {\n    var width = elem.offsetWidth,\n      height = elem.offsetHeight;\n\n    return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, \"display\" )) === \"none\");\n  };\n\n  jQuery.expr.filters.visible = function( elem ) {\n    return !jQuery.expr.filters.hidden( elem );\n  };\n}\n\n\n\n\nvar r20 = /%20/g,\n  rbracket = /\\[\\]$/,\n  rCRLF = /\\r?\\n/g,\n  rhash = /#.*$/,\n  rheaders = /^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg, // IE leaves an \\r character at EOL\n  rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,\n  // #7653, #8125, #8152: local protocol detection\n  rlocalProtocol = /^(?:about|app|app\\-storage|.+\\-extension|file|res|widget):$/,\n  rnoContent = /^(?:GET|HEAD)$/,\n  rprotocol = /^\\/\\//,\n  rquery = /\\?/,\n  rscript = /<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,\n  rselectTextarea = /^(?:select|textarea)/i,\n  rspacesAjax = /\\s+/,\n  rts = /([?&])_=[^&]*/,\n  rurl = /^([\\w\\+\\.\\-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+))?)?/,\n\n  // Keep a copy of the old load method\n  _load = jQuery.fn.load,\n\n  /* Prefilters\n   * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n   * 2) These are called:\n   *    - BEFORE asking for a transport\n   *    - AFTER param serialization (s.data is a string if s.processData is true)\n   * 3) key is the dataType\n   * 4) the catchall symbol \"*\" can be used\n   * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n   */\n  prefilters = {},\n\n  /* Transports bindings\n   * 1) key is the dataType\n   * 2) the catchall symbol \"*\" can be used\n   * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n   */\n  transports = {},\n\n  // Document location\n  ajaxLocation,\n\n  // Document location segments\n  ajaxLocParts,\n\n  // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n  allTypes = [\"*/\"] + [\"*\"];\n\n// #8138, IE may throw an exception when accessing\n// a field from window.location if document.domain has been set\ntry {\n  ajaxLocation = location.href;\n} catch( e ) {\n  // Use the href attribute of an A element\n  // since IE will modify it given document.location\n  ajaxLocation = document.createElement( \"a\" );\n  ajaxLocation.href = \"\";\n  ajaxLocation = ajaxLocation.href;\n}\n\n// Segment location into parts\najaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n  // dataTypeExpression is optional and defaults to \"*\"\n  return function( dataTypeExpression, func ) {\n\n    if ( typeof dataTypeExpression !== \"string\" ) {\n      func = dataTypeExpression;\n      dataTypeExpression = \"*\";\n    }\n\n    if ( jQuery.isFunction( func ) ) {\n      var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),\n        i = 0,\n        length = dataTypes.length,\n        dataType,\n        list,\n        placeBefore;\n\n      // For each dataType in the dataTypeExpression\n      for ( ; i < length; i++ ) {\n        dataType = dataTypes[ i ];\n        // We control if we're asked to add before\n        // any existing element\n        placeBefore = /^\\+/.test( dataType );\n        if ( placeBefore ) {\n          dataType = dataType.substr( 1 ) || \"*\";\n        }\n        list = structure[ dataType ] = structure[ dataType ] || [];\n        // then we add to the structure accordingly\n        list[ placeBefore ? \"unshift\" : \"push\" ]( func );\n      }\n    }\n  };\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,\n    dataType /* internal */, inspected /* internal */ ) {\n\n  dataType = dataType || options.dataTypes[ 0 ];\n  inspected = inspected || {};\n\n  inspected[ dataType ] = true;\n\n  var list = structure[ dataType ],\n    i = 0,\n    length = list ? list.length : 0,\n    executeOnly = ( structure === prefilters ),\n    selection;\n\n  for ( ; i < length && ( executeOnly || !selection ); i++ ) {\n    selection = list[ i ]( options, originalOptions, jqXHR );\n    // If we got redirected to another dataType\n    // we try there if executing only and not done already\n    if ( typeof selection === \"string\" ) {\n      if ( !executeOnly || inspected[ selection ] ) {\n        selection = undefined;\n      } else {\n        options.dataTypes.unshift( selection );\n        selection = inspectPrefiltersOrTransports(\n            structure, options, originalOptions, jqXHR, selection, inspected );\n      }\n    }\n  }\n  // If we're only executing or nothing was selected\n  // we try the catchall dataType if not done already\n  if ( ( executeOnly || !selection ) && !inspected[ \"*\" ] ) {\n    selection = inspectPrefiltersOrTransports(\n        structure, options, originalOptions, jqXHR, \"*\", inspected );\n  }\n  // unnecessary when only executing (prefilters)\n  // but it'll be ignored by the caller in that case\n  return selection;\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n  var key, deep,\n    flatOptions = jQuery.ajaxSettings.flatOptions || {};\n  for ( key in src ) {\n    if ( src[ key ] !== undefined ) {\n      ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n    }\n  }\n  if ( deep ) {\n    jQuery.extend( true, target, deep );\n  }\n}\n\njQuery.fn.extend({\n  load: function( url, params, callback ) {\n    if ( typeof url !== \"string\" && _load ) {\n      return _load.apply( this, arguments );\n\n    // Don't do a request if no elements are being requested\n    } else if ( !this.length ) {\n      return this;\n    }\n\n    var off = url.indexOf( \" \" );\n    if ( off >= 0 ) {\n      var selector = url.slice( off, url.length );\n      url = url.slice( 0, off );\n    }\n\n    // Default to a GET request\n    var type = \"GET\";\n\n    // If the second parameter was provided\n    if ( params ) {\n      // If it's a function\n      if ( jQuery.isFunction( params ) ) {\n        // We assume that it's the callback\n        callback = params;\n        params = undefined;\n\n      // Otherwise, build a param string\n      } else if ( typeof params === \"object\" ) {\n        params = jQuery.param( params, jQuery.ajaxSettings.traditional );\n        type = \"POST\";\n      }\n    }\n\n    var self = this;\n\n    // Request the remote document\n    jQuery.ajax({\n      url: url,\n      type: type,\n      dataType: \"html\",\n      data: params,\n      // Complete callback (responseText is used internally)\n      complete: function( jqXHR, status, responseText ) {\n        // Store the response as specified by the jqXHR object\n        responseText = jqXHR.responseText;\n        // If successful, inject the HTML into all the matched elements\n        if ( jqXHR.isResolved() ) {\n          // #4825: Get the actual response in case\n          // a dataFilter is present in ajaxSettings\n          jqXHR.done(function( r ) {\n            responseText = r;\n          });\n          // See if a selector was specified\n          self.html( selector ?\n            // Create a dummy div to hold the results\n            jQuery(\"<div>\")\n              // inject the contents of the document in, removing the scripts\n              // to avoid any 'Permission Denied' errors in IE\n              .append(responseText.replace(rscript, \"\"))\n\n              // Locate the specified elements\n              .find(selector) :\n\n            // If not, just inject the full result\n            responseText );\n        }\n\n        if ( callback ) {\n          self.each( callback, [ responseText, status, jqXHR ] );\n        }\n      }\n    });\n\n    return this;\n  },\n\n  serialize: function() {\n    return jQuery.param( this.serializeArray() );\n  },\n\n  serializeArray: function() {\n    return this.map(function(){\n      return this.elements ? jQuery.makeArray( this.elements ) : this;\n    })\n    .filter(function(){\n      return this.name && !this.disabled &&\n        ( this.checked || rselectTextarea.test( this.nodeName ) ||\n          rinput.test( this.type ) );\n    })\n    .map(function( i, elem ){\n      var val = jQuery( this ).val();\n\n      return val == null ?\n        null :\n        jQuery.isArray( val ) ?\n          jQuery.map( val, function( val, i ){\n            return { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n          }) :\n          { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n    }).get();\n  }\n});\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( \"ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend\".split( \" \" ), function( i, o ){\n  jQuery.fn[ o ] = function( f ){\n    return this.on( o, f );\n  };\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n  jQuery[ method ] = function( url, data, callback, type ) {\n    // shift arguments if data argument was omitted\n    if ( jQuery.isFunction( data ) ) {\n      type = type || callback;\n      callback = data;\n      data = undefined;\n    }\n\n    return jQuery.ajax({\n      type: method,\n      url: url,\n      data: data,\n      success: callback,\n      dataType: type\n    });\n  };\n});\n\njQuery.extend({\n\n  getScript: function( url, callback ) {\n    return jQuery.get( url, undefined, callback, \"script\" );\n  },\n\n  getJSON: function( url, data, callback ) {\n    return jQuery.get( url, data, callback, \"json\" );\n  },\n\n  // Creates a full fledged settings object into target\n  // with both ajaxSettings and settings fields.\n  // If target is omitted, writes into ajaxSettings.\n  ajaxSetup: function( target, settings ) {\n    if ( settings ) {\n      // Building a settings object\n      ajaxExtend( target, jQuery.ajaxSettings );\n    } else {\n      // Extending ajaxSettings\n      settings = target;\n      target = jQuery.ajaxSettings;\n    }\n    ajaxExtend( target, settings );\n    return target;\n  },\n\n  ajaxSettings: {\n    url: ajaxLocation,\n    isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n    global: true,\n    type: \"GET\",\n    contentType: \"application/x-www-form-urlencoded\",\n    processData: true,\n    async: true,\n    /*\n    timeout: 0,\n    data: null,\n    dataType: null,\n    username: null,\n    password: null,\n    cache: null,\n    traditional: false,\n    headers: {},\n    */\n\n    accepts: {\n      xml: \"application/xml, text/xml\",\n      html: \"text/html\",\n      text: \"text/plain\",\n      json: \"application/json, text/javascript\",\n      \"*\": allTypes\n    },\n\n    contents: {\n      xml: /xml/,\n      html: /html/,\n      json: /json/\n    },\n\n    responseFields: {\n      xml: \"responseXML\",\n      text: \"responseText\"\n    },\n\n    // List of data converters\n    // 1) key format is \"source_type destination_type\" (a single space in-between)\n    // 2) the catchall symbol \"*\" can be used for source_type\n    converters: {\n\n      // Convert anything to text\n      \"* text\": window.String,\n\n      // Text to html (true = no transformation)\n      \"text html\": true,\n\n      // Evaluate text as a json expression\n      \"text json\": jQuery.parseJSON,\n\n      // Parse text as xml\n      \"text xml\": jQuery.parseXML\n    },\n\n    // For options that shouldn't be deep extended:\n    // you can add your own custom options here if\n    // and when you create one that shouldn't be\n    // deep extended (see ajaxExtend)\n    flatOptions: {\n      context: true,\n      url: true\n    }\n  },\n\n  ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n  ajaxTransport: addToPrefiltersOrTransports( transports ),\n\n  // Main method\n  ajax: function( url, options ) {\n\n    // If url is an object, simulate pre-1.5 signature\n    if ( typeof url === \"object\" ) {\n      options = url;\n      url = undefined;\n    }\n\n    // Force options to be an object\n    options = options || {};\n\n    var // Create the final options object\n      s = jQuery.ajaxSetup( {}, options ),\n      // Callbacks context\n      callbackContext = s.context || s,\n      // Context for global events\n      // It's the callbackContext if one was provided in the options\n      // and if it's a DOM node or a jQuery collection\n      globalEventContext = callbackContext !== s &&\n        ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?\n            jQuery( callbackContext ) : jQuery.event,\n      // Deferreds\n      deferred = jQuery.Deferred(),\n      completeDeferred = jQuery.Callbacks( \"once memory\" ),\n      // Status-dependent callbacks\n      statusCode = s.statusCode || {},\n      // ifModified key\n      ifModifiedKey,\n      // Headers (they are sent all at once)\n      requestHeaders = {},\n      requestHeadersNames = {},\n      // Response headers\n      responseHeadersString,\n      responseHeaders,\n      // transport\n      transport,\n      // timeout handle\n      timeoutTimer,\n      // Cross-domain detection vars\n      parts,\n      // The jqXHR state\n      state = 0,\n      // To know if global events are to be dispatched\n      fireGlobals,\n      // Loop variable\n      i,\n      // Fake xhr\n      jqXHR = {\n\n        readyState: 0,\n\n        // Caches the header\n        setRequestHeader: function( name, value ) {\n          if ( !state ) {\n            var lname = name.toLowerCase();\n            name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n            requestHeaders[ name ] = value;\n          }\n          return this;\n        },\n\n        // Raw string\n        getAllResponseHeaders: function() {\n          return state === 2 ? responseHeadersString : null;\n        },\n\n        // Builds headers hashtable if needed\n        getResponseHeader: function( key ) {\n          var match;\n          if ( state === 2 ) {\n            if ( !responseHeaders ) {\n              responseHeaders = {};\n              while( ( match = rheaders.exec( responseHeadersString ) ) ) {\n                responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n              }\n            }\n            match = responseHeaders[ key.toLowerCase() ];\n          }\n          return match === undefined ? null : match;\n        },\n\n        // Overrides response content-type header\n        overrideMimeType: function( type ) {\n          if ( !state ) {\n            s.mimeType = type;\n          }\n          return this;\n        },\n\n        // Cancel the request\n        abort: function( statusText ) {\n          statusText = statusText || \"abort\";\n          if ( transport ) {\n            transport.abort( statusText );\n          }\n          done( 0, statusText );\n          return this;\n        }\n      };\n\n    // Callback for when everything is done\n    // It is defined here because jslint complains if it is declared\n    // at the end of the function (which would be more logical and readable)\n    function done( status, nativeStatusText, responses, headers ) {\n\n      // Called once\n      if ( state === 2 ) {\n        return;\n      }\n\n      // State is \"done\" now\n      state = 2;\n\n      // Clear timeout if it exists\n      if ( timeoutTimer ) {\n        clearTimeout( timeoutTimer );\n      }\n\n      // Dereference transport for early garbage collection\n      // (no matter how long the jqXHR object will be used)\n      transport = undefined;\n\n      // Cache response headers\n      responseHeadersString = headers || \"\";\n\n      // Set readyState\n      jqXHR.readyState = status > 0 ? 4 : 0;\n\n      var isSuccess,\n        success,\n        error,\n        statusText = nativeStatusText,\n        response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,\n        lastModified,\n        etag;\n\n      // If successful, handle type chaining\n      if ( status >= 200 && status < 300 || status === 304 ) {\n\n        // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n        if ( s.ifModified ) {\n\n          if ( ( lastModified = jqXHR.getResponseHeader( \"Last-Modified\" ) ) ) {\n            jQuery.lastModified[ ifModifiedKey ] = lastModified;\n          }\n          if ( ( etag = jqXHR.getResponseHeader( \"Etag\" ) ) ) {\n            jQuery.etag[ ifModifiedKey ] = etag;\n          }\n        }\n\n        // If not modified\n        if ( status === 304 ) {\n\n          statusText = \"notmodified\";\n          isSuccess = true;\n\n        // If we have data\n        } else {\n\n          try {\n            success = ajaxConvert( s, response );\n            statusText = \"success\";\n            isSuccess = true;\n          } catch(e) {\n            // We have a parsererror\n            statusText = \"parsererror\";\n            error = e;\n          }\n        }\n      } else {\n        // We extract error from statusText\n        // then normalize statusText and status for non-aborts\n        error = statusText;\n        if ( !statusText || status ) {\n          statusText = \"error\";\n          if ( status < 0 ) {\n            status = 0;\n          }\n        }\n      }\n\n      // Set data for the fake xhr object\n      jqXHR.status = status;\n      jqXHR.statusText = \"\" + ( nativeStatusText || statusText );\n\n      // Success/Error\n      if ( isSuccess ) {\n        deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n      } else {\n        deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n      }\n\n      // Status-dependent callbacks\n      jqXHR.statusCode( statusCode );\n      statusCode = undefined;\n\n      if ( fireGlobals ) {\n        globalEventContext.trigger( \"ajax\" + ( isSuccess ? \"Success\" : \"Error\" ),\n            [ jqXHR, s, isSuccess ? success : error ] );\n      }\n\n      // Complete\n      completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n      if ( fireGlobals ) {\n        globalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n        // Handle the global AJAX counter\n        if ( !( --jQuery.active ) ) {\n          jQuery.event.trigger( \"ajaxStop\" );\n        }\n      }\n    }\n\n    // Attach deferreds\n    deferred.promise( jqXHR );\n    jqXHR.success = jqXHR.done;\n    jqXHR.error = jqXHR.fail;\n    jqXHR.complete = completeDeferred.add;\n\n    // Status-dependent callbacks\n    jqXHR.statusCode = function( map ) {\n      if ( map ) {\n        var tmp;\n        if ( state < 2 ) {\n          for ( tmp in map ) {\n            statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];\n          }\n        } else {\n          tmp = map[ jqXHR.status ];\n          jqXHR.then( tmp, tmp );\n        }\n      }\n      return this;\n    };\n\n    // Remove hash character (#7531: and string promotion)\n    // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\n    // We also use the url parameter if available\n    s.url = ( ( url || s.url ) + \"\" ).replace( rhash, \"\" ).replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n    // Extract dataTypes list\n    s.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().split( rspacesAjax );\n\n    // Determine if a cross-domain request is in order\n    if ( s.crossDomain == null ) {\n      parts = rurl.exec( s.url.toLowerCase() );\n      s.crossDomain = !!( parts &&\n        ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||\n          ( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? 80 : 443 ) ) !=\n            ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? 80 : 443 ) ) )\n      );\n    }\n\n    // Convert data if not already a string\n    if ( s.data && s.processData && typeof s.data !== \"string\" ) {\n      s.data = jQuery.param( s.data, s.traditional );\n    }\n\n    // Apply prefilters\n    inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n    // If request was aborted inside a prefiler, stop there\n    if ( state === 2 ) {\n      return false;\n    }\n\n    // We can fire global events as of now if asked to\n    fireGlobals = s.global;\n\n    // Uppercase the type\n    s.type = s.type.toUpperCase();\n\n    // Determine if request has content\n    s.hasContent = !rnoContent.test( s.type );\n\n    // Watch for a new set of requests\n    if ( fireGlobals && jQuery.active++ === 0 ) {\n      jQuery.event.trigger( \"ajaxStart\" );\n    }\n\n    // More options handling for requests with no content\n    if ( !s.hasContent ) {\n\n      // If data is available, append data to url\n      if ( s.data ) {\n        s.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.data;\n        // #9682: remove data so that it's not used in an eventual retry\n        delete s.data;\n      }\n\n      // Get ifModifiedKey before adding the anti-cache parameter\n      ifModifiedKey = s.url;\n\n      // Add anti-cache in url if needed\n      if ( s.cache === false ) {\n\n        var ts = jQuery.now(),\n          // try replacing _= if it is there\n          ret = s.url.replace( rts, \"$1_=\" + ts );\n\n        // if nothing was replaced, add timestamp to the end\n        s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? \"&\" : \"?\" ) + \"_=\" + ts : \"\" );\n      }\n    }\n\n    // Set the correct header, if data is being sent\n    if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n      jqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n    }\n\n    // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n    if ( s.ifModified ) {\n      ifModifiedKey = ifModifiedKey || s.url;\n      if ( jQuery.lastModified[ ifModifiedKey ] ) {\n        jqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ ifModifiedKey ] );\n      }\n      if ( jQuery.etag[ ifModifiedKey ] ) {\n        jqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ ifModifiedKey ] );\n      }\n    }\n\n    // Set the Accepts header for the server, depending on the dataType\n    jqXHR.setRequestHeader(\n      \"Accept\",\n      s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n        s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n        s.accepts[ \"*\" ]\n    );\n\n    // Check for headers option\n    for ( i in s.headers ) {\n      jqXHR.setRequestHeader( i, s.headers[ i ] );\n    }\n\n    // Allow custom headers/mimetypes and early abort\n    if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n        // Abort if not done already\n        jqXHR.abort();\n        return false;\n\n    }\n\n    // Install callbacks on deferreds\n    for ( i in { success: 1, error: 1, complete: 1 } ) {\n      jqXHR[ i ]( s[ i ] );\n    }\n\n    // Get transport\n    transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n    // If no transport, we auto-abort\n    if ( !transport ) {\n      done( -1, \"No Transport\" );\n    } else {\n      jqXHR.readyState = 1;\n      // Send global event\n      if ( fireGlobals ) {\n        globalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n      }\n      // Timeout\n      if ( s.async && s.timeout > 0 ) {\n        timeoutTimer = setTimeout( function(){\n          jqXHR.abort( \"timeout\" );\n        }, s.timeout );\n      }\n\n      try {\n        state = 1;\n        transport.send( requestHeaders, done );\n      } catch (e) {\n        // Propagate exception as error if not done\n        if ( state < 2 ) {\n          done( -1, e );\n        // Simply rethrow otherwise\n        } else {\n          throw e;\n        }\n      }\n    }\n\n    return jqXHR;\n  },\n\n  // Serialize an array of form elements or a set of\n  // key/values into a query string\n  param: function( a, traditional ) {\n    var s = [],\n      add = function( key, value ) {\n        // If value is a function, invoke it and return its value\n        value = jQuery.isFunction( value ) ? value() : value;\n        s[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n      };\n\n    // Set traditional to true for jQuery <= 1.3.2 behavior.\n    if ( traditional === undefined ) {\n      traditional = jQuery.ajaxSettings.traditional;\n    }\n\n    // If an array was passed in, assume that it is an array of form elements.\n    if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n      // Serialize the form elements\n      jQuery.each( a, function() {\n        add( this.name, this.value );\n      });\n\n    } else {\n      // If traditional, encode the \"old\" way (the way 1.3.2 or older\n      // did it), otherwise encode params recursively.\n      for ( var prefix in a ) {\n        buildParams( prefix, a[ prefix ], traditional, add );\n      }\n    }\n\n    // Return the resulting serialization\n    return s.join( \"&\" ).replace( r20, \"+\" );\n  }\n});\n\nfunction buildParams( prefix, obj, traditional, add ) {\n  if ( jQuery.isArray( obj ) ) {\n    // Serialize array item.\n    jQuery.each( obj, function( i, v ) {\n      if ( traditional || rbracket.test( prefix ) ) {\n        // Treat each array item as a scalar.\n        add( prefix, v );\n\n      } else {\n        // If array item is non-scalar (array or object), encode its\n        // numeric index to resolve deserialization ambiguity issues.\n        // Note that rack (as of 1.0.0) can't currently deserialize\n        // nested arrays properly, and attempting to do so may cause\n        // a server error. Possible fixes are to modify rack's\n        // deserialization algorithm or to provide an option or flag\n        // to force array serialization to be shallow.\n        buildParams( prefix + \"[\" + ( typeof v === \"object\" || jQuery.isArray(v) ? i : \"\" ) + \"]\", v, traditional, add );\n      }\n    });\n\n  } else if ( !traditional && obj != null && typeof obj === \"object\" ) {\n    // Serialize object item.\n    for ( var name in obj ) {\n      buildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n    }\n\n  } else {\n    // Serialize scalar item.\n    add( prefix, obj );\n  }\n}\n\n// This is still on the jQuery object... for now\n// Want to move this to jQuery.ajax some day\njQuery.extend({\n\n  // Counter for holding the number of active queries\n  active: 0,\n\n  // Last-Modified header cache for next request\n  lastModified: {},\n  etag: {}\n\n});\n\n/* Handles responses to an ajax request:\n * - sets all responseXXX fields accordingly\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n  var contents = s.contents,\n    dataTypes = s.dataTypes,\n    responseFields = s.responseFields,\n    ct,\n    type,\n    finalDataType,\n    firstDataType;\n\n  // Fill responseXXX fields\n  for ( type in responseFields ) {\n    if ( type in responses ) {\n      jqXHR[ responseFields[type] ] = responses[ type ];\n    }\n  }\n\n  // Remove auto dataType and get content-type in the process\n  while( dataTypes[ 0 ] === \"*\" ) {\n    dataTypes.shift();\n    if ( ct === undefined ) {\n      ct = s.mimeType || jqXHR.getResponseHeader( \"content-type\" );\n    }\n  }\n\n  // Check if we're dealing with a known content-type\n  if ( ct ) {\n    for ( type in contents ) {\n      if ( contents[ type ] && contents[ type ].test( ct ) ) {\n        dataTypes.unshift( type );\n        break;\n      }\n    }\n  }\n\n  // Check to see if we have a response for the expected dataType\n  if ( dataTypes[ 0 ] in responses ) {\n    finalDataType = dataTypes[ 0 ];\n  } else {\n    // Try convertible dataTypes\n    for ( type in responses ) {\n      if ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n        finalDataType = type;\n        break;\n      }\n      if ( !firstDataType ) {\n        firstDataType = type;\n      }\n    }\n    // Or just use first one\n    finalDataType = finalDataType || firstDataType;\n  }\n\n  // If we found a dataType\n  // We add the dataType to the list if needed\n  // and return the corresponding response\n  if ( finalDataType ) {\n    if ( finalDataType !== dataTypes[ 0 ] ) {\n      dataTypes.unshift( finalDataType );\n    }\n    return responses[ finalDataType ];\n  }\n}\n\n// Chain conversions given the request and the original response\nfunction ajaxConvert( s, response ) {\n\n  // Apply the dataFilter if provided\n  if ( s.dataFilter ) {\n    response = s.dataFilter( response, s.dataType );\n  }\n\n  var dataTypes = s.dataTypes,\n    converters = {},\n    i,\n    key,\n    length = dataTypes.length,\n    tmp,\n    // Current and previous dataTypes\n    current = dataTypes[ 0 ],\n    prev,\n    // Conversion expression\n    conversion,\n    // Conversion function\n    conv,\n    // Conversion functions (transitive conversion)\n    conv1,\n    conv2;\n\n  // For each dataType in the chain\n  for ( i = 1; i < length; i++ ) {\n\n    // Create converters map\n    // with lowercased keys\n    if ( i === 1 ) {\n      for ( key in s.converters ) {\n        if ( typeof key === \"string\" ) {\n          converters[ key.toLowerCase() ] = s.converters[ key ];\n        }\n      }\n    }\n\n    // Get the dataTypes\n    prev = current;\n    current = dataTypes[ i ];\n\n    // If current is auto dataType, update it to prev\n    if ( current === \"*\" ) {\n      current = prev;\n    // If no auto and dataTypes are actually different\n    } else if ( prev !== \"*\" && prev !== current ) {\n\n      // Get the converter\n      conversion = prev + \" \" + current;\n      conv = converters[ conversion ] || converters[ \"* \" + current ];\n\n      // If there is no direct converter, search transitively\n      if ( !conv ) {\n        conv2 = undefined;\n        for ( conv1 in converters ) {\n          tmp = conv1.split( \" \" );\n          if ( tmp[ 0 ] === prev || tmp[ 0 ] === \"*\" ) {\n            conv2 = converters[ tmp[1] + \" \" + current ];\n            if ( conv2 ) {\n              conv1 = converters[ conv1 ];\n              if ( conv1 === true ) {\n                conv = conv2;\n              } else if ( conv2 === true ) {\n                conv = conv1;\n              }\n              break;\n            }\n          }\n        }\n      }\n      // If we found no converter, dispatch an error\n      if ( !( conv || conv2 ) ) {\n        jQuery.error( \"No conversion from \" + conversion.replace(\" \",\" to \") );\n      }\n      // If found converter is not an equivalence\n      if ( conv !== true ) {\n        // Convert with 1 or 2 converters accordingly\n        response = conv ? conv( response ) : conv2( conv1(response) );\n      }\n    }\n  }\n  return response;\n}\n\n\n\n\nvar jsc = jQuery.now(),\n  jsre = /(\\=)\\?(&|$)|\\?\\?/i;\n\n// Default jsonp settings\njQuery.ajaxSetup({\n  jsonp: \"callback\",\n  jsonpCallback: function() {\n    return jQuery.expando + \"_\" + ( jsc++ );\n  }\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n  var inspectData = s.contentType === \"application/x-www-form-urlencoded\" &&\n    ( typeof s.data === \"string\" );\n\n  if ( s.dataTypes[ 0 ] === \"jsonp\" ||\n    s.jsonp !== false && ( jsre.test( s.url ) ||\n        inspectData && jsre.test( s.data ) ) ) {\n\n    var responseContainer,\n      jsonpCallback = s.jsonpCallback =\n        jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,\n      previous = window[ jsonpCallback ],\n      url = s.url,\n      data = s.data,\n      replace = \"$1\" + jsonpCallback + \"$2\";\n\n    if ( s.jsonp !== false ) {\n      url = url.replace( jsre, replace );\n      if ( s.url === url ) {\n        if ( inspectData ) {\n          data = data.replace( jsre, replace );\n        }\n        if ( s.data === data ) {\n          // Add callback manually\n          url += (/\\?/.test( url ) ? \"&\" : \"?\") + s.jsonp + \"=\" + jsonpCallback;\n        }\n      }\n    }\n\n    s.url = url;\n    s.data = data;\n\n    // Install callback\n    window[ jsonpCallback ] = function( response ) {\n      responseContainer = [ response ];\n    };\n\n    // Clean-up function\n    jqXHR.always(function() {\n      // Set callback back to previous value\n      window[ jsonpCallback ] = previous;\n      // Call if it was a function and we have a response\n      if ( responseContainer && jQuery.isFunction( previous ) ) {\n        window[ jsonpCallback ]( responseContainer[ 0 ] );\n      }\n    });\n\n    // Use data converter to retrieve json after script execution\n    s.converters[\"script json\"] = function() {\n      if ( !responseContainer ) {\n        jQuery.error( jsonpCallback + \" was not called\" );\n      }\n      return responseContainer[ 0 ];\n    };\n\n    // force json dataType\n    s.dataTypes[ 0 ] = \"json\";\n\n    // Delegate to script\n    return \"script\";\n  }\n});\n\n\n\n\n// Install script dataType\njQuery.ajaxSetup({\n  accepts: {\n    script: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n  },\n  contents: {\n    script: /javascript|ecmascript/\n  },\n  converters: {\n    \"text script\": function( text ) {\n      jQuery.globalEval( text );\n      return text;\n    }\n  }\n});\n\n// Handle cache's special case and global\njQuery.ajaxPrefilter( \"script\", function( s ) {\n  if ( s.cache === undefined ) {\n    s.cache = false;\n  }\n  if ( s.crossDomain ) {\n    s.type = \"GET\";\n    s.global = false;\n  }\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function(s) {\n\n  // This transport only deals with cross domain requests\n  if ( s.crossDomain ) {\n\n    var script,\n      head = document.head || document.getElementsByTagName( \"head\" )[0] || document.documentElement;\n\n    return {\n\n      send: function( _, callback ) {\n\n        script = document.createElement( \"script\" );\n\n        script.async = \"async\";\n\n        if ( s.scriptCharset ) {\n          script.charset = s.scriptCharset;\n        }\n\n        script.src = s.url;\n\n        // Attach handlers for all browsers\n        script.onload = script.onreadystatechange = function( _, isAbort ) {\n\n          if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n            // Handle memory leak in IE\n            script.onload = script.onreadystatechange = null;\n\n            // Remove the script\n            if ( head && script.parentNode ) {\n              head.removeChild( script );\n            }\n\n            // Dereference the script\n            script = undefined;\n\n            // Callback if not abort\n            if ( !isAbort ) {\n              callback( 200, \"success\" );\n            }\n          }\n        };\n        // Use insertBefore instead of appendChild  to circumvent an IE6 bug.\n        // This arises when a base node is used (#2709 and #4378).\n        head.insertBefore( script, head.firstChild );\n      },\n\n      abort: function() {\n        if ( script ) {\n          script.onload( 0, 1 );\n        }\n      }\n    };\n  }\n});\n\n\n\n\nvar // #5280: Internet Explorer will keep connections alive if we don't abort on unload\n  xhrOnUnloadAbort = window.ActiveXObject ? function() {\n    // Abort all pending requests\n    for ( var key in xhrCallbacks ) {\n      xhrCallbacks[ key ]( 0, 1 );\n    }\n  } : false,\n  xhrId = 0,\n  xhrCallbacks;\n\n// Functions to create xhrs\nfunction createStandardXHR() {\n  try {\n    return new window.XMLHttpRequest();\n  } catch( e ) {}\n}\n\nfunction createActiveXHR() {\n  try {\n    return new window.ActiveXObject( \"Microsoft.XMLHTTP\" );\n  } catch( e ) {}\n}\n\n// Create the request object\n// (This is still attached to ajaxSettings for backward compatibility)\njQuery.ajaxSettings.xhr = window.ActiveXObject ?\n  /* Microsoft failed to properly\n   * implement the XMLHttpRequest in IE7 (can't request local files),\n   * so we use the ActiveXObject when it is available\n   * Additionally XMLHttpRequest can be disabled in IE7/IE8 so\n   * we need a fallback.\n   */\n  function() {\n    return !this.isLocal && createStandardXHR() || createActiveXHR();\n  } :\n  // For all other browsers, use the standard XMLHttpRequest object\n  createStandardXHR;\n\n// Determine support properties\n(function( xhr ) {\n  jQuery.extend( jQuery.support, {\n    ajax: !!xhr,\n    cors: !!xhr && ( \"withCredentials\" in xhr )\n  });\n})( jQuery.ajaxSettings.xhr() );\n\n// Create transport if the browser can provide an xhr\nif ( jQuery.support.ajax ) {\n\n  jQuery.ajaxTransport(function( s ) {\n    // Cross domain only allowed if supported through XMLHttpRequest\n    if ( !s.crossDomain || jQuery.support.cors ) {\n\n      var callback;\n\n      return {\n        send: function( headers, complete ) {\n\n          // Get a new xhr\n          var xhr = s.xhr(),\n            handle,\n            i;\n\n          // Open the socket\n          // Passing null username, generates a login popup on Opera (#2865)\n          if ( s.username ) {\n            xhr.open( s.type, s.url, s.async, s.username, s.password );\n          } else {\n            xhr.open( s.type, s.url, s.async );\n          }\n\n          // Apply custom fields if provided\n          if ( s.xhrFields ) {\n            for ( i in s.xhrFields ) {\n              xhr[ i ] = s.xhrFields[ i ];\n            }\n          }\n\n          // Override mime type if needed\n          if ( s.mimeType && xhr.overrideMimeType ) {\n            xhr.overrideMimeType( s.mimeType );\n          }\n\n          // X-Requested-With header\n          // For cross-domain requests, seeing as conditions for a preflight are\n          // akin to a jigsaw puzzle, we simply never set it to be sure.\n          // (it can always be set on a per-request basis or even using ajaxSetup)\n          // For same-domain requests, won't change header if already provided.\n          if ( !s.crossDomain && !headers[\"X-Requested-With\"] ) {\n            headers[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n          }\n\n          // Need an extra try/catch for cross domain requests in Firefox 3\n          try {\n            for ( i in headers ) {\n              xhr.setRequestHeader( i, headers[ i ] );\n            }\n          } catch( _ ) {}\n\n          // Do send the request\n          // This may raise an exception which is actually\n          // handled in jQuery.ajax (so no try/catch here)\n          xhr.send( ( s.hasContent && s.data ) || null );\n\n          // Listener\n          callback = function( _, isAbort ) {\n\n            var status,\n              statusText,\n              responseHeaders,\n              responses,\n              xml;\n\n            // Firefox throws exceptions when accessing properties\n            // of an xhr when a network error occured\n            // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)\n            try {\n\n              // Was never called and is aborted or complete\n              if ( callback && ( isAbort || xhr.readyState === 4 ) ) {\n\n                // Only called once\n                callback = undefined;\n\n                // Do not keep as active anymore\n                if ( handle ) {\n                  xhr.onreadystatechange = jQuery.noop;\n                  if ( xhrOnUnloadAbort ) {\n                    delete xhrCallbacks[ handle ];\n                  }\n                }\n\n                // If it's an abort\n                if ( isAbort ) {\n                  // Abort it manually if needed\n                  if ( xhr.readyState !== 4 ) {\n                    xhr.abort();\n                  }\n                } else {\n                  status = xhr.status;\n                  responseHeaders = xhr.getAllResponseHeaders();\n                  responses = {};\n                  xml = xhr.responseXML;\n\n                  // Construct response list\n                  if ( xml && xml.documentElement /* #4958 */ ) {\n                    responses.xml = xml;\n                  }\n                  responses.text = xhr.responseText;\n\n                  // Firefox throws an exception when accessing\n                  // statusText for faulty cross-domain requests\n                  try {\n                    statusText = xhr.statusText;\n                  } catch( e ) {\n                    // We normalize with Webkit giving an empty statusText\n                    statusText = \"\";\n                  }\n\n                  // Filter status for non standard behaviors\n\n                  // If the request is local and we have data: assume a success\n                  // (success with no data won't get notified, that's the best we\n                  // can do given current implementations)\n                  if ( !status && s.isLocal && !s.crossDomain ) {\n                    status = responses.text ? 200 : 404;\n                  // IE - #1450: sometimes returns 1223 when it should be 204\n                  } else if ( status === 1223 ) {\n                    status = 204;\n                  }\n                }\n              }\n            } catch( firefoxAccessException ) {\n              if ( !isAbort ) {\n                complete( -1, firefoxAccessException );\n              }\n            }\n\n            // Call complete if needed\n            if ( responses ) {\n              complete( status, statusText, responses, responseHeaders );\n            }\n          };\n\n          // if we're in sync mode or it's in cache\n          // and has been retrieved directly (IE6 & IE7)\n          // we need to manually fire the callback\n          if ( !s.async || xhr.readyState === 4 ) {\n            callback();\n          } else {\n            handle = ++xhrId;\n            if ( xhrOnUnloadAbort ) {\n              // Create the active xhrs callbacks list if needed\n              // and attach the unload handler\n              if ( !xhrCallbacks ) {\n                xhrCallbacks = {};\n                jQuery( window ).unload( xhrOnUnloadAbort );\n              }\n              // Add to list of active xhrs callbacks\n              xhrCallbacks[ handle ] = callback;\n            }\n            xhr.onreadystatechange = callback;\n          }\n        },\n\n        abort: function() {\n          if ( callback ) {\n            callback(0,1);\n          }\n        }\n      };\n    }\n  });\n}\n\n\n\n\nvar elemdisplay = {},\n  iframe, iframeDoc,\n  rfxtypes = /^(?:toggle|show|hide)$/,\n  rfxnum = /^([+\\-]=)?([\\d+.\\-]+)([a-z%]*)$/i,\n  timerId,\n  fxAttrs = [\n    // height animations\n    [ \"height\", \"marginTop\", \"marginBottom\", \"paddingTop\", \"paddingBottom\" ],\n    // width animations\n    [ \"width\", \"marginLeft\", \"marginRight\", \"paddingLeft\", \"paddingRight\" ],\n    // opacity animations\n    [ \"opacity\" ]\n  ],\n  fxNow;\n\njQuery.fn.extend({\n  show: function( speed, easing, callback ) {\n    var elem, display;\n\n    if ( speed || speed === 0 ) {\n      return this.animate( genFx(\"show\", 3), speed, easing, callback );\n\n    } else {\n      for ( var i = 0, j = this.length; i < j; i++ ) {\n        elem = this[ i ];\n\n        if ( elem.style ) {\n          display = elem.style.display;\n\n          // Reset the inline display of this element to learn if it is\n          // being hidden by cascaded rules or not\n          if ( !jQuery._data(elem, \"olddisplay\") && display === \"none\" ) {\n            display = elem.style.display = \"\";\n          }\n\n          // Set elements which have been overridden with display: none\n          // in a stylesheet to whatever the default browser style is\n          // for such an element\n          if ( display === \"\" && jQuery.css(elem, \"display\") === \"none\" ) {\n            jQuery._data( elem, \"olddisplay\", defaultDisplay(elem.nodeName) );\n          }\n        }\n      }\n\n      // Set the display of most of the elements in a second loop\n      // to avoid the constant reflow\n      for ( i = 0; i < j; i++ ) {\n        elem = this[ i ];\n\n        if ( elem.style ) {\n          display = elem.style.display;\n\n          if ( display === \"\" || display === \"none\" ) {\n            elem.style.display = jQuery._data( elem, \"olddisplay\" ) || \"\";\n          }\n        }\n      }\n\n      return this;\n    }\n  },\n\n  hide: function( speed, easing, callback ) {\n    if ( speed || speed === 0 ) {\n      return this.animate( genFx(\"hide\", 3), speed, easing, callback);\n\n    } else {\n      var elem, display,\n        i = 0,\n        j = this.length;\n\n      for ( ; i < j; i++ ) {\n        elem = this[i];\n        if ( elem.style ) {\n          display = jQuery.css( elem, \"display\" );\n\n          if ( display !== \"none\" && !jQuery._data( elem, \"olddisplay\" ) ) {\n            jQuery._data( elem, \"olddisplay\", display );\n          }\n        }\n      }\n\n      // Set the display of the elements in a second loop\n      // to avoid the constant reflow\n      for ( i = 0; i < j; i++ ) {\n        if ( this[i].style ) {\n          this[i].style.display = \"none\";\n        }\n      }\n\n      return this;\n    }\n  },\n\n  // Save the old toggle function\n  _toggle: jQuery.fn.toggle,\n\n  toggle: function( fn, fn2, callback ) {\n    var bool = typeof fn === \"boolean\";\n\n    if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {\n      this._toggle.apply( this, arguments );\n\n    } else if ( fn == null || bool ) {\n      this.each(function() {\n        var state = bool ? fn : jQuery(this).is(\":hidden\");\n        jQuery(this)[ state ? \"show\" : \"hide\" ]();\n      });\n\n    } else {\n      this.animate(genFx(\"toggle\", 3), fn, fn2, callback);\n    }\n\n    return this;\n  },\n\n  fadeTo: function( speed, to, easing, callback ) {\n    return this.filter(\":hidden\").css(\"opacity\", 0).show().end()\n          .animate({opacity: to}, speed, easing, callback);\n  },\n\n  animate: function( prop, speed, easing, callback ) {\n    var optall = jQuery.speed( speed, easing, callback );\n\n    if ( jQuery.isEmptyObject( prop ) ) {\n      return this.each( optall.complete, [ false ] );\n    }\n\n    // Do not change referenced properties as per-property easing will be lost\n    prop = jQuery.extend( {}, prop );\n\n    function doAnimation() {\n      // XXX 'this' does not always have a nodeName when running the\n      // test suite\n\n      if ( optall.queue === false ) {\n        jQuery._mark( this );\n      }\n\n      var opt = jQuery.extend( {}, optall ),\n        isElement = this.nodeType === 1,\n        hidden = isElement && jQuery(this).is(\":hidden\"),\n        name, val, p, e,\n        parts, start, end, unit,\n        method;\n\n      // will store per property easing and be used to determine when an animation is complete\n      opt.animatedProperties = {};\n\n      for ( p in prop ) {\n\n        // property name normalization\n        name = jQuery.camelCase( p );\n        if ( p !== name ) {\n          prop[ name ] = prop[ p ];\n          delete prop[ p ];\n        }\n\n        val = prop[ name ];\n\n        // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)\n        if ( jQuery.isArray( val ) ) {\n          opt.animatedProperties[ name ] = val[ 1 ];\n          val = prop[ name ] = val[ 0 ];\n        } else {\n          opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';\n        }\n\n        if ( val === \"hide\" && hidden || val === \"show\" && !hidden ) {\n          return opt.complete.call( this );\n        }\n\n        if ( isElement && ( name === \"height\" || name === \"width\" ) ) {\n          // Make sure that nothing sneaks out\n          // Record all 3 overflow attributes because IE does not\n          // change the overflow attribute when overflowX and\n          // overflowY are set to the same value\n          opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];\n\n          // Set display property to inline-block for height/width\n          // animations on inline elements that are having width/height animated\n          if ( jQuery.css( this, \"display\" ) === \"inline\" &&\n              jQuery.css( this, \"float\" ) === \"none\" ) {\n\n            // inline-level elements accept inline-block;\n            // block-level elements need to be inline with layout\n            if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === \"inline\" ) {\n              this.style.display = \"inline-block\";\n\n            } else {\n              this.style.zoom = 1;\n            }\n          }\n        }\n      }\n\n      if ( opt.overflow != null ) {\n        this.style.overflow = \"hidden\";\n      }\n\n      for ( p in prop ) {\n        e = new jQuery.fx( this, opt, p );\n        val = prop[ p ];\n\n        if ( rfxtypes.test( val ) ) {\n\n          // Tracks whether to show or hide based on private\n          // data attached to the element\n          method = jQuery._data( this, \"toggle\" + p ) || ( val === \"toggle\" ? hidden ? \"show\" : \"hide\" : 0 );\n          if ( method ) {\n            jQuery._data( this, \"toggle\" + p, method === \"show\" ? \"hide\" : \"show\" );\n            e[ method ]();\n          } else {\n            e[ val ]();\n          }\n\n        } else {\n          parts = rfxnum.exec( val );\n          start = e.cur();\n\n          if ( parts ) {\n            end = parseFloat( parts[2] );\n            unit = parts[3] || ( jQuery.cssNumber[ p ] ? \"\" : \"px\" );\n\n            // We need to compute starting value\n            if ( unit !== \"px\" ) {\n              jQuery.style( this, p, (end || 1) + unit);\n              start = ( (end || 1) / e.cur() ) * start;\n              jQuery.style( this, p, start + unit);\n            }\n\n            // If a +=/-= token was provided, we're doing a relative animation\n            if ( parts[1] ) {\n              end = ( (parts[ 1 ] === \"-=\" ? -1 : 1) * end ) + start;\n            }\n\n            e.custom( start, end, unit );\n\n          } else {\n            e.custom( start, val, \"\" );\n          }\n        }\n      }\n\n      // For JS strict compliance\n      return true;\n    }\n\n    return optall.queue === false ?\n      this.each( doAnimation ) :\n      this.queue( optall.queue, doAnimation );\n  },\n\n  stop: function( type, clearQueue, gotoEnd ) {\n    if ( typeof type !== \"string\" ) {\n      gotoEnd = clearQueue;\n      clearQueue = type;\n      type = undefined;\n    }\n    if ( clearQueue && type !== false ) {\n      this.queue( type || \"fx\", [] );\n    }\n\n    return this.each(function() {\n      var index,\n        hadTimers = false,\n        timers = jQuery.timers,\n        data = jQuery._data( this );\n\n      // clear marker counters if we know they won't be\n      if ( !gotoEnd ) {\n        jQuery._unmark( true, this );\n      }\n\n      function stopQueue( elem, data, index ) {\n        var hooks = data[ index ];\n        jQuery.removeData( elem, index, true );\n        hooks.stop( gotoEnd );\n      }\n\n      if ( type == null ) {\n        for ( index in data ) {\n          if ( data[ index ] && data[ index ].stop && index.indexOf(\".run\") === index.length - 4 ) {\n            stopQueue( this, data, index );\n          }\n        }\n      } else if ( data[ index = type + \".run\" ] && data[ index ].stop ){\n        stopQueue( this, data, index );\n      }\n\n      for ( index = timers.length; index--; ) {\n        if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\n          if ( gotoEnd ) {\n\n            // force the next step to be the last\n            timers[ index ]( true );\n          } else {\n            timers[ index ].saveState();\n          }\n          hadTimers = true;\n          timers.splice( index, 1 );\n        }\n      }\n\n      // start the next in the queue if the last step wasn't forced\n      // timers currently will call their complete callbacks, which will dequeue\n      // but only if they were gotoEnd\n      if ( !( gotoEnd && hadTimers ) ) {\n        jQuery.dequeue( this, type );\n      }\n    });\n  }\n\n});\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n  setTimeout( clearFxNow, 0 );\n  return ( fxNow = jQuery.now() );\n}\n\nfunction clearFxNow() {\n  fxNow = undefined;\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, num ) {\n  var obj = {};\n\n  jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {\n    obj[ this ] = type;\n  });\n\n  return obj;\n}\n\n// Generate shortcuts for custom animations\njQuery.each({\n  slideDown: genFx( \"show\", 1 ),\n  slideUp: genFx( \"hide\", 1 ),\n  slideToggle: genFx( \"toggle\", 1 ),\n  fadeIn: { opacity: \"show\" },\n  fadeOut: { opacity: \"hide\" },\n  fadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n  jQuery.fn[ name ] = function( speed, easing, callback ) {\n    return this.animate( props, speed, easing, callback );\n  };\n});\n\njQuery.extend({\n  speed: function( speed, easing, fn ) {\n    var opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n      complete: fn || !fn && easing ||\n        jQuery.isFunction( speed ) && speed,\n      duration: speed,\n      easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n    };\n\n    opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n      opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n    // normalize opt.queue - true/undefined/null -> \"fx\"\n    if ( opt.queue == null || opt.queue === true ) {\n      opt.queue = \"fx\";\n    }\n\n    // Queueing\n    opt.old = opt.complete;\n\n    opt.complete = function( noUnmark ) {\n      if ( jQuery.isFunction( opt.old ) ) {\n        opt.old.call( this );\n      }\n\n      if ( opt.queue ) {\n        jQuery.dequeue( this, opt.queue );\n      } else if ( noUnmark !== false ) {\n        jQuery._unmark( this );\n      }\n    };\n\n    return opt;\n  },\n\n  easing: {\n    linear: function( p, n, firstNum, diff ) {\n      return firstNum + diff * p;\n    },\n    swing: function( p, n, firstNum, diff ) {\n      return ( ( -Math.cos( p*Math.PI ) / 2 ) + 0.5 ) * diff + firstNum;\n    }\n  },\n\n  timers: [],\n\n  fx: function( elem, options, prop ) {\n    this.options = options;\n    this.elem = elem;\n    this.prop = prop;\n\n    options.orig = options.orig || {};\n  }\n\n});\n\njQuery.fx.prototype = {\n  // Simple function for setting a style value\n  update: function() {\n    if ( this.options.step ) {\n      this.options.step.call( this.elem, this.now, this );\n    }\n\n    ( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );\n  },\n\n  // Get the current size\n  cur: function() {\n    if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {\n      return this.elem[ this.prop ];\n    }\n\n    var parsed,\n      r = jQuery.css( this.elem, this.prop );\n    // Empty strings, null, undefined and \"auto\" are converted to 0,\n    // complex values such as \"rotate(1rad)\" are returned as is,\n    // simple values such as \"10px\" are parsed to Float.\n    return isNaN( parsed = parseFloat( r ) ) ? !r || r === \"auto\" ? 0 : r : parsed;\n  },\n\n  // Start an animation from one number to another\n  custom: function( from, to, unit ) {\n    var self = this,\n      fx = jQuery.fx;\n\n    this.startTime = fxNow || createFxNow();\n    this.end = to;\n    this.now = this.start = from;\n    this.pos = this.state = 0;\n    this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? \"\" : \"px\" );\n\n    function t( gotoEnd ) {\n      return self.step( gotoEnd );\n    }\n\n    t.queue = this.options.queue;\n    t.elem = this.elem;\n    t.saveState = function() {\n      if ( self.options.hide && jQuery._data( self.elem, \"fxshow\" + self.prop ) === undefined ) {\n        jQuery._data( self.elem, \"fxshow\" + self.prop, self.start );\n      }\n    };\n\n    if ( t() && jQuery.timers.push(t) && !timerId ) {\n      timerId = setInterval( fx.tick, fx.interval );\n    }\n  },\n\n  // Simple 'show' function\n  show: function() {\n    var dataShow = jQuery._data( this.elem, \"fxshow\" + this.prop );\n\n    // Remember where we started, so that we can go back to it later\n    this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );\n    this.options.show = true;\n\n    // Begin the animation\n    // Make sure that we start at a small width/height to avoid any flash of content\n    if ( dataShow !== undefined ) {\n      // This show is picking up where a previous hide or show left off\n      this.custom( this.cur(), dataShow );\n    } else {\n      this.custom( this.prop === \"width\" || this.prop === \"height\" ? 1 : 0, this.cur() );\n    }\n\n    // Start by showing the element\n    jQuery( this.elem ).show();\n  },\n\n  // Simple 'hide' function\n  hide: function() {\n    // Remember where we started, so that we can go back to it later\n    this.options.orig[ this.prop ] = jQuery._data( this.elem, \"fxshow\" + this.prop ) || jQuery.style( this.elem, this.prop );\n    this.options.hide = true;\n\n    // Begin the animation\n    this.custom( this.cur(), 0 );\n  },\n\n  // Each step of an animation\n  step: function( gotoEnd ) {\n    var p, n, complete,\n      t = fxNow || createFxNow(),\n      done = true,\n      elem = this.elem,\n      options = this.options;\n\n    if ( gotoEnd || t >= options.duration + this.startTime ) {\n      this.now = this.end;\n      this.pos = this.state = 1;\n      this.update();\n\n      options.animatedProperties[ this.prop ] = true;\n\n      for ( p in options.animatedProperties ) {\n        if ( options.animatedProperties[ p ] !== true ) {\n          done = false;\n        }\n      }\n\n      if ( done ) {\n        // Reset the overflow\n        if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {\n\n          jQuery.each( [ \"\", \"X\", \"Y\" ], function( index, value ) {\n            elem.style[ \"overflow\" + value ] = options.overflow[ index ];\n          });\n        }\n\n        // Hide the element if the \"hide\" operation was done\n        if ( options.hide ) {\n          jQuery( elem ).hide();\n        }\n\n        // Reset the properties, if the item has been hidden or shown\n        if ( options.hide || options.show ) {\n          for ( p in options.animatedProperties ) {\n            jQuery.style( elem, p, options.orig[ p ] );\n            jQuery.removeData( elem, \"fxshow\" + p, true );\n            // Toggle data is no longer needed\n            jQuery.removeData( elem, \"toggle\" + p, true );\n          }\n        }\n\n        // Execute the complete function\n        // in the event that the complete function throws an exception\n        // we must ensure it won't be called twice. #5684\n\n        complete = options.complete;\n        if ( complete ) {\n\n          options.complete = false;\n          complete.call( elem );\n        }\n      }\n\n      return false;\n\n    } else {\n      // classical easing cannot be used with an Infinity duration\n      if ( options.duration == Infinity ) {\n        this.now = t;\n      } else {\n        n = t - this.startTime;\n        this.state = n / options.duration;\n\n        // Perform the easing function, defaults to swing\n        this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );\n        this.now = this.start + ( (this.end - this.start) * this.pos );\n      }\n      // Perform the next step of the animation\n      this.update();\n    }\n\n    return true;\n  }\n};\n\njQuery.extend( jQuery.fx, {\n  tick: function() {\n    var timer,\n      timers = jQuery.timers,\n      i = 0;\n\n    for ( ; i < timers.length; i++ ) {\n      timer = timers[ i ];\n      // Checks the timer has not already been removed\n      if ( !timer() && timers[ i ] === timer ) {\n        timers.splice( i--, 1 );\n      }\n    }\n\n    if ( !timers.length ) {\n      jQuery.fx.stop();\n    }\n  },\n\n  interval: 13,\n\n  stop: function() {\n    clearInterval( timerId );\n    timerId = null;\n  },\n\n  speeds: {\n    slow: 600,\n    fast: 200,\n    // Default speed\n    _default: 400\n  },\n\n  step: {\n    opacity: function( fx ) {\n      jQuery.style( fx.elem, \"opacity\", fx.now );\n    },\n\n    _default: function( fx ) {\n      if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {\n        fx.elem.style[ fx.prop ] = fx.now + fx.unit;\n      } else {\n        fx.elem[ fx.prop ] = fx.now;\n      }\n    }\n  }\n});\n\n// Adds width/height step functions\n// Do not set anything below 0\njQuery.each([ \"width\", \"height\" ], function( i, prop ) {\n  jQuery.fx.step[ prop ] = function( fx ) {\n    jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );\n  };\n});\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n  jQuery.expr.filters.animated = function( elem ) {\n    return jQuery.grep(jQuery.timers, function( fn ) {\n      return elem === fn.elem;\n    }).length;\n  };\n}\n\n// Try to restore the default display value of an element\nfunction defaultDisplay( nodeName ) {\n\n  if ( !elemdisplay[ nodeName ] ) {\n\n    var body = document.body,\n      elem = jQuery( \"<\" + nodeName + \">\" ).appendTo( body ),\n      display = elem.css( \"display\" );\n    elem.remove();\n\n    // If the simple way fails,\n    // get element's real default display by attaching it to a temp iframe\n    if ( display === \"none\" || display === \"\" ) {\n      // No iframe to use yet, so create it\n      if ( !iframe ) {\n        iframe = document.createElement( \"iframe\" );\n        iframe.frameBorder = iframe.width = iframe.height = 0;\n      }\n\n      body.appendChild( iframe );\n\n      // Create a cacheable copy of the iframe document on first call.\n      // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML\n      // document to it; WebKit & Firefox won't allow reusing the iframe document.\n      if ( !iframeDoc || !iframe.createElement ) {\n        iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;\n        iframeDoc.write( ( document.compatMode === \"CSS1Compat\" ? \"<!doctype html>\" : \"\" ) + \"<html><body>\" );\n        iframeDoc.close();\n      }\n\n      elem = iframeDoc.createElement( nodeName );\n\n      iframeDoc.body.appendChild( elem );\n\n      display = jQuery.css( elem, \"display\" );\n      body.removeChild( iframe );\n    }\n\n    // Store the correct default display\n    elemdisplay[ nodeName ] = display;\n  }\n\n  return elemdisplay[ nodeName ];\n}\n\n\n\n\nvar rtable = /^t(?:able|d|h)$/i,\n  rroot = /^(?:body|html)$/i;\n\nif ( \"getBoundingClientRect\" in document.documentElement ) {\n  jQuery.fn.offset = function( options ) {\n    var elem = this[0], box;\n\n    if ( options ) {\n      return this.each(function( i ) {\n        jQuery.offset.setOffset( this, options, i );\n      });\n    }\n\n    if ( !elem || !elem.ownerDocument ) {\n      return null;\n    }\n\n    if ( elem === elem.ownerDocument.body ) {\n      return jQuery.offset.bodyOffset( elem );\n    }\n\n    try {\n      box = elem.getBoundingClientRect();\n    } catch(e) {}\n\n    var doc = elem.ownerDocument,\n      docElem = doc.documentElement;\n\n    // Make sure we're not dealing with a disconnected DOM node\n    if ( !box || !jQuery.contains( docElem, elem ) ) {\n      return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };\n    }\n\n    var body = doc.body,\n      win = getWindow(doc),\n      clientTop  = docElem.clientTop  || body.clientTop  || 0,\n      clientLeft = docElem.clientLeft || body.clientLeft || 0,\n      scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,\n      scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,\n      top  = box.top  + scrollTop  - clientTop,\n      left = box.left + scrollLeft - clientLeft;\n\n    return { top: top, left: left };\n  };\n\n} else {\n  jQuery.fn.offset = function( options ) {\n    var elem = this[0];\n\n    if ( options ) {\n      return this.each(function( i ) {\n        jQuery.offset.setOffset( this, options, i );\n      });\n    }\n\n    if ( !elem || !elem.ownerDocument ) {\n      return null;\n    }\n\n    if ( elem === elem.ownerDocument.body ) {\n      return jQuery.offset.bodyOffset( elem );\n    }\n\n    var computedStyle,\n      offsetParent = elem.offsetParent,\n      prevOffsetParent = elem,\n      doc = elem.ownerDocument,\n      docElem = doc.documentElement,\n      body = doc.body,\n      defaultView = doc.defaultView,\n      prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,\n      top = elem.offsetTop,\n      left = elem.offsetLeft;\n\n    while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {\n      if ( jQuery.support.fixedPosition && prevComputedStyle.position === \"fixed\" ) {\n        break;\n      }\n\n      computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;\n      top  -= elem.scrollTop;\n      left -= elem.scrollLeft;\n\n      if ( elem === offsetParent ) {\n        top  += elem.offsetTop;\n        left += elem.offsetLeft;\n\n        if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {\n          top  += parseFloat( computedStyle.borderTopWidth  ) || 0;\n          left += parseFloat( computedStyle.borderLeftWidth ) || 0;\n        }\n\n        prevOffsetParent = offsetParent;\n        offsetParent = elem.offsetParent;\n      }\n\n      if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== \"visible\" ) {\n        top  += parseFloat( computedStyle.borderTopWidth  ) || 0;\n        left += parseFloat( computedStyle.borderLeftWidth ) || 0;\n      }\n\n      prevComputedStyle = computedStyle;\n    }\n\n    if ( prevComputedStyle.position === \"relative\" || prevComputedStyle.position === \"static\" ) {\n      top  += body.offsetTop;\n      left += body.offsetLeft;\n    }\n\n    if ( jQuery.support.fixedPosition && prevComputedStyle.position === \"fixed\" ) {\n      top  += Math.max( docElem.scrollTop, body.scrollTop );\n      left += Math.max( docElem.scrollLeft, body.scrollLeft );\n    }\n\n    return { top: top, left: left };\n  };\n}\n\njQuery.offset = {\n\n  bodyOffset: function( body ) {\n    var top = body.offsetTop,\n      left = body.offsetLeft;\n\n    if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {\n      top  += parseFloat( jQuery.css(body, \"marginTop\") ) || 0;\n      left += parseFloat( jQuery.css(body, \"marginLeft\") ) || 0;\n    }\n\n    return { top: top, left: left };\n  },\n\n  setOffset: function( elem, options, i ) {\n    var position = jQuery.css( elem, \"position\" );\n\n    // set position first, in-case top/left are set even on static elem\n    if ( position === \"static\" ) {\n      elem.style.position = \"relative\";\n    }\n\n    var curElem = jQuery( elem ),\n      curOffset = curElem.offset(),\n      curCSSTop = jQuery.css( elem, \"top\" ),\n      curCSSLeft = jQuery.css( elem, \"left\" ),\n      calculatePosition = ( position === \"absolute\" || position === \"fixed\" ) && jQuery.inArray(\"auto\", [curCSSTop, curCSSLeft]) > -1,\n      props = {}, curPosition = {}, curTop, curLeft;\n\n    // need to be able to calculate position if either top or left is auto and position is either absolute or fixed\n    if ( calculatePosition ) {\n      curPosition = curElem.position();\n      curTop = curPosition.top;\n      curLeft = curPosition.left;\n    } else {\n      curTop = parseFloat( curCSSTop ) || 0;\n      curLeft = parseFloat( curCSSLeft ) || 0;\n    }\n\n    if ( jQuery.isFunction( options ) ) {\n      options = options.call( elem, i, curOffset );\n    }\n\n    if ( options.top != null ) {\n      props.top = ( options.top - curOffset.top ) + curTop;\n    }\n    if ( options.left != null ) {\n      props.left = ( options.left - curOffset.left ) + curLeft;\n    }\n\n    if ( \"using\" in options ) {\n      options.using.call( elem, props );\n    } else {\n      curElem.css( props );\n    }\n  }\n};\n\n\njQuery.fn.extend({\n\n  position: function() {\n    if ( !this[0] ) {\n      return null;\n    }\n\n    var elem = this[0],\n\n    // Get *real* offsetParent\n    offsetParent = this.offsetParent(),\n\n    // Get correct offsets\n    offset       = this.offset(),\n    parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();\n\n    // Subtract element margins\n    // note: when an element has margin: auto the offsetLeft and marginLeft\n    // are the same in Safari causing offset.left to incorrectly be 0\n    offset.top  -= parseFloat( jQuery.css(elem, \"marginTop\") ) || 0;\n    offset.left -= parseFloat( jQuery.css(elem, \"marginLeft\") ) || 0;\n\n    // Add offsetParent borders\n    parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], \"borderTopWidth\") ) || 0;\n    parentOffset.left += parseFloat( jQuery.css(offsetParent[0], \"borderLeftWidth\") ) || 0;\n\n    // Subtract the two offsets\n    return {\n      top:  offset.top  - parentOffset.top,\n      left: offset.left - parentOffset.left\n    };\n  },\n\n  offsetParent: function() {\n    return this.map(function() {\n      var offsetParent = this.offsetParent || document.body;\n      while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, \"position\") === \"static\") ) {\n        offsetParent = offsetParent.offsetParent;\n      }\n      return offsetParent;\n    });\n  }\n});\n\n\n// Create scrollLeft and scrollTop methods\njQuery.each( [\"Left\", \"Top\"], function( i, name ) {\n  var method = \"scroll\" + name;\n\n  jQuery.fn[ method ] = function( val ) {\n    var elem, win;\n\n    if ( val === undefined ) {\n      elem = this[ 0 ];\n\n      if ( !elem ) {\n        return null;\n      }\n\n      win = getWindow( elem );\n\n      // Return the scroll offset\n      return win ? (\"pageXOffset\" in win) ? win[ i ? \"pageYOffset\" : \"pageXOffset\" ] :\n        jQuery.support.boxModel && win.document.documentElement[ method ] ||\n          win.document.body[ method ] :\n        elem[ method ];\n    }\n\n    // Set the scroll offset\n    return this.each(function() {\n      win = getWindow( this );\n\n      if ( win ) {\n        win.scrollTo(\n          !i ? val : jQuery( win ).scrollLeft(),\n           i ? val : jQuery( win ).scrollTop()\n        );\n\n      } else {\n        this[ method ] = val;\n      }\n    });\n  };\n});\n\nfunction getWindow( elem ) {\n  return jQuery.isWindow( elem ) ?\n    elem :\n    elem.nodeType === 9 ?\n      elem.defaultView || elem.parentWindow :\n      false;\n}\n\n\n\n\n// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods\njQuery.each([ \"Height\", \"Width\" ], function( i, name ) {\n\n  var type = name.toLowerCase();\n\n  // innerHeight and innerWidth\n  jQuery.fn[ \"inner\" + name ] = function() {\n    var elem = this[0];\n    return elem ?\n      elem.style ?\n      parseFloat( jQuery.css( elem, type, \"padding\" ) ) :\n      this[ type ]() :\n      null;\n  };\n\n  // outerHeight and outerWidth\n  jQuery.fn[ \"outer\" + name ] = function( margin ) {\n    var elem = this[0];\n    return elem ?\n      elem.style ?\n      parseFloat( jQuery.css( elem, type, margin ? \"margin\" : \"border\" ) ) :\n      this[ type ]() :\n      null;\n  };\n\n  jQuery.fn[ type ] = function( size ) {\n    // Get window width or height\n    var elem = this[0];\n    if ( !elem ) {\n      return size == null ? null : this;\n    }\n\n    if ( jQuery.isFunction( size ) ) {\n      return this.each(function( i ) {\n        var self = jQuery( this );\n        self[ type ]( size.call( this, i, self[ type ]() ) );\n      });\n    }\n\n    if ( jQuery.isWindow( elem ) ) {\n      // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode\n      // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat\n      var docElemProp = elem.document.documentElement[ \"client\" + name ],\n        body = elem.document.body;\n      return elem.document.compatMode === \"CSS1Compat\" && docElemProp ||\n        body && body[ \"client\" + name ] || docElemProp;\n\n    // Get document width or height\n    } else if ( elem.nodeType === 9 ) {\n      // Either scroll[Width/Height] or offset[Width/Height], whichever is greater\n      return Math.max(\n        elem.documentElement[\"client\" + name],\n        elem.body[\"scroll\" + name], elem.documentElement[\"scroll\" + name],\n        elem.body[\"offset\" + name], elem.documentElement[\"offset\" + name]\n      );\n\n    // Get or set width or height on the element\n    } else if ( size === undefined ) {\n      var orig = jQuery.css( elem, type ),\n        ret = parseFloat( orig );\n\n      return jQuery.isNumeric( ret ) ? ret : orig;\n\n    // Set the width or height on the element (default to pixels if value is unitless)\n    } else {\n      return this.css( type, typeof size === \"string\" ? size : size + \"px\" );\n    }\n  };\n\n});\n\n\n\n\n// Expose jQuery to the global object\nwindow.jQuery = window.$ = jQuery;\n\n// Expose jQuery as an AMD module, but only for AMD loaders that\n// understand the issues with loading multiple versions of jQuery\n// in a page that all might call define(). The loader will indicate\n// they have special allowances for multiple jQuery versions by\n// specifying define.amd.jQuery = true. Register as a named module,\n// since jQuery can be concatenated with other files that may use define,\n// but not use a proper concatenation script that understands anonymous\n// AMD modules. A named AMD is safest and most robust way to register.\n// Lowercase jquery is used because AMD module names are derived from\n// file names, and jQuery is normally delivered in a lowercase file name.\n// Do this after creating the global so that if an AMD module wants to call\n// noConflict to hide this version of jQuery, it will work.\nif ( typeof define === \"function\" && define.amd && define.amd.jQuery ) {\n  define( \"jquery\", [], function () { return jQuery; } );\n}\n\n\n\n})( window );\n"
  },
  {
    "path": "bower_components/expect.js/test/common.js",
    "content": "\n/*!\n * Common test dependencies.\n */\n\n// expose the globals that are obtained through `<script>` on the browser\nexpect = require('../expect')\n"
  },
  {
    "path": "bower_components/expect.js/test/expect.js",
    "content": "\n/**\n * Module dependencies.\n */\n\nfunction err (fn, msg) {\n  try {\n    fn();\n    throw new Error('Expected an error');\n  } catch (err) {\n    expect(msg).to.be(err.message);\n  }\n}\n\n/**\n * Feature detection for `name` support.\n */\n\nvar nameSupported;\n\n(function a () {\n  nameSupported = 'a' == a.name;\n})();\n\n/**\n * Tests.\n */\n\ndescribe('expect', function () {\n\n  it('should have .version', function () {\n    expect(expect.version).to.match(/^\\d+\\.\\d+\\.\\d+$/);\n  });\n\n  it('should work in its basic form', function () {\n    expect('test').to.be.a('string');\n  });\n\n  it('should test true', function () {\n    expect(true).to.be(true);\n    expect(false).to.not.be(true);\n    expect(1).to.not.be(true);\n\n    err(function () {\n      expect('test').to.be(true);\n    }, \"expected 'test' to equal true\")\n  });\n\n  it('should allow not.to', function () {\n    expect(true).not.to.be(false);\n\n    err(function () {\n      expect(false).not.to.be(false);\n    }, \"expected false to not equal false\")\n  });\n\n  it('should test ok', function () {\n    expect(true).to.be.ok();\n    expect(false).to.not.be.ok();\n    expect(1).to.be.ok();\n    expect(0).to.not.be.ok();\n\n    err(function () {\n      expect('').to.be.ok();\n    }, \"expected '' to be truthy\");\n\n    err(function () {\n      expect('test').to.not.be.ok();\n    }, \"expected 'test' to be falsy\");\n  });\n\n  it('should test false', function () {\n    expect(false).to.be(false);\n    expect(true).to.not.be(false);\n    expect(0).to.not.be(false);\n\n    err(function () {\n      expect('').to.be(false);\n    }, \"expected '' to equal false\")\n  });\n\n  it('should test functions with arguments', function () {\n    function itThrowsSometimes (first, second) {\n      if (first ^ second) {\n        throw new Error('tell');\n      }\n    }\n\n    expect(itThrowsSometimes).withArgs(false, false).to.not.throwException();\n    expect(itThrowsSometimes).withArgs(false, true).to.throwException(/tell/);\n    expect(itThrowsSometimes).withArgs(true, false).to.throwException(/tell/);\n    expect(itThrowsSometimes).withArgs(true, true).to.not.throwException();\n  });\n\n  it('should test for exceptions', function () {\n    function itThrows () {\n      a.b.c;\n    }\n\n    function itThrowsString () {\n      throw 'aaa';\n    }\n\n    function itThrowsMessage () {\n      throw new Error('tobi');\n    }\n\n    var anonItThrows = function () {\n      a.b.c;\n    }\n\n    function itWorks () {\n      return\n    }\n\n    var anonItWorks = function () { }\n\n    expect(itThrows).to.throwException();\n    expect(itWorks).to.not.throwException();\n\n    var subject;\n\n    expect(itThrows).to.throwException(function (e) {\n      subject = e;\n    });\n\n    expect(subject).to.be.an(Error);\n\n    expect(itThrowsMessage).to.throwException(/tobi/);\n    expect(itThrowsMessage).to.not.throwException(/test/);\n\n    err(function () {\n      expect(itThrowsMessage).to.throwException(/no match/);\n    }, 'expected \\'tobi\\' to match /no match/');\n\n    var subject2;\n\n    expect(itThrowsString).to.throwException(function (str) {\n      subject2 = str;\n    });\n\n    expect(subject2).to.be('aaa');\n\n    expect(itThrowsString).to.throwException(/aaa/);\n    expect(itThrowsString).to.not.throwException(/bbb/);\n\n    err(function () {\n      expect(itThrowsString).to.throwException(/no match/i);\n    }, 'expected \\'aaa\\' to match /no match/i');\n\n    var called = false;\n\n    expect(itWorks).to.not.throwError(function () {\n      called = true;\n    });\n\n    expect(called).to.be(false);\n\n    err(function () {\n      expect(5).to.throwException();\n    }, 'expected 5 to be a function');\n\n    err(function () {\n      expect(anonItThrows).not.to.throwException();\n    }, 'expected fn not to throw an exception');\n\n    err(function () {\n      expect(anonItWorks).to.throwException();\n    }, 'expected fn to throw an exception');\n\n    if (nameSupported) {\n      err(function () {\n        expect(itWorks).to.throwException();\n      }, 'expected itWorks to throw an exception');\n    } else {\n      err(function () {\n        expect(itWorks).to.throwException();\n      }, 'expected fn to throw an exception');\n    }\n\n    if (nameSupported) {\n      err(function () {\n        expect(itThrows).not.to.throwException();\n      }, 'expected itThrows not to throw an exception');\n    } else {\n      err(function () {\n        expect(anonItThrows).not.to.throwException();\n      }, 'expected fn not to throw an exception');\n    }\n  });\n\n  it('should test arrays', function () {\n    expect([]).to.be.a('array');\n    expect([]).to.be.an('array');\n\n    err(function () {\n      expect({}).to.be.an('array');\n    }, 'expected {} to be an array');\n  });\n\n  it('should test regex', function () {\n    expect(/a/).to.be.an('regexp');\n    expect(/a/).to.be.a('regexp');\n\n    err(function () {\n      expect(null).to.be.a('regexp');\n    }, 'expected null to be a regexp');\n  });\n\n  it('should test objects', function () {\n    expect({}).to.be.an('object');\n\n    err(function () {\n      expect(null).to.be.an('object');\n    }, 'expected null to be an object');\n  });\n\n  it('should test .equal()', function () {\n    var foo;\n    expect(foo).to.be(undefined);\n  });\n\n  it('should test typeof', function () {\n    expect('test').to.be.a('string');\n\n    err(function () {\n      expect('test').to.not.be.a('string');\n    }, \"expected 'test' not to be a string\");\n\n    expect(5).to.be.a('number');\n\n    err(function () {\n      expect(5).to.not.be.a('number');\n    }, \"expected 5 not to be a number\");\n  });\n\n  it('should test instanceof', function () {\n    function Foo(){}\n    expect(new Foo()).to.be.a(Foo);\n\n    if (nameSupported) {\n      err(function () {\n        expect(3).to.be.a(Foo);\n      }, \"expected 3 to be an instance of Foo\");\n    } else {\n      err(function () {\n        expect(3).to.be.a(Foo);\n      }, \"expected 3 to be an instance of supplied constructor\");\n    }\n  });\n\n  it('should test within(start, finish)', function () {\n    expect(5).to.be.within(3,6);\n    expect(5).to.be.within(3,5);\n    expect(5).to.not.be.within(1,3);\n\n    err(function () {\n      expect(5).to.not.be.within(4,6);\n    }, \"expected 5 to not be within 4..6\");\n\n    err(function () {\n      expect(10).to.be.within(50,100);\n    }, \"expected 10 to be within 50..100\");\n  });\n\n  it('should test above(n)', function () {\n    expect(5).to.be.above(2);\n    expect(5).to.be.greaterThan(2);\n    expect(5).to.not.be.above(5);\n    expect(5).to.not.be.above(6);\n\n    err(function () {\n      expect(5).to.be.above(6);\n    }, \"expected 5 to be above 6\");\n\n    err(function () {\n      expect(10).to.not.be.above(6);\n    }, \"expected 10 to be below 6\");\n  });\n\n  it('should test match(regexp)', function () {\n    expect('foobar').to.match(/^foo/)\n    expect('foobar').to.not.match(/^bar/)\n\n    err(function () {\n      expect('foobar').to.match(/^bar/i)\n    }, \"expected 'foobar' to match /^bar/i\");\n\n    err(function () {\n      expect('foobar').to.not.match(/^foo/i)\n    }, \"expected 'foobar' not to match /^foo/i\");\n  });\n\n  it('should test length(n)', function () {\n    expect('test').to.have.length(4);\n    expect('test').to.not.have.length(3);\n    expect([1,2,3]).to.have.length(3);\n\n    err(function () {\n      expect(4).to.have.length(3);\n    }, 'expected 4 to have a property \\'length\\'');\n\n    err(function () {\n      expect('asd').to.not.have.length(3);\n    }, \"expected 'asd' to not have a length of 3\");\n  });\n\n  it('should test eql(val)', function () {\n    expect('test').to.eql('test');\n    expect({ foo: 'bar' }).to.eql({ foo: 'bar' });\n    expect(1).to.eql(1);\n    expect('4').to.eql(4);\n    expect(/a/gmi).to.eql(/a/mig);\n\n    err(function () {\n      expect(4).to.eql(3);\n    }, 'expected 4 to sort of equal 3');\n  });\n\n  it('should test equal(val)', function () {\n    expect('test').to.equal('test');\n    expect(1).to.equal(1);\n\n    err(function () {\n      expect(4).to.equal(3);\n    }, 'expected 4 to equal 3');\n\n    err(function () {\n      expect('4').to.equal(4);\n    }, \"expected '4' to equal 4\");\n  });\n\n  it('should test be(val)', function () {\n    expect('test').to.be('test');\n    expect(1).to.be(1);\n\n    err(function () {\n      expect(4).to.be(3);\n    }, 'expected 4 to equal 3');\n\n    err(function () {\n      expect('4').to.be(4);\n    }, \"expected '4' to equal 4\");\n  });\n\n  it('should test empty', function () {\n    expect('').to.be.empty();\n    expect({}).to.be.empty();\n    expect([]).to.be.empty();\n    expect({ length: 0 }).to.be.empty();\n\n    err(function () {\n      expect(null).to.be.empty();\n    }, 'expected null to be an object');\n\n    err(function () {\n      expect({ a: 'b' }).to.be.empty();\n    }, 'expected { a: \\'b\\' } to be empty');\n\n    err(function () {\n      expect({ length: '0' }).to.be.empty();\n    }, 'expected { length: \\'0\\' } to be empty');\n\n    err(function () {\n      expect('asd').to.be.empty();\n    }, \"expected 'asd' to be empty\");\n\n    err(function () {\n      expect('').to.not.be.empty();\n    }, \"expected '' to not be empty\");\n\n    err(function () {\n      expect({}).to.not.be.empty();\n    }, \"expected {} to not be empty\");\n  });\n\n  it('should test property(name)', function () {\n    expect('test').to.have.property('length');\n    expect(4).to.not.have.property('length');\n    expect({ length: undefined }).to.have.property('length');\n\n    err(function () {\n      expect('asd').to.have.property('foo');\n    }, \"expected 'asd' to have a property 'foo'\");\n    \n    err(function () {\n      expect({ length: undefined }).to.not.have.property('length');\n    }, \"expected { length: undefined } to not have a property 'length'\");\n  });\n\n  it('should test property(name, val)', function () {\n    expect('test').to.have.property('length', 4);\n    expect({ length: undefined }).to.have.property('length', undefined);\n\n    err(function () {\n      expect('asd').to.have.property('length', 4);\n    }, \"expected 'asd' to have a property 'length' of 4, but got 3\");\n\n    err(function () {\n      expect('asd').to.not.have.property('length', 3);\n    }, \"expected 'asd' to not have a property 'length' of 3\");\n\n    err(function () {\n      expect('asd').to.not.have.property('foo', 3);\n    }, \"'asd' has no property 'foo'\");\n    \n    err(function () {\n      expect({ length: undefined }).to.not.have.property('length', undefined);\n    }, \"expected { length: undefined } to not have a property 'length'\");\n  });\n\n  it('should test own.property(name)', function () {\n    expect('test').to.have.own.property('length');\n    expect({ length: 12 }).to.have.own.property('length');\n\n    err(function () {\n      expect({ length: 12 }).to.not.have.own.property('length');\n    }, \"expected { length: 12 } to not have own property 'length'\");\n  });\n\n  it('should test string()', function () {\n    expect('foobar').to.contain('bar');\n    expect('foobar').to.contain('foo');\n    expect('foobar').to.include.string('foo');\n    expect('foobar').to.not.contain('baz');\n    expect('foobar').to.not.include.string('baz');\n\n    err(function () {\n      expect(3).to.contain('baz');\n    }, \"expected 3 to contain 'baz'\");\n\n    err(function () {\n      expect('foobar').to.contain('baz');\n    }, \"expected 'foobar' to contain 'baz'\");\n\n    err(function () {\n      expect('foobar').to.not.contain('bar');\n    }, \"expected 'foobar' to not contain 'bar'\");\n  });\n\n  it('should test contain()', function () {\n    expect(['foo', 'bar']).to.contain('foo');\n    expect(['foo', 'bar']).to.contain('foo');\n    expect(['foo', 'bar']).to.contain('bar');\n    expect([1,2]).to.contain(1);\n    expect(['foo', 'bar']).to.not.contain('baz');\n    expect(['foo', 'bar']).to.not.contain(1);\n\n    err(function () {\n      expect(['foo']).to.contain('bar');\n    }, \"expected [ 'foo' ] to contain 'bar'\");\n\n    err(function () {\n      expect(['bar', 'foo']).to.not.contain('foo');\n    }, \"expected [ 'bar', 'foo' ] to not contain 'foo'\");\n  });\n\n  it('should test keys(array)', function () {\n    expect({ foo: 1 }).to.have.keys(['foo']);\n    expect({ foo: 1, bar: 2 }).to.have.keys(['foo', 'bar']);\n    expect({ foo: 1, bar: 2 }).to.have.keys('foo', 'bar');\n    expect({ foo: 1, bar: 2, baz: 3 }).to.include.keys('foo', 'bar');\n    expect({ foo: 1, bar: 2, baz: 3 }).to.include.keys('bar', 'foo');\n    expect({ foo: 1, bar: 2, baz: 3 }).to.include.keys('baz');\n\n    expect({ foo: 1, bar: 2 }).to.include.keys('foo');\n    expect({ foo: 1, bar: 2 }).to.include.keys('bar', 'foo');\n    expect({ foo: 1, bar: 2 }).to.include.keys(['foo']);\n    expect({ foo: 1, bar: 2 }).to.include.keys(['bar']);\n    expect({ foo: 1, bar: 2 }).to.include.keys(['bar', 'foo']);\n\n    expect({ foo: 1, bar: 2 }).to.not.have.keys('baz');\n    expect({ foo: 1, bar: 2 }).to.not.have.keys('foo', 'baz');\n    expect({ foo: 1, bar: 2 }).to.not.include.keys('baz');\n    expect({ foo: 1, bar: 2 }).to.not.include.keys('foo', 'baz');\n    expect({ foo: 1, bar: 2 }).to.not.include.keys('baz', 'foo');\n\n    err(function () {\n      expect({ foo: 1 }).to.have.keys();\n    }, \"keys required\");\n\n    err(function () {\n      expect({ foo: 1 }).to.have.keys([]);\n    }, \"keys required\");\n\n    err(function () {\n      expect({ foo: 1 }).to.not.have.keys([]);\n    }, \"keys required\");\n\n    err(function () {\n      expect({ foo: 1 }).to.include.keys([]);\n    }, \"keys required\");\n\n    err(function () {\n      expect({ foo: 1 }).to.have.keys(['bar']);\n    }, \"expected { foo: 1 } to include key 'bar'\");\n\n    err(function () {\n      expect({ foo: 1 }).to.have.keys(['bar', 'baz']);\n    }, \"expected { foo: 1 } to include keys 'bar', and 'baz'\");\n\n    err(function () {\n      expect({ foo: 1 }).to.have.keys(['foo', 'bar', 'baz']);\n    }, \"expected { foo: 1 } to include keys 'foo', 'bar', and 'baz'\");\n\n    err(function () {\n      expect({ foo: 1 }).to.not.have.keys(['foo']);\n    }, \"expected { foo: 1 } to not include key 'foo'\");\n\n    err(function () {\n      expect({ foo: 1 }).to.not.have.keys(['foo']);\n    }, \"expected { foo: 1 } to not include key 'foo'\");\n\n    err(function () {\n      expect({ foo: 1, bar: 2 }).to.not.have.keys(['foo', 'bar']);\n    }, \"expected { foo: 1, bar: 2 } to not include keys 'foo', and 'bar'\");\n\n    err(function () {\n      expect({ foo: 1 }).to.not.include.keys(['foo']);\n    }, \"expected { foo: 1 } to not include key 'foo'\");\n\n    err(function () {\n      expect({ foo: 1 }).to.include.keys('foo', 'bar');\n    }, \"expected { foo: 1 } to include keys 'foo', and 'bar'\");\n\n    // only\n    expect({ foo: 1, bar: 1 }).to.only.have.keys('foo', 'bar');\n    expect({ foo: 1, bar: 1 }).to.only.have.keys(['foo', 'bar']);\n\n    err(function () {\n      expect({ a: 'b', c: 'd' }).to.only.have.keys('a', 'b', 'c');\n    }, \"expected { a: 'b', c: 'd' } to only have keys 'a', 'b', and 'c'\");\n\n    err(function () {\n      expect({ a: 'b', c: 'd' }).to.only.have.keys('a');\n    }, \"expected { a: 'b', c: 'd' } to only have key 'a'\");\n  });\n\n  it('should allow chaining with `and`', function () {\n    expect(5).to.be.a('number').and.be(5);\n    expect(5).to.be.a('number').and.not.be(6);\n    expect(5).to.be.a('number').and.not.be(6).and.not.be('5');\n\n    err(function () {\n      expect(5).to.be.a('number').and.not.be(5);\n    }, \"expected 5 to not equal 5\");\n\n    err(function () {\n      expect(5).to.be.a('number').and.not.be(6).and.not.be.above(4);\n    }, \"expected 5 to be below 4\");\n  });\n\n  it('should fail with `fail`', function () {\n    err(function () {\n        expect().fail();\n    }, \"explicit failure\");\n  });\n\n  it('should fail with `fail` and custom message', function () {\n    err(function () {\n        expect().fail(\"explicit failure with message\");\n    }, \"explicit failure with message\");\n  });\n\n});\n"
  },
  {
    "path": "bower_components/expect.js/test/index.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>expect.js tests</title>\n    <link href=\"/support/mocha.css\" rel=\"stylesheet\" media=\"screen\" />\n    <script src=\"/support/jquery.js\"></script>\n    <script src=\"/support/mocha.js\"></script>\n    <script>mocha.setup({ ui: 'bdd', globals: ['script*']});</script>\n    <script src=\"/expect.js\"></script>\n    <script src=\"/test/expect.js\"></script>\n    <script>window.onload = mocha.run;</script>\n  </head>\n  <body>\n    <div id=\"mocha\"></div>\n  </body>\n</html>\n"
  },
  {
    "path": "bower_components/jquery/.bower.json",
    "content": "{\n  \"name\": \"jquery\",\n  \"version\": \"2.1.4\",\n  \"main\": \"dist/jquery.js\",\n  \"license\": \"MIT\",\n  \"ignore\": [\n    \"**/.*\",\n    \"build\",\n    \"dist/cdn\",\n    \"speed\",\n    \"test\",\n    \"*.md\",\n    \"AUTHORS.txt\",\n    \"Gruntfile.js\",\n    \"package.json\"\n  ],\n  \"devDependencies\": {\n    \"sizzle\": \"2.1.1-jquery.2.1.2\",\n    \"requirejs\": \"2.1.10\",\n    \"qunit\": \"1.14.0\",\n    \"sinon\": \"1.8.1\"\n  },\n  \"keywords\": [\n    \"jquery\",\n    \"javascript\",\n    \"library\"\n  ],\n  \"homepage\": \"https://github.com/jquery/jquery\",\n  \"_release\": \"2.1.4\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"2.1.4\",\n    \"commit\": \"7751e69b615c6eca6f783a81e292a55725af6b85\"\n  },\n  \"_source\": \"git://github.com/jquery/jquery.git\",\n  \"_target\": \">1.8\",\n  \"_originalSource\": \"jquery\"\n}"
  },
  {
    "path": "bower_components/jquery/MIT-LICENSE.txt",
    "content": "Copyright 2014 jQuery Foundation and other contributors\nhttp://jquery.com/\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "bower_components/jquery/bower.json",
    "content": "{\n  \"name\": \"jquery\",\n  \"version\": \"2.1.4\",\n  \"main\": \"dist/jquery.js\",\n  \"license\": \"MIT\",\n  \"ignore\": [\n    \"**/.*\",\n    \"build\",\n    \"dist/cdn\",\n    \"speed\",\n    \"test\",\n    \"*.md\",\n    \"AUTHORS.txt\",\n    \"Gruntfile.js\",\n    \"package.json\"\n  ],\n  \"devDependencies\": {\n    \"sizzle\": \"2.1.1-jquery.2.1.2\",\n    \"requirejs\": \"2.1.10\",\n    \"qunit\": \"1.14.0\",\n    \"sinon\": \"1.8.1\"\n  },\n  \"keywords\": [\n    \"jquery\",\n    \"javascript\",\n    \"library\"\n  ]\n}\n"
  },
  {
    "path": "bower_components/jquery/dist/jquery.js",
    "content": "/*!\n * jQuery JavaScript Library v2.1.4\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2015-04-28T16:01Z\n */\n\n(function( global, factory ) {\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n}(typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Support: Firefox 18+\n// Can't be in strict mode, several libs including ASP.NET trace\n// the stack via arguments.caller.callee and Firefox dies if\n// you try to trace through \"use strict\" call chains. (#13335)\n//\n\nvar arr = [];\n\nvar slice = arr.slice;\n\nvar concat = arr.concat;\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar support = {};\n\n\n\nvar\n\t// Use the correct document accordingly with window argument (sandbox)\n\tdocument = window.document,\n\n\tversion = \"2.1.4\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android<4.1\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t};\n\njQuery.fn = jQuery.prototype = {\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num != null ?\n\n\t\t\t// Return just the one element from the set\n\t\t\t( num < 0 ? this[ num + this.length ] : this[ num ] ) :\n\n\t\t\t// Return all the elements in a clean array\n\t\t\tslice.call( this );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\t\tret.context = this.context;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray,\n\n\tisWindow: function( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\t\t// parseFloat NaNs numeric-cast false positives (null|true|false|\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t// adding 1 corrects loss of precision from parseFloat (#15100)\n\t\treturn !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\t// Not plain objects:\n\t\t// - Any object or value whose internal [[Class]] property is not \"[object Object]\"\n\t\t// - DOM nodes\n\t\t// - window\n\t\tif ( jQuery.type( obj ) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( obj.constructor &&\n\t\t\t\t!hasOwn.call( obj.constructor.prototype, \"isPrototypeOf\" ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// If the function hasn't returned already, we're confident that\n\t\t// |obj| is a plain object, created by {} or constructed with new Object\n\t\treturn true;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn obj + \"\";\n\t\t}\n\t\t// Support: Android<4.0, iOS<6 (functionish RegExp)\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ toString.call(obj) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\t// Evaluates a script in a global context\n\tglobalEval: function( code ) {\n\t\tvar script,\n\t\t\tindirect = eval;\n\n\t\tcode = jQuery.trim( code );\n\n\t\tif ( code ) {\n\t\t\t// If the code includes a valid, prologue position\n\t\t\t// strict mode pragma, execute code by injecting a\n\t\t\t// script tag into the document.\n\t\t\tif ( code.indexOf(\"use strict\") === 1 ) {\n\t\t\t\tscript = document.createElement(\"script\");\n\t\t\t\tscript.text = code;\n\t\t\t\tdocument.head.appendChild( script ).parentNode.removeChild( script );\n\t\t\t} else {\n\t\t\t// Otherwise, avoid the DOM node creation, insertion\n\t\t\t// and removal by using an indirect global eval\n\t\t\t\tindirect( code );\n\t\t\t}\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Support: IE9-11+\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( obj, callback, args ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = obj.length,\n\t\t\tisArray = isArraylike( obj );\n\n\t\tif ( args ) {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android<4.1\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArraylike( Object(arr) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tisArray = isArraylike( elems ),\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar tmp, args, proxy;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\tnow: Date.now,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n});\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nfunction isArraylike( obj ) {\n\n\t// Support: iOS 8.2 (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = \"length\" in obj && obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( type === \"function\" || jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\tif ( obj.nodeType === 1 && length ) {\n\t\treturn true;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.2.0-pre\n * http://sizzlejs.com/\n *\n * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2014-12-16\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// General-purpose constants\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// http://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\trescape = /'|\\\\/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar match, elem, m, nodeType,\n\t\t// QSA vars\n\t\ti, groups, old, nid, newContext, newSelector;\n\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\n\tcontext = context || document;\n\tresults = results || [];\n\tnodeType = context.nodeType;\n\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\tif ( !seed && documentIsHTML ) {\n\n\t\t// Try to shortcut find operations when possible (e.g., not under DocumentFragment)\n\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document (jQuery #6963)\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\n\t\t// QSA path\n\t\tif ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\t\t\tnid = old = expando;\n\t\t\tnewContext = context;\n\t\t\tnewSelector = nodeType !== 1 && selector;\n\n\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t// IE 8 doesn't work on object elements\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t} else {\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t}\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\ti = groups.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\t\t\t\t}\n\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;\n\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t}\n\n\t\t\tif ( newSelector ) {\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch(qsaError) {\n\t\t\t\t} finally {\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( div.parentNode ) {\n\t\t\tdiv.parentNode.removeChild( div );\n\t\t}\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = attrs.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\t( ~b.sourceIndex || MAX_NEGATIVE ) -\n\t\t\t( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, parent,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// If no document and documentElement is available, return\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Set our document\n\tdocument = doc;\n\tdocElem = doc.documentElement;\n\tparent = doc.defaultView;\n\n\t// Support: IE>8\n\t// If iframe document is assigned to \"document\" variable and if iframe has been reloaded,\n\t// IE will throw \"permission denied\" error when accessing \"document\" variable, see jQuery #13936\n\t// IE6-8 do not support the defaultView property so parent will be undefined\n\tif ( parent && parent !== parent.top ) {\n\t\t// IE11 does not have attachEvent, so all must suffer\n\t\tif ( parent.addEventListener ) {\n\t\t\tparent.addEventListener( \"unload\", unloadHandler, false );\n\t\t} else if ( parent.attachEvent ) {\n\t\t\tparent.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Support tests\n\t---------------------------------------------------------------------- */\n\tdocumentIsHTML = !isXML( doc );\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.className = \"i\";\n\t\treturn !div.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( doc.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( doc.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( div ) {\n\t\tdocElem.appendChild( div ).id = expando;\n\t\treturn !doc.getElementsByName || !doc.getElementsByName( expando ).length;\n\t});\n\n\t// ID find and filter\n\tif ( support.getById ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [ m ] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\t// Support: IE6/7\n\t\t// getElementById is not reliable as a find shortcut\n\t\tdelete Expr.find[\"ID\"];\n\n\t\tExpr.filter[\"ID\"] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" && elem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See http://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( div ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\f]' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( div.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+\n\t\t\tif ( !div.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibing-combinator selector` fails\n\t\t\tif ( !div.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = doc.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tdiv.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( div.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully does not implement inclusive descendent\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === doc ? -1 :\n\t\t\t\tb === doc ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn doc;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\t\t\t\t\t\t\tdiff = cache[1];\n\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\t\t\t\t\t\tif ( (oldCache = outerCache[ dir ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\touterCache[ dir ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\tmatchedCount += i;\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is no seed and only one group\n\tif ( match.length === 1 ) {\n\n\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\n\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\trsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( div1 ) {\n\t// Should return 1, but returns 4 (following)\n\treturn div1.compareDocumentPosition( document.createElement(\"div\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( div ) {\n\tdiv.innerHTML = \"<a href='#'></a>\";\n\treturn div.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( div ) {\n\tdiv.innerHTML = \"<input/>\";\n\tdiv.firstChild.setAttribute( \"value\", \"\" );\n\treturn div.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( div ) {\n\treturn div.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.pseudos;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\nvar rsingleTag = (/^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/);\n\n\n\nvar risSimple = /^.[^:#\\[\\.,]*$/;\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\t/* jshint -W018 */\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t});\n\n\t}\n\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t});\n\n\t}\n\n\tif ( typeof qualifier === \"string\" ) {\n\t\tif ( risSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter( qualifier, elements, not );\n\t\t}\n\n\t\tqualifier = jQuery.filter( qualifier, elements );\n\t}\n\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( indexOf.call( qualifier, elem ) >= 0 ) !== not;\n\t});\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\treturn elems.length === 1 && elem.nodeType === 1 ?\n\t\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\n\t\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\t\treturn elem.nodeType === 1;\n\t\t}));\n};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar i,\n\t\t\tlen = this.length,\n\t\t\tret = [],\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}) );\n\t\t}\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\n\t\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\n\t\tret.selector = this.selector ? this.selector + \" \" + selector : selector;\n\t\treturn ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], false) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], true) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n});\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\n\tinit = jQuery.fn.init = function( selector, context ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[0] === \"<\" && selector[ selector.length - 1 ] === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[1],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Support: Blackberry 4.6\n\t\t\t\t\t// gEBID returns nodes no longer in the document (#6963)\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || rootjQuery ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn typeof rootjQuery.ready !== \"undefined\" ?\n\t\t\t\trootjQuery.ready( selector ) :\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.extend({\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\ttruncate = until !== undefined;\n\n\t\twhile ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tmatched.push( elem );\n\t\t\t}\n\t\t}\n\t\treturn matched;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar matched = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tmatched.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn matched;\n\t}\n});\n\njQuery.fn.extend({\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter(function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tfor ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {\n\t\t\t\t// Always skip document fragments\n\t\t\t\tif ( cur.nodeType < 11 && (pos ?\n\t\t\t\t\tpos.index(cur) > -1 :\n\n\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\tjQuery.find.matchesSelector(cur, selectors)) ) {\n\n\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.unique(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter(selector)\n\t\t);\n\t}\n});\n\nfunction sibling( cur, dir ) {\n\twhile ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn elem.contentDocument || jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.unique( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n});\nvar rnotwhite = (/\\S+/g);\n\n\n\n// String to Object options format cache\nvar optionsCache = {};\n\n// Convert String-formatted options into Object-formatted ones and store in cache\nfunction createOptions( options ) {\n\tvar object = optionsCache[ options ] = {};\n\tjQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t});\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\t( optionsCache[ options ] || createOptions( options ) ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Last fire value (for non-forgettable lists)\n\t\tmemory,\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\t\t// Flag to know if list is currently firing\n\t\tfiring,\n\t\t// First callback to fire (used internally by add and fireWith)\n\t\tfiringStart,\n\t\t// End of the loop when firing\n\t\tfiringLength,\n\t\t// Index of currently firing callback (modified by remove if needed)\n\t\tfiringIndex,\n\t\t// Actual callback list\n\t\tlist = [],\n\t\t// Stack of fire calls for repeatable lists\n\t\tstack = !options.once && [],\n\t\t// Fire callbacks\n\t\tfire = function( data ) {\n\t\t\tmemory = options.memory && data;\n\t\t\tfired = true;\n\t\t\tfiringIndex = firingStart || 0;\n\t\t\tfiringStart = 0;\n\t\t\tfiringLength = list.length;\n\t\t\tfiring = true;\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\n\t\t\t\tif ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {\n\t\t\t\t\tmemory = false; // To prevent further calls using add\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfiring = false;\n\t\t\tif ( list ) {\n\t\t\t\tif ( stack ) {\n\t\t\t\t\tif ( stack.length ) {\n\t\t\t\t\t\tfire( stack.shift() );\n\t\t\t\t\t}\n\t\t\t\t} else if ( memory ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t} else {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Actual Callbacks object\n\t\tself = {\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\t// First, we save the current length\n\t\t\t\t\tvar start = list.length;\n\t\t\t\t\t(function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tvar type = jQuery.type( arg );\n\t\t\t\t\t\t\tif ( type === \"function\" ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && type !== \"string\" ) {\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})( arguments );\n\t\t\t\t\t// Do we need to add the callbacks to the\n\t\t\t\t\t// current firing batch?\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tfiringLength = list.length;\n\t\t\t\t\t// With memory, if we're not firing then\n\t\t\t\t\t// we should call right away\n\t\t\t\t\t} else if ( memory ) {\n\t\t\t\t\t\tfiringStart = start;\n\t\t\t\t\t\tfire( memory );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\t\tvar index;\n\t\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\t\tlist.splice( index, 1 );\n\t\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\t\t\tif ( index <= firingLength ) {\n\t\t\t\t\t\t\t\t\tfiringLength--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );\n\t\t\t},\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tlist = [];\n\t\t\t\tfiringLength = 0;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Have the list do nothing anymore\n\t\t\tdisable: function() {\n\t\t\t\tlist = stack = memory = undefined;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it disabled?\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\t\t\t// Lock the list in its current state\n\t\t\tlock: function() {\n\t\t\t\tstack = undefined;\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it locked?\n\t\t\tlocked: function() {\n\t\t\t\treturn !stack;\n\t\t\t},\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( list && ( !fired || stack ) ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tstack.push( args );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfire( args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\njQuery.extend({\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks(\"memory\") ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[1] ](function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject )\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t}).promise();\n\t\t\t\t},\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[1] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(function() {\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ]\n\t\t\tdeferred[ tuple[0] ] = function() {\n\t\t\t\tdeferred[ tuple[0] + \"With\" ]( this === deferred ? promise : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\tdeferred[ tuple[0] + \"With\" ] = list.fireWith;\n\t\t});\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred. If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\t\t\t\t\t} else if ( !( --remaining ) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// Add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject )\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n});\n\n\n// The deferred used on DOM ready\nvar readyList;\n\njQuery.fn.ready = function( fn ) {\n\t// Add the callback\n\tjQuery.ready.promise().done( fn );\n\n\treturn this;\n};\n\njQuery.extend({\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.triggerHandler ) {\n\t\t\tjQuery( document ).triggerHandler( \"ready\" );\n\t\t\tjQuery( document ).off( \"ready\" );\n\t\t}\n\t}\n});\n\n/**\n * The ready event handler and self cleanup method\n */\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed, false );\n\twindow.removeEventListener( \"load\", completed, false );\n\tjQuery.ready();\n}\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called after the browser event has already occurred.\n\t\t// We once tried to use readyState \"interactive\" here, but it caused issues like the one\n\t\t// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\tsetTimeout( jQuery.ready );\n\n\t\t} else {\n\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", completed, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", completed, false );\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n// Kick off the DOM ready check even if the user does not\njQuery.ready.promise();\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( jQuery.type( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\tjQuery.access( elems, fn, i, key[i], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn chainable ?\n\t\telems :\n\n\t\t// Gets\n\t\tbulk ?\n\t\t\tfn.call( elems ) :\n\t\t\tlen ? fn( elems[0], key ) : emptyGet;\n};\n\n\n/**\n * Determines whether an object can have data\n */\njQuery.acceptData = function( owner ) {\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\t/* jshint -W018 */\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\nfunction Data() {\n\t// Support: Android<4,\n\t// Old WebKit does not have Object.preventExtensions/freeze method,\n\t// return new empty object instead with no [[set]] accessor\n\tObject.defineProperty( this.cache = {}, 0, {\n\t\tget: function() {\n\t\t\treturn {};\n\t\t}\n\t});\n\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\nData.accepts = jQuery.acceptData;\n\nData.prototype = {\n\tkey: function( owner ) {\n\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t// but we should not, see #8335.\n\t\t// Always return the key for a frozen object.\n\t\tif ( !Data.accepts( owner ) ) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar descriptor = {},\n\t\t\t// Check if the owner object already has a cache key\n\t\t\tunlock = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !unlock ) {\n\t\t\tunlock = Data.uid++;\n\n\t\t\t// Secure it in a non-enumerable, non-writable property\n\t\t\ttry {\n\t\t\t\tdescriptor[ this.expando ] = { value: unlock };\n\t\t\t\tObject.defineProperties( owner, descriptor );\n\n\t\t\t// Support: Android<4\n\t\t\t// Fallback to a less secure definition\n\t\t\t} catch ( e ) {\n\t\t\t\tdescriptor[ this.expando ] = unlock;\n\t\t\t\tjQuery.extend( owner, descriptor );\n\t\t\t}\n\t\t}\n\n\t\t// Ensure the cache object\n\t\tif ( !this.cache[ unlock ] ) {\n\t\t\tthis.cache[ unlock ] = {};\n\t\t}\n\n\t\treturn unlock;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\t// There may be an unlock assigned to this node,\n\t\t\t// if there is no entry for this \"owner\", create one inline\n\t\t\t// and set the unlock as though an owner entry had always existed\n\t\t\tunlock = this.key( owner ),\n\t\t\tcache = this.cache[ unlock ];\n\n\t\t// Handle: [ owner, key, value ] args\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ data ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\t\t\t// Fresh assignments by object are shallow copied\n\t\t\tif ( jQuery.isEmptyObject( cache ) ) {\n\t\t\t\tjQuery.extend( this.cache[ unlock ], data );\n\t\t\t// Otherwise, copy the properties one-by-one to the cache object\n\t\t\t} else {\n\t\t\t\tfor ( prop in data ) {\n\t\t\t\t\tcache[ prop ] = data[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\t// Either a valid cache is found, or will be created.\n\t\t// New caches will be created and the unlock returned,\n\t\t// allowing direct access to the newly created\n\t\t// empty data object. A valid owner object must be provided.\n\t\tvar cache = this.cache[ this.key( owner ) ];\n\n\t\treturn key === undefined ?\n\t\t\tcache : cache[ key ];\n\t},\n\taccess: function( owner, key, value ) {\n\t\tvar stored;\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t((key && typeof key === \"string\") && value === undefined) ) {\n\n\t\t\tstored = this.get( owner, key );\n\n\t\t\treturn stored !== undefined ?\n\t\t\t\tstored : this.get( owner, jQuery.camelCase(key) );\n\t\t}\n\n\t\t// [*]When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i, name, camel,\n\t\t\tunlock = this.key( owner ),\n\t\t\tcache = this.cache[ unlock ];\n\n\t\tif ( key === undefined ) {\n\t\t\tthis.cache[ unlock ] = {};\n\n\t\t} else {\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( jQuery.isArray( key ) ) {\n\t\t\t\t// If \"name\" is an array of keys...\n\t\t\t\t// When data is initially created, via (\"key\", \"val\") signature,\n\t\t\t\t// keys will be converted to camelCase.\n\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\n\t\t\t\t// both plain key and camelCase key. #12786\n\t\t\t\t// This will only penalize the array argument path.\n\t\t\t\tname = key.concat( key.map( jQuery.camelCase ) );\n\t\t\t} else {\n\t\t\t\tcamel = jQuery.camelCase( key );\n\t\t\t\t// Try the string as a key before any manipulation\n\t\t\t\tif ( key in cache ) {\n\t\t\t\t\tname = [ key, camel ];\n\t\t\t\t} else {\n\t\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\t\tname = camel;\n\t\t\t\t\tname = name in cache ?\n\t\t\t\t\t\t[ name ] : ( name.match( rnotwhite ) || [] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ti = name.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ name[ i ] ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\treturn !jQuery.isEmptyObject(\n\t\t\tthis.cache[ owner[ this.expando ] ] || {}\n\t\t);\n\t},\n\tdiscard: function( owner ) {\n\t\tif ( owner[ this.expando ] ) {\n\t\t\tdelete this.cache[ owner[ this.expando ] ];\n\t\t}\n\t}\n};\nvar data_priv = new Data();\n\nvar data_user = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\t\tdata === \"false\" ? false :\n\t\t\t\t\tdata === \"null\" ? null :\n\t\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdata_user.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend({\n\thasData: function( elem ) {\n\t\treturn data_user.hasData( elem ) || data_priv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn data_user.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdata_user.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to data_priv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn data_priv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdata_priv.remove( elem, name );\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = data_user.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !data_priv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE11+\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice(5) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdata_priv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tdata_user.set( this, key );\n\t\t\t});\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data,\n\t\t\t\tcamelKey = jQuery.camelCase( key );\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// with the key as-is\n\t\t\t\tdata = data_user.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// with the key camelized\n\t\t\t\tdata = data_user.get( elem, camelKey );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, camelKey, undefined );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each(function() {\n\t\t\t\t// First, attempt to store a copy or reference of any\n\t\t\t\t// data that might've been store with a camelCased key.\n\t\t\t\tvar data = data_user.get( this, camelKey );\n\n\t\t\t\t// For HTML5 data-* attribute interop, we have to\n\t\t\t\t// store property names with dashes in a camelCase form.\n\t\t\t\t// This might not apply to all properties...*\n\t\t\t\tdata_user.set( this, camelKey, value );\n\n\t\t\t\t// *... In the case of properties that might _actually_\n\t\t\t\t// have dashes, we need to also store a copy of that\n\t\t\t\t// unchanged property.\n\t\t\t\tif ( key.indexOf(\"-\") !== -1 && data !== undefined ) {\n\t\t\t\t\tdata_user.set( this, key, value );\n\t\t\t\t}\n\t\t\t});\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tdata_user.remove( this, key );\n\t\t});\n\t}\n});\n\n\njQuery.extend({\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = data_priv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray( data ) ) {\n\t\t\t\t\tqueue = data_priv.access( elem, type, jQuery.makeArray(data) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn data_priv.get( elem, key ) || data_priv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks(\"once memory\").add(function() {\n\t\t\t\tdata_priv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t})\n\t\t});\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = data_priv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n});\nvar pnum = (/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/).source;\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar isHidden = function( elem, el ) {\n\t\t// isHidden might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\t\treturn jQuery.css( elem, \"display\" ) === \"none\" || !jQuery.contains( elem.ownerDocument, elem );\n\t};\n\nvar rcheckableType = (/^(?:checkbox|radio)$/i);\n\n\n\n(function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Safari<=5.1\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Safari<=5.1, Android<4.2\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE<=11+\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n})();\nvar strundefined = typeof undefined;\n\n\n\nsupport.focusinBubbles = \"onfocusin\" in window;\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)$/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = data_priv.get( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !(events = elemData.events) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !(eventHandle = elemData.handle) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend({\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join(\".\")\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !(handlers = events[ type ]) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = data_priv.hasData( elem ) && data_priv.get( elem );\n\n\t\tif ( !elemData || !(events = elemData.events) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[2] && new RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdelete elemData.handle;\n\t\t\tdata_priv.remove( elem, \"events\" );\n\t\t}\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split(\".\") : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf(\".\") >= 0 ) {\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split(\".\");\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf(\":\") < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join(\".\");\n\t\tevent.namespace_re = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === (elem.ownerDocument || document) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( data_priv.get( cur, \"events\" ) || {} )[ event.type ] && data_priv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && jQuery.acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&\n\t\t\t\tjQuery.acceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\telem[ type ]();\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event );\n\n\t\tvar i, j, ret, matched, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\targs = slice.call( arguments ),\n\t\t\thandlers = ( data_priv.get( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[0] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\n\t\t\t\t// a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n\t\t\t\t\t\t\t.apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( (event.result = ret) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, matches, sel, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\t// Black-hole SVG <use> instance trees (#13180)\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\n\t\tif ( delegateCount && cur.nodeType && (!event.button || event.type !== \"click\") ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.disabled !== true || event.type !== \"click\" ) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) >= 0 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matches[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push({ elem: cur, handlers: matches });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\tprops: \"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: \"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\t\t\tvar eventDoc, doc, body,\n\t\t\t\tbutton = original.button;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop, copy,\n\t\t\ttype = event.type,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = this.fixHooks[ type ];\n\n\t\tif ( !fixHook ) {\n\t\t\tthis.fixHooks[ type ] = fixHook =\n\t\t\t\trmouseEvent.test( type ) ? this.mouseHooks :\n\t\t\t\trkeyEvent.test( type ) ? this.keyHooks :\n\t\t\t\t{};\n\t\t}\n\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = new jQuery.Event( originalEvent );\n\n\t\ti = copy.length;\n\t\twhile ( i-- ) {\n\t\t\tprop = copy[ i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Support: Cordova 2.5 (WebKit) (#13255)\n\t\t// All events should have a target; Cordova deviceready doesn't\n\t\tif ( !event.target ) {\n\t\t\tevent.target = document;\n\t\t}\n\n\t\t// Support: Safari 6.0+, Chrome<28\n\t\t// Target should not be a text node (#504, #13143)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\tspecial: {\n\t\tload: {\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\tthis.focus();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this.type === \"checkbox\" && this.click && jQuery.nodeName( this, \"input\" ) ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn jQuery.nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tsimulate: function( type, elem, event, bubble ) {\n\t\t// Piggyback on a donor event to simulate a different one.\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t\t// simulated event prevents default then we do the same on the donor.\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true,\n\t\t\t\toriginalEvent: {}\n\t\t\t}\n\t\t);\n\t\tif ( bubble ) {\n\t\t\tjQuery.event.trigger( e, null, elem );\n\t\t} else {\n\t\t\tjQuery.event.dispatch.call( elem, e );\n\t\t}\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\njQuery.removeEvent = function( elem, type, handle ) {\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle, false );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\t// Allow instantiation without the 'new' keyword\n\tif ( !(this instanceof jQuery.Event) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\t\t\t\t// Support: Android<4.0\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && e.preventDefault ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && e.stopImmediatePropagation ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// Support: Chrome 15+\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mousenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n});\n\n// Support: Firefox, Chrome, Safari\n// Create \"bubbling\" focus and blur events\nif ( !support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\t\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = data_priv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdata_priv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = data_priv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdata_priv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdata_priv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\njQuery.fn.extend({\n\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n\t\tvar origFn, type;\n\n\t\t// Types can be a map of types/handlers\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-Object, selector, data )\n\t\t\tif ( typeof selector !== \"string\" ) {\n\t\t\t\t// ( types-Object, data )\n\t\t\t\tdata = data || selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( data == null && fn == null ) {\n\t\t\t// ( types, fn )\n\t\t\tfn = selector;\n\t\t\tdata = selector = undefined;\n\t\t} else if ( fn == null ) {\n\t\t\tif ( typeof selector === \"string\" ) {\n\t\t\t\t// ( types, selector, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = undefined;\n\t\t\t} else {\n\t\t\t\t// ( types, data, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t} else if ( !fn ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( one === 1 ) {\n\t\t\torigFn = fn;\n\t\t\tfn = function( event ) {\n\t\t\t\t// Can use an empty set, since event contains the info\n\t\t\t\tjQuery().off( event );\n\t\t\t\treturn origFn.apply( this, arguments );\n\t\t\t};\n\t\t\t// Use same guid so caller can remove using origFn\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\n\t\t});\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn this.on( types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t});\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t});\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[0];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n});\n\n\nvar\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,\n\trtagName = /<([\\w:]+)/,\n\trhtml = /<|&#?\\w+;/,\n\trnoInnerhtml = /<(?:script|style|link)/i,\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /^$|\\/(?:java|ecma)script/i,\n\trscriptTypeMasked = /^true\\/(.*)/,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,\n\n\t// We have to close these tags to support XHTML (#13200)\n\twrapMap = {\n\n\t\t// Support: IE9\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t\t_default: [ 0, \"\", \"\" ]\n\t};\n\n// Support: IE9\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: 1.x compatibility\n// Manipulating tables requires a tbody\nfunction manipulationTarget( elem, content ) {\n\treturn jQuery.nodeName( elem, \"table\" ) &&\n\t\tjQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ?\n\n\t\telem.getElementsByTagName(\"tbody\")[0] ||\n\t\t\telem.appendChild( elem.ownerDocument.createElement(\"tbody\") ) :\n\t\telem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = (elem.getAttribute(\"type\") !== null) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\n\tif ( match ) {\n\t\telem.type = match[ 1 ];\n\t} else {\n\t\telem.removeAttribute(\"type\");\n\t}\n\n\treturn elem;\n}\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdata_priv.set(\n\t\t\telems[ i ], \"globalEval\", !refElements || data_priv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( data_priv.hasData( src ) ) {\n\t\tpdataOld = data_priv.access( src );\n\t\tpdataCur = data_priv.set( dest, pdataOld );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdelete pdataCur.handle;\n\t\t\tpdataCur.events = {};\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( data_user.hasData( src ) ) {\n\t\tudataOld = data_user.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdata_user.set( dest, udataCur );\n\t}\n}\n\nfunction getAll( context, tag ) {\n\tvar ret = context.getElementsByTagName ? context.getElementsByTagName( tag || \"*\" ) :\n\t\t\tcontext.querySelectorAll ? context.querySelectorAll( tag || \"*\" ) :\n\t\t\t[];\n\n\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\t\tjQuery.merge( [ context ], ret ) :\n\t\tret;\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tbuildFragment: function( elems, context, scripts, selection ) {\n\t\tvar elem, tmp, tag, wrap, contains, j,\n\t\t\tfragment = context.createDocumentFragment(),\n\t\t\tnodes = [],\n\t\t\ti = 0,\n\t\t\tl = elems.length;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\telem = elems[ i ];\n\n\t\t\tif ( elem || elem === 0 ) {\n\n\t\t\t\t// Add nodes directly\n\t\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\t\t\t\t\t// Support: QtWebKit, PhantomJS\n\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t\t// Convert non-html into a text node\n\t\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t\t// Convert html into DOM nodes\n\t\t\t\t} else {\n\t\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement(\"div\") );\n\n\t\t\t\t\t// Deserialize a standard representation\n\t\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\t\ttmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, \"<$1></$2>\" ) + wrap[ 2 ];\n\n\t\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\t\tj = wrap[ 0 ];\n\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: QtWebKit, PhantomJS\n\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t\t// Remember the top-level container\n\t\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\t\ttmp.textContent = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Remove wrapper from fragment\n\t\tfragment.textContent = \"\";\n\n\t\ti = 0;\n\t\twhile ( (elem = nodes[ i++ ]) ) {\n\n\t\t\t// #4087 - If origin and destination elements are the same, and this is\n\t\t\t// that element, do not do anything\n\t\t\tif ( selection && jQuery.inArray( elem, selection ) !== -1 ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t\t// Append to fragment\n\t\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t\t// Preserve script evaluation history\n\t\t\tif ( contains ) {\n\t\t\t\tsetGlobalEval( tmp );\n\t\t\t}\n\n\t\t\t// Capture executables\n\t\t\tif ( scripts ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (elem = tmp[ j++ ]) ) {\n\t\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\t\tscripts.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn fragment;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type, key,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = elems[ i ]) !== undefined; i++ ) {\n\t\t\tif ( jQuery.acceptData( elem ) ) {\n\t\t\t\tkey = elem[ data_priv.expando ];\n\n\t\t\t\tif ( key && (data = data_priv.cache[ key ]) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( data_priv.cache[ key ] ) {\n\t\t\t\t\t\t// Discard any remaining `private` data\n\t\t\t\t\t\tdelete data_priv.cache[ key ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Discard any remaining `user` data\n\t\t\tdelete data_user.cache[ elem[ data_user.expando ] ];\n\t\t}\n\t}\n});\n\njQuery.fn.extend({\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each(function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t});\n\t},\n\n\tafter: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t});\n\t},\n\n\tremove: function( selector, keepData /* Internal Use Only */ ) {\n\t\tvar elem,\n\t\t\telems = selector ? jQuery.filter( selector, this ) : this,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem ) );\n\t\t\t}\n\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\tif ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\t\tsetGlobalEval( getAll( elem, \"script\" ) );\n\t\t\t\t}\n\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map(function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t});\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar arg = arguments[ 0 ];\n\n\t\t// Make the changes, replacing each context element with the new content\n\t\tthis.domManip( arguments, function( elem ) {\n\t\t\targ = this.parentNode;\n\n\t\t\tjQuery.cleanData( getAll( this ) );\n\n\t\t\tif ( arg ) {\n\t\t\t\targ.replaceChild( elem, this );\n\t\t\t}\n\t\t});\n\n\t\t// Force removal if there was no new content (e.g., from empty arguments)\n\t\treturn arg && (arg.length || arg.nodeType) ? this : this.remove();\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, callback ) {\n\n\t\t// Flatten any nested arrays\n\t\targs = concat.apply( [], args );\n\n\t\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tset = this,\n\t\t\tiNoClone = l - 1,\n\t\t\tvalue = args[ 0 ],\n\t\t\tisFunction = jQuery.isFunction( value );\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( isFunction ||\n\t\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\t\treturn this.each(function( index ) {\n\t\t\t\tvar self = set.eq( index );\n\t\t\t\tif ( isFunction ) {\n\t\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t\t}\n\t\t\t\tself.domManip( args, callback );\n\t\t\t});\n\t\t}\n\n\t\tif ( l ) {\n\t\t\tfragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );\n\t\t\tfirst = fragment.firstChild;\n\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfragment = first;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\t\thasScripts = scripts.length;\n\n\t\t\t\t// Use the original fragment for the last item instead of the first because it can end up\n\t\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\tnode = fragment;\n\n\t\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\t\t\t// Support: QtWebKit\n\t\t\t\t\t\t\t// jQuery.merge because push.apply(_, arraylike) throws\n\t\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcallback.call( this[ i ], node, i );\n\t\t\t\t}\n\n\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t\t// Reenable scripts\n\t\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t\t!data_priv.access( node, \"globalEval\" ) && jQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\t\tif ( node.src ) {\n\t\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\t\tif ( jQuery._evalUrl ) {\n\t\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.globalEval( node.textContent.replace( rcleanScript, \"\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: QtWebKit\n\t\t\t// .get() because push.apply(_, arraylike) throws\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\n\nvar iframe,\n\telemdisplay = {};\n\n/**\n * Retrieve the actual display of a element\n * @param {String} name nodeName of the element\n * @param {Object} doc Document object\n */\n// Called only from within defaultDisplay\nfunction actualDisplay( name, doc ) {\n\tvar style,\n\t\telem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\n\t\t// getDefaultComputedStyle might be reliably used only on attached element\n\t\tdisplay = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?\n\n\t\t\t// Use of this method is a temporary fix (more like optimization) until something better comes along,\n\t\t\t// since it was removed from specification and supported only in FF\n\t\t\tstyle.display : jQuery.css( elem[ 0 ], \"display\" );\n\n\t// We don't have any data stored on the element,\n\t// so use \"detach\" method as fast way to get rid of the element\n\telem.detach();\n\n\treturn display;\n}\n\n/**\n * Try to determine the default display value of an element\n * @param {String} nodeName\n */\nfunction defaultDisplay( nodeName ) {\n\tvar doc = document,\n\t\tdisplay = elemdisplay[ nodeName ];\n\n\tif ( !display ) {\n\t\tdisplay = actualDisplay( nodeName, doc );\n\n\t\t// If the simple way fails, read from inside an iframe\n\t\tif ( display === \"none\" || !display ) {\n\n\t\t\t// Use the already-created iframe if possible\n\t\t\tiframe = (iframe || jQuery( \"<iframe frameborder='0' width='0' height='0'/>\" )).appendTo( doc.documentElement );\n\n\t\t\t// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse\n\t\t\tdoc = iframe[ 0 ].contentDocument;\n\n\t\t\t// Support: IE\n\t\t\tdoc.write();\n\t\t\tdoc.close();\n\n\t\t\tdisplay = actualDisplay( nodeName, doc );\n\t\t\tiframe.detach();\n\t\t}\n\n\t\t// Store the correct default display\n\t\telemdisplay[ nodeName ] = display;\n\t}\n\n\treturn display;\n}\nvar rmargin = (/^margin/);\n\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\t\t// Support: IE<=11+, Firefox<=30+ (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tif ( elem.ownerDocument.defaultView.opener ) {\n\t\t\treturn elem.ownerDocument.defaultView.getComputedStyle( elem, null );\n\t\t}\n\n\t\treturn window.getComputedStyle( elem, null );\n\t};\n\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// Support: IE9\n\t// getPropertyValue is only needed for .css('filter') (#12537)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\t}\n\n\tif ( computed ) {\n\n\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// Support: iOS < 6\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels\n\t\t// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\n\t\tif ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\t\t// Support: IE\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn (this.get = hookFn).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\n(function() {\n\tvar pixelPositionVal, boxSizingReliableVal,\n\t\tdocElem = document.documentElement,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE9-11+\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tcontainer.style.cssText = \"border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;\" +\n\t\t\"position:absolute\";\n\tcontainer.appendChild( div );\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computePixelPositionAndBoxSizingReliable() {\n\t\tdiv.style.cssText =\n\t\t\t// Support: Firefox<29, Android 2.3\n\t\t\t// Vendor-prefix box-sizing\n\t\t\t\"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;\" +\n\t\t\t\"box-sizing:border-box;display:block;margin-top:1%;top:1%;\" +\n\t\t\t\"border:1px;padding:1px;width:4px;position:absolute\";\n\t\tdiv.innerHTML = \"\";\n\t\tdocElem.appendChild( container );\n\n\t\tvar divStyle = window.getComputedStyle( div, null );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\t\tboxSizingReliableVal = divStyle.width === \"4px\";\n\n\t\tdocElem.removeChild( container );\n\t}\n\n\t// Support: node.js jsdom\n\t// Don't assume that getComputedStyle is a property of the global object\n\tif ( window.getComputedStyle ) {\n\t\tjQuery.extend( support, {\n\t\t\tpixelPosition: function() {\n\n\t\t\t\t// This test is executed only once but we still do memoizing\n\t\t\t\t// since we can use the boxSizingReliable pre-computing.\n\t\t\t\t// No need to check if the test was already performed, though.\n\t\t\t\tcomputePixelPositionAndBoxSizingReliable();\n\t\t\t\treturn pixelPositionVal;\n\t\t\t},\n\t\t\tboxSizingReliable: function() {\n\t\t\t\tif ( boxSizingReliableVal == null ) {\n\t\t\t\t\tcomputePixelPositionAndBoxSizingReliable();\n\t\t\t\t}\n\t\t\t\treturn boxSizingReliableVal;\n\t\t\t},\n\t\t\treliableMarginRight: function() {\n\n\t\t\t\t// Support: Android 2.3\n\t\t\t\t// Check if div with explicit width and no margin-right incorrectly\n\t\t\t\t// gets computed margin-right based on width of container. (#3333)\n\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t\t// This support function is only executed once so no memoizing is needed.\n\t\t\t\tvar ret,\n\t\t\t\t\tmarginDiv = div.appendChild( document.createElement( \"div\" ) );\n\n\t\t\t\t// Reset CSS: box-sizing; display; margin; border; padding\n\t\t\t\tmarginDiv.style.cssText = div.style.cssText =\n\t\t\t\t\t// Support: Firefox<29, Android 2.3\n\t\t\t\t\t// Vendor-prefix box-sizing\n\t\t\t\t\t\"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;\" +\n\t\t\t\t\t\"box-sizing:content-box;display:block;margin:0;border:0;padding:0\";\n\t\t\t\tmarginDiv.style.marginRight = marginDiv.style.width = \"0\";\n\t\t\t\tdiv.style.width = \"1px\";\n\t\t\t\tdocElem.appendChild( container );\n\n\t\t\t\tret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );\n\n\t\t\t\tdocElem.removeChild( container );\n\t\t\t\tdiv.removeChild( marginDiv );\n\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t});\n\t}\n})();\n\n\n// A method for quickly swapping in/out CSS properties to get correct calculations.\njQuery.swap = function( elem, options, callback, args ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.apply( elem, args || [] );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar\n\t// Swappable if display is none or starts with table except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trnumsplit = new RegExp( \"^(\" + pnum + \")(.*)$\", \"i\" ),\n\trrelNum = new RegExp( \"^([+-])=(\" + pnum + \")\", \"i\" ),\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t},\n\n\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ];\n\n// Return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( style, name ) {\n\n\t// Shortcut for names that are not vendor prefixed\n\tif ( name in style ) {\n\t\treturn name;\n\t}\n\n\t// Check for vendor prefixed names\n\tvar capName = name[0].toUpperCase() + name.slice(1),\n\t\torigName = name,\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in style ) {\n\t\t\treturn name;\n\t\t}\n\t}\n\n\treturn origName;\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\tvar matches = rnumsplit.exec( value );\n\treturn matches ?\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\tvar i = extra === ( isBorderBox ? \"border\" : \"content\" ) ?\n\t\t// If we already have the right measurement, avoid augmentation\n\t\t4 :\n\t\t// Otherwise initialize for horizontal or vertical properties\n\t\tname === \"width\" ? 1 : 0,\n\n\t\tval = 0;\n\n\tfor ( ; i < 4; i += 2 ) {\n\t\t// Both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\tif ( isBorderBox ) {\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// At this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t} else {\n\t\t\t// At this point, extra isn't content, so add padding\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// At this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property, which is equivalent to the border-box value\n\tvar valueIsBorderBox = true,\n\t\tval = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\tstyles = getStyles( elem ),\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t// Some non-html elements return undefined for offsetWidth, so check for null/undefined\n\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n\tif ( val <= 0 || val == null ) {\n\t\t// Fall back to computed then uncomputed css if necessary\n\t\tval = curCSS( elem, name, styles );\n\t\tif ( val < 0 || val == null ) {\n\t\t\tval = elem.style[ name ];\n\t\t}\n\n\t\t// Computed unit is not pixels. Stop here and return.\n\t\tif ( rnumnonpx.test(val) ) {\n\t\t\treturn val;\n\t\t}\n\n\t\t// Check for style in case a browser which returns unreliable values\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\t\tvalueIsBorderBox = isBorderBox &&\n\t\t\t( support.boxSizingReliable() || val === elem.style[ name ] );\n\n\t\t// Normalize \"\", auto, and prepare for extra\n\t\tval = parseFloat( val ) || 0;\n\t}\n\n\t// Use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles\n\t\t)\n\t) + \"px\";\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem, hidden,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tvalues[ index ] = data_priv.get( elem, \"olddisplay\" );\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t// being hidden by cascaded rules or not\n\t\t\tif ( !values[ index ] && display === \"none\" ) {\n\t\t\t\telem.style.display = \"\";\n\t\t\t}\n\n\t\t\t// Set elements which have been overridden with display: none\n\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t// for such an element\n\t\t\tif ( elem.style.display === \"\" && isHidden( elem ) ) {\n\t\t\t\tvalues[ index ] = data_priv.access( elem, \"olddisplay\", defaultDisplay(elem.nodeName) );\n\t\t\t}\n\t\t} else {\n\t\t\thidden = isHidden( elem );\n\n\t\t\tif ( display !== \"none\" || !hidden ) {\n\t\t\t\tdata_priv.set( elem, \"olddisplay\", hidden ? display : jQuery.css( elem, \"display\" ) );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of most of the elements in a second loop\n\t// to avoid the constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( !show || elem.style.display === \"none\" || elem.style.display === \"\" ) {\n\t\t\telem.style.display = show ? values[ index ] || \"\" : \"none\";\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.extend({\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t\"float\": \"cssFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style;\n\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n\t\t\t\tvalue = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"px\";\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {\n\t\t\t\tstyle[ name ] = value;\n\t\t\t}\n\n\t\t} else {\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = jQuery.camelCase( name );\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || jQuery.isNumeric( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t}\n});\n\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) && elem.offsetWidth === 0 ?\n\t\t\t\t\tjQuery.swap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t}) :\n\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar styles = extra && getStyles( elem );\n\t\t\treturn setPositiveNumber( elem, value, extra ?\n\t\t\t\taugmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\t\tstyles\n\t\t\t\t) : 0\n\t\t\t);\n\t\t}\n\t};\n});\n\n// Support: Android 2.3\njQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" },\n\t\t\t\tcurCSS, [ elem, \"marginRight\" ] );\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each({\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split(\" \") : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n});\n\njQuery.fn.extend({\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( jQuery.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t},\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( isHidden( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t});\n\t}\n});\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || \"swing\";\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\tif ( tween.elem[ tween.prop ] != null &&\n\t\t\t\t(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE9\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t}\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back Compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" ),\n\trrun = /queueHooks$/,\n\tanimationPrefilters = [ defaultPrefilter ],\n\ttweeners = {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value ),\n\t\t\t\ttarget = tween.cur(),\n\t\t\t\tparts = rfxnum.exec( value ),\n\t\t\t\tunit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t\t\t// Starting value computation is required for potential unit mismatches\n\t\t\t\tstart = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +target ) &&\n\t\t\t\t\trfxnum.exec( jQuery.css( tween.elem, prop ) ),\n\t\t\t\tscale = 1,\n\t\t\t\tmaxIterations = 20;\n\n\t\t\tif ( start && start[ 3 ] !== unit ) {\n\t\t\t\t// Trust units reported by jQuery.css\n\t\t\t\tunit = unit || start[ 3 ];\n\n\t\t\t\t// Make sure we update the tween properties later on\n\t\t\t\tparts = parts || [];\n\n\t\t\t\t// Iteratively approximate from a nonzero starting point\n\t\t\t\tstart = +target || 1;\n\n\t\t\t\tdo {\n\t\t\t\t\t// If previous iteration zeroed out, double until we get *something*.\n\t\t\t\t\t// Use string for doubling so we don't accidentally see scale as unchanged below\n\t\t\t\t\tscale = scale || \".5\";\n\n\t\t\t\t\t// Adjust and apply\n\t\t\t\t\tstart = start / scale;\n\t\t\t\t\tjQuery.style( tween.elem, prop, start + unit );\n\n\t\t\t\t// Update scale, tolerating zero or NaN from tween.cur(),\n\t\t\t\t// break the loop if scale is unchanged or perfect, or if we've just had enough\n\t\t\t\t} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );\n\t\t\t}\n\n\t\t\t// Update tween properties\n\t\t\tif ( parts ) {\n\t\t\t\tstart = tween.start = +start || +target || 0;\n\t\t\t\ttween.unit = unit;\n\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\ttween.end = parts[ 1 ] ?\n\t\t\t\t\tstart + ( parts[ 1 ] + 1 ) * parts[ 2 ] :\n\t\t\t\t\t+parts[ 2 ];\n\t\t\t}\n\n\t\t\treturn tween;\n\t\t} ]\n\t};\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\tsetTimeout(function() {\n\t\tfxNow = undefined;\n\t});\n\treturn ( fxNow = jQuery.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4 ; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( tweeners[ prop ] || [] ).concat( tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( (tween = collection[ index ].call( animation, prop, value )) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\t/* jshint validthis: true */\n\tvar prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHidden( elem ),\n\t\tdataShow = data_priv.get( elem, \"fxshow\" );\n\n\t// Handle queue: false promises\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always(function() {\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always(function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t// Height/width overflow pass\n\tif ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\n\t\t// Make sure that nothing sneaks out\n\t\t// Record all 3 overflow attributes because IE9-10 do not\n\t\t// change the overflow attribute when overflowX and\n\t\t// overflowY are set to the same value\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Set display property to inline-block for height/width\n\t\t// animations on inline elements that are having width/height animated\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\n\t\t// Test default display if display is currently \"none\"\n\t\tcheckDisplay = display === \"none\" ?\n\t\t\tdata_priv.get( elem, \"olddisplay\" ) || defaultDisplay( elem.nodeName ) : display;\n\n\t\tif ( checkDisplay === \"inline\" && jQuery.css( elem, \"float\" ) === \"none\" ) {\n\t\t\tstyle.display = \"inline-block\";\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always(function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t});\n\t}\n\n\t// show/hide pass\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.exec( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\n\t\t// Any non-fx value stops us from restoring the original display value\n\t\t} else {\n\t\t\tdisplay = undefined;\n\t\t}\n\t}\n\n\tif ( !jQuery.isEmptyObject( orig ) ) {\n\t\tif ( dataShow ) {\n\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\thidden = dataShow.hidden;\n\t\t\t}\n\t\t} else {\n\t\t\tdataShow = data_priv.access( elem, \"fxshow\", {} );\n\t\t}\n\n\t\t// Store state if its toggle - enables .stop().toggle() to \"reverse\"\n\t\tif ( toggle ) {\n\t\t\tdataShow.hidden = !hidden;\n\t\t}\n\t\tif ( hidden ) {\n\t\t\tjQuery( elem ).show();\n\t\t} else {\n\t\t\tanim.done(function() {\n\t\t\t\tjQuery( elem ).hide();\n\t\t\t});\n\t\t}\n\t\tanim.done(function() {\n\t\t\tvar prop;\n\n\t\t\tdata_priv.remove( elem, \"fxshow\" );\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t}\n\t\t});\n\t\tfor ( prop in orig ) {\n\t\t\ttween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\n\t\t\tif ( !( prop in dataShow ) ) {\n\t\t\t\tdataShow[ prop ] = tween.start;\n\t\t\t\tif ( hidden ) {\n\t\t\t\t\ttween.end = tween.start;\n\t\t\t\t\ttween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t// If this is a noop like .hide().hide(), restore an overwritten display value\n\t} else if ( (display === \"none\" ? defaultDisplay( elem.nodeName ) : display) === \"inline\" ) {\n\t\tstyle.display = display;\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( jQuery.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = animationPrefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t}),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\t\t\t\t// Support: Android 2.3\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ]);\n\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t} else {\n\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tanimation = deferred.promise({\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, { specialEasing: {} }, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length ; index++ ) {\n\t\tresult = animationPrefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t})\n\t);\n\n\t// attach callbacks from options\n\treturn animation.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.split(\" \");\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length ; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\ttweeners[ prop ] = tweeners[ prop ] || [];\n\t\t\ttweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tanimationPrefilters.unshift( callback );\n\t\t} else {\n\t\t\tanimationPrefilters.push( callback );\n\t\t}\n\t}\n});\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend({\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHidden ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate({ opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || data_priv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = data_priv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tvar index,\n\t\t\t\tdata = data_priv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t});\n\t}\n});\n\njQuery.each([ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n});\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx(\"show\"),\n\tslideUp: genFx(\"hide\"),\n\tslideToggle: genFx(\"toggle\"),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n});\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\t\t// Checks the timer has not already been removed\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tif ( timer() ) {\n\t\tjQuery.fx.start();\n\t} else {\n\t\tjQuery.timers.pop();\n\t}\n};\n\njQuery.fx.interval = 13;\n\njQuery.fx.start = function() {\n\tif ( !timerId ) {\n\t\ttimerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.stop = function() {\n\tclearInterval( timerId );\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\tclearTimeout( timeout );\n\t\t};\n\t});\n};\n\n\n(function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: iOS<=5.1, Android<=4.2+\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE<=11+\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: Android<=2.3\n\t// Options inside disabled selects are incorrectly marked as disabled\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Support: IE<=11+\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n})();\n\n\nvar nodeHook, boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tattr: function( elem, name, value ) {\n\t\tvar hooks, ret,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set attributes on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === strundefined ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// All attributes are lowercase\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\n\t\t\t} else if ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else if ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\treturn ret;\n\n\t\t} else {\n\t\t\tret = jQuery.find.attr( elem, name );\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn ret == null ?\n\t\t\t\tundefined :\n\t\t\t\tret;\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name, propName,\n\t\t\ti = 0,\n\t\t\tattrNames = value && value.match( rnotwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( (name = attrNames[i++]) ) {\n\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\n\t\t\t\t// Boolean attributes get special treatment (#10870)\n\t\t\t\tif ( jQuery.expr.match.bool.test( name ) ) {\n\t\t\t\t\t// Set corresponding property to false\n\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t}\n\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tjQuery.nodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle;\n\t\tif ( !isXML ) {\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ name ];\n\t\t\tattrHandle[ name ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tname.toLowerCase() :\n\t\t\t\tnull;\n\t\t\tattrHandle[ name ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n});\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i;\n\njQuery.fn.extend({\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t},\n\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\tif ( notxml ) {\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\treturn hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?\n\t\t\t\tret :\n\t\t\t\t( elem[ name ] = value );\n\n\t\t} else {\n\t\t\treturn hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ?\n\t\t\t\tret :\n\t\t\t\telem[ name ];\n\t\t}\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\treturn elem.hasAttribute( \"tabindex\" ) || rfocusable.test( elem.nodeName ) || elem.href ?\n\t\t\t\t\telem.tabIndex :\n\t\t\t\t\t-1;\n\t\t\t}\n\t\t}\n\t}\n});\n\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t};\n}\n\njQuery.each([\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n});\n\n\n\n\nvar rclass = /[\\t\\r\\n\\f]/g;\n\njQuery.fn.extend({\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j, finalValue,\n\t\t\tproceed = typeof value === \"string\" && value,\n\t\t\ti = 0,\n\t\t\tlen = this.length;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\n\t\tif ( proceed ) {\n\t\t\t// The disjunction here is for better compressibility (see removeClass)\n\t\t\tclasses = ( value || \"\" ).match( rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\" \"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = jQuery.trim( cur );\n\t\t\t\t\tif ( elem.className !== finalValue ) {\n\t\t\t\t\t\telem.className = finalValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j, finalValue,\n\t\t\tproceed = arguments.length === 0 || typeof value === \"string\" && value,\n\t\t\ti = 0,\n\t\t\tlen = this.length;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\t\tif ( proceed ) {\n\t\t\tclasses = ( value || \"\" ).match( rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\"\"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) >= 0 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = value ? jQuery.trim( cur ) : \"\";\n\t\t\t\t\tif ( elem.className !== finalValue ) {\n\t\t\t\t\t\telem.className = finalValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value;\n\n\t\tif ( typeof stateVal === \"boolean\" && type === \"string\" ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// Toggle individual class names\n\t\t\t\tvar className,\n\t\t\t\t\ti = 0,\n\t\t\t\t\tself = jQuery( this ),\n\t\t\t\t\tclassNames = value.match( rnotwhite ) || [];\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( type === strundefined || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tdata_priv.set( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tthis.className = this.className || value === false ? \"\" : data_priv.get( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \",\n\t\t\ti = 0,\n\t\t\tl = this.length;\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) >= 0 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n});\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend({\n\tval: function( value ) {\n\t\tvar hooks, ret, isFunction,\n\t\t\telem = this[0];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\t\t\t\t\t// Handle most common string cases\n\t\t\t\t\tret.replace(rreturn, \"\") :\n\t\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each(function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\t\t\t\t\t// Support: IE10-11+\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\tjQuery.trim( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\" || index < 0,\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length,\n\t\t\t\t\ti = index < 0 ?\n\t\t\t\t\t\tmax :\n\t\t\t\t\t\tone ? index : 0;\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// IE6-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t( support.optDisabled ? !option.disabled : option.getAttribute( \"disabled\" ) === null ) &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\t\t\t\t\tif ( (option.selected = jQuery.inArray( option.value, values ) >= 0) ) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Radios and checkboxes getter/setter\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t};\n\t}\n});\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n});\n\njQuery.fn.extend({\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t},\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ? this.off( selector, \"**\" ) : this.off( types, selector || \"**\", fn );\n\t}\n});\n\n\nvar nonce = jQuery.now();\n\nvar rquery = (/\\?/);\n\n\n\n// Support: Android 2.3\n// Workaround failure to string-cast null input\njQuery.parseJSON = function( data ) {\n\treturn JSON.parse( data + \"\" );\n};\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, tmp;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE9\n\ttry {\n\t\ttmp = new DOMParser();\n\t\txml = tmp.parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trhash = /#.*$/,\n\trts = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trurl = /^([\\w.+-]+:)(?:\\/\\/(?:[^\\/?#]*@|)([^\\/?#:]*)(?::(\\d+)|)|)/,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Document location\n\tajaxLocation = window.location.href,\n\n\t// Segment location into parts\n\tajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( (dataType = dataTypes[i++]) ) {\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[0] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t});\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader(\"Content-Type\");\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s[ \"throws\" ] ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn { state: \"parsererror\", error: conv ? e : \"No conversion from \" + prev + \" to \" + current };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend({\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /xml/,\n\t\t\thtml: /html/,\n\t\t\tjson: /json/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\t\t\t// Cross-domain detection vars\n\t\t\tparts,\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\t\t\t// Loop variable\n\t\t\ti,\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks(\"once memory\"),\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( (match = rheaders.exec( responseHeadersString )) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\t// Lazy-add the new callback in a way that preserves old ones\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR ).complete = completeDeferred.add;\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || ajaxLocation ) + \"\" ).replace( rhash, \"\" )\n\t\t\t.replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().match( rnotwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when we have a protocol:host:port mismatch\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) !==\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger(\"ajaxStart\");\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\tcacheURL = s.url;\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\tcacheURL = ( s.url += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data );\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\ts.url = rts.test( cacheURL ) ?\n\n\t\t\t\t\t// If there is already a '_' parameter, set its value\n\t\t\t\t\tcacheURL.replace( rts, \"$1_=\" + nonce++ ) :\n\n\t\t\t\t\t// Otherwise add one to the end\n\t\t\t\t\tcacheURL + ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + nonce++;\n\t\t\t}\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = setTimeout(function() {\n\t\t\t\t\tjqXHR.abort(\"timeout\");\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\tclearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"Last-Modified\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"etag\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger(\"ajaxStop\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t});\n\t};\n});\n\n\njQuery._evalUrl = function( url ) {\n\treturn jQuery.ajax({\n\t\turl: url,\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tasync: false,\n\t\tglobal: false,\n\t\t\"throws\": true\n\t});\n};\n\n\njQuery.fn.extend({\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[ 0 ] ) {\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each(function( i ) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t}\n});\n\n\njQuery.expr.filters.hidden = function( elem ) {\n\t// Support: Opera <= 12.12\n\t// Opera reports offsetWidths and offsetHeights less than zero on some elements\n\treturn elem.offsetWidth <= 0 && elem.offsetHeight <= 0;\n};\njQuery.expr.filters.visible = function( elem ) {\n\treturn !jQuery.expr.filters.hidden( elem );\n};\n\n\n\n\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\n\t\t\t}\n\t\t});\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, value ) {\n\t\t\t// If value is a function, invoke it and return its value\n\t\t\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t};\n\n\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\tif ( traditional === undefined ) {\n\t\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t});\n\n\t} else {\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" ).replace( r20, \"+\" );\n};\n\njQuery.fn.extend({\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map(function() {\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t})\n\t\t.filter(function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t})\n\t\t.map(function( i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val ) {\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t}).get();\n\t}\n});\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new XMLHttpRequest();\n\t} catch( e ) {}\n};\n\nvar xhrId = 0,\n\txhrCallbacks = {},\n\txhrSuccessStatus = {\n\t\t// file protocol always yields status code 0, assume 200\n\t\t0: 200,\n\t\t// Support: IE9\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\n// Support: IE9\n// Open requests must be manually aborted on unload (#5280)\n// See https://support.microsoft.com/kb/2856746 for more info\nif ( window.attachEvent ) {\n\twindow.attachEvent( \"onunload\", function() {\n\t\tfor ( var key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]();\n\t\t}\n\t});\n}\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport(function( options ) {\n\tvar callback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr(),\n\t\t\t\t\tid = ++xhrId;\n\n\t\t\t\txhr.open( options.type, options.url, options.async, options.username, options.password );\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\theaders[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tdelete xhrCallbacks[ id ];\n\t\t\t\t\t\t\tcallback = xhr.onload = xhr.onerror = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\t// file: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\t\t\t\t\t\t\t\t\t// Support: IE9\n\t\t\t\t\t\t\t\t\t// Accessing binary-data responseText throws an exception\n\t\t\t\t\t\t\t\t\t// (#11426)\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText === \"string\" ? {\n\t\t\t\t\t\t\t\t\t\ttext: xhr.responseText\n\t\t\t\t\t\t\t\t\t} : undefined,\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\txhr.onerror = callback(\"error\");\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = xhrCallbacks[ id ] = callback(\"abort\");\n\n\t\t\t\ttry {\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\n\n\n\n\n// Install script dataType\njQuery.ajaxSetup({\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /(?:java|ecma)script/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n});\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery(\"<script>\").prop({\n\t\t\t\t\tasync: true,\n\t\t\t\t\tcharset: s.scriptCharset,\n\t\t\t\t\tsrc: s.url\n\t\t\t\t}).on(\n\t\t\t\t\t\"load error\",\n\t\t\t\t\tcallback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup({\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" && !( s.contentType || \"\" ).indexOf(\"application/x-www-form-urlencoded\") && rjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[\"script json\"] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always(function() {\n\t\t\t// Restore preexisting value\n\t\t\twindow[ callbackName ] = overwritten;\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\t\t\t\t// make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t});\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n});\n\n\n\n\n// data: string of html\n// context (optional): If specified, the fragment will be created in this context, defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\tcontext = context || document;\n\n\tvar parsed = rsingleTag.exec( data ),\n\t\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[1] ) ];\n\t}\n\n\tparsed = jQuery.buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n// Keep a copy of the old load method\nvar _load = jQuery.fn.load;\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tif ( typeof url !== \"string\" && _load ) {\n\t\treturn _load.apply( this, arguments );\n\t}\n\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf(\" \");\n\n\tif ( off >= 0 ) {\n\t\tselector = jQuery.trim( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax({\n\t\t\turl: url,\n\n\t\t\t// if \"type\" variable is undefined, then \"GET\" method will be used\n\t\t\ttype: type,\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t}).done(function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery(\"<div>\").append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t}).complete( callback && function( jqXHR, status ) {\n\t\t\tself.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t});\n\t}\n\n\treturn this;\n};\n\n\n\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [ \"ajaxStart\", \"ajaxStop\", \"ajaxComplete\", \"ajaxError\", \"ajaxSuccess\", \"ajaxSend\" ], function( i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n});\n\n\n\n\njQuery.expr.filters.animated = function( elem ) {\n\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t}).length;\n};\n\n\n\n\nvar docElem = window.document.documentElement;\n\n/**\n * Gets a window from an element\n */\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;\n}\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf(\"auto\") > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\t\t\toptions = options.call( elem, i, curOffset );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend({\n\toffset: function( options ) {\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each(function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t});\n\t\t}\n\n\t\tvar docElem, win,\n\t\t\telem = this[ 0 ],\n\t\t\tbox = { top: 0, left: 0 },\n\t\t\tdoc = elem && elem.ownerDocument;\n\n\t\tif ( !doc ) {\n\t\t\treturn;\n\t\t}\n\n\t\tdocElem = doc.documentElement;\n\n\t\t// Make sure it's not a disconnected DOM node\n\t\tif ( !jQuery.contains( docElem, elem ) ) {\n\t\t\treturn box;\n\t\t}\n\n\t\t// Support: BlackBerry 5, iOS 3 (original iPhone)\n\t\t// If we don't have gBCR, just use 0,0 rather than error\n\t\tif ( typeof elem.getBoundingClientRect !== strundefined ) {\n\t\t\tbox = elem.getBoundingClientRect();\n\t\t}\n\t\twin = getWindow( doc );\n\t\treturn {\n\t\t\ttop: box.top + win.pageYOffset - docElem.clientTop,\n\t\t\tleft: box.left + win.pageXOffset - docElem.clientLeft\n\t\t};\n\t},\n\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\t\t\t// Assume getBoundingClientRect is there when computed position is fixed\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\t// Get *real* offsetParent\n\t\t\toffsetParent = this.offsetParent();\n\n\t\t\t// Get correct offsets\n\t\t\toffset = this.offset();\n\t\t\tif ( !jQuery.nodeName( offsetParent[ 0 ], \"html\" ) ) {\n\t\t\t\tparentOffset = offsetParent.offset();\n\t\t\t}\n\n\t\t\t// Add offsetParent borders\n\t\t\tparentOffset.top += jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true );\n\t\t\tparentOffset.left += jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true );\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || docElem;\n\n\t\t\twhile ( offsetParent && ( !jQuery.nodeName( offsetParent, \"html\" ) && jQuery.css( offsetParent, \"position\" ) === \"static\" ) ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || docElem;\n\t\t});\n\t}\n});\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : window.pageXOffset,\n\t\t\t\t\ttop ? val : window.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length, null );\n\t};\n});\n\n// Support: Safari<7+, Chrome<37+\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://code.google.com/p/chromium/issues/detail?id=229280\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n});\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name }, function( defaultExtra, funcName ) {\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t\t\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\n\t\t\t\t\t// isn't a whole lot we can do. See pull request at this URL for discussion:\n\t\t\t\t\t// https://github.com/jquery/jquery/pull/764\n\t\t\t\t\treturn elem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable, null );\n\t\t};\n\t});\n});\n\n\n// The number of elements contained in the matched element set\njQuery.fn.size = function() {\n\treturn this.length;\n};\n\njQuery.fn.andSelf = jQuery.fn.addBack;\n\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t});\n}\n\n\n\n\nvar\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( typeof noGlobal === strundefined ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n\n}));\n"
  },
  {
    "path": "bower_components/jquery/src/ajax/jsonp.js",
    "content": "define([\n\t\"../core\",\n\t\"./var/nonce\",\n\t\"./var/rquery\",\n\t\"../ajax\"\n], function( jQuery, nonce, rquery ) {\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup({\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" && !( s.contentType || \"\" ).indexOf(\"application/x-www-form-urlencoded\") && rjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[\"script json\"] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always(function() {\n\t\t\t// Restore preexisting value\n\t\t\twindow[ callbackName ] = overwritten;\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\t\t\t\t// make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t});\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n});\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/ajax/load.js",
    "content": "define([\n\t\"../core\",\n\t\"../core/parseHTML\",\n\t\"../ajax\",\n\t\"../traversing\",\n\t\"../manipulation\",\n\t\"../selector\",\n\t// Optional event/alias dependency\n\t\"../event/alias\"\n], function( jQuery ) {\n\n// Keep a copy of the old load method\nvar _load = jQuery.fn.load;\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tif ( typeof url !== \"string\" && _load ) {\n\t\treturn _load.apply( this, arguments );\n\t}\n\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf(\" \");\n\n\tif ( off >= 0 ) {\n\t\tselector = jQuery.trim( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax({\n\t\t\turl: url,\n\n\t\t\t// if \"type\" variable is undefined, then \"GET\" method will be used\n\t\t\ttype: type,\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t}).done(function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery(\"<div>\").append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t}).complete( callback && function( jqXHR, status ) {\n\t\t\tself.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t});\n\t}\n\n\treturn this;\n};\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/ajax/parseJSON.js",
    "content": "define([\n\t\"../core\"\n], function( jQuery ) {\n\n// Support: Android 2.3\n// Workaround failure to string-cast null input\njQuery.parseJSON = function( data ) {\n\treturn JSON.parse( data + \"\" );\n};\n\nreturn jQuery.parseJSON;\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/ajax/parseXML.js",
    "content": "define([\n\t\"../core\"\n], function( jQuery ) {\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, tmp;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE9\n\ttry {\n\t\ttmp = new DOMParser();\n\t\txml = tmp.parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\nreturn jQuery.parseXML;\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/ajax/script.js",
    "content": "define([\n\t\"../core\",\n\t\"../ajax\"\n], function( jQuery ) {\n\n// Install script dataType\njQuery.ajaxSetup({\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /(?:java|ecma)script/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n});\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery(\"<script>\").prop({\n\t\t\t\t\tasync: true,\n\t\t\t\t\tcharset: s.scriptCharset,\n\t\t\t\t\tsrc: s.url\n\t\t\t\t}).on(\n\t\t\t\t\t\"load error\",\n\t\t\t\t\tcallback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/ajax/var/nonce.js",
    "content": "define([\n\t\"../../core\"\n], function( jQuery ) {\n\treturn jQuery.now();\n});\n"
  },
  {
    "path": "bower_components/jquery/src/ajax/var/rquery.js",
    "content": "define(function() {\n\treturn (/\\?/);\n});\n"
  },
  {
    "path": "bower_components/jquery/src/ajax/xhr.js",
    "content": "define([\n\t\"../core\",\n\t\"../var/support\",\n\t\"../ajax\"\n], function( jQuery, support ) {\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new XMLHttpRequest();\n\t} catch( e ) {}\n};\n\nvar xhrId = 0,\n\txhrCallbacks = {},\n\txhrSuccessStatus = {\n\t\t// file protocol always yields status code 0, assume 200\n\t\t0: 200,\n\t\t// Support: IE9\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\n// Support: IE9\n// Open requests must be manually aborted on unload (#5280)\n// See https://support.microsoft.com/kb/2856746 for more info\nif ( window.attachEvent ) {\n\twindow.attachEvent( \"onunload\", function() {\n\t\tfor ( var key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]();\n\t\t}\n\t});\n}\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport(function( options ) {\n\tvar callback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr(),\n\t\t\t\t\tid = ++xhrId;\n\n\t\t\t\txhr.open( options.type, options.url, options.async, options.username, options.password );\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\theaders[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tdelete xhrCallbacks[ id ];\n\t\t\t\t\t\t\tcallback = xhr.onload = xhr.onerror = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\t// file: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\t\t\t\t\t\t\t\t\t// Support: IE9\n\t\t\t\t\t\t\t\t\t// Accessing binary-data responseText throws an exception\n\t\t\t\t\t\t\t\t\t// (#11426)\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText === \"string\" ? {\n\t\t\t\t\t\t\t\t\t\ttext: xhr.responseText\n\t\t\t\t\t\t\t\t\t} : undefined,\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\txhr.onerror = callback(\"error\");\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = xhrCallbacks[ id ] = callback(\"abort\");\n\n\t\t\t\ttry {\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/ajax.js",
    "content": "define([\n\t\"./core\",\n\t\"./var/rnotwhite\",\n\t\"./ajax/var/nonce\",\n\t\"./ajax/var/rquery\",\n\t\"./core/init\",\n\t\"./ajax/parseJSON\",\n\t\"./ajax/parseXML\",\n\t\"./deferred\"\n], function( jQuery, rnotwhite, nonce, rquery ) {\n\nvar\n\trhash = /#.*$/,\n\trts = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trurl = /^([\\w.+-]+:)(?:\\/\\/(?:[^\\/?#]*@|)([^\\/?#:]*)(?::(\\d+)|)|)/,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Document location\n\tajaxLocation = window.location.href,\n\n\t// Segment location into parts\n\tajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( (dataType = dataTypes[i++]) ) {\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[0] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t});\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader(\"Content-Type\");\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s[ \"throws\" ] ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn { state: \"parsererror\", error: conv ? e : \"No conversion from \" + prev + \" to \" + current };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend({\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /xml/,\n\t\t\thtml: /html/,\n\t\t\tjson: /json/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\t\t\t// Cross-domain detection vars\n\t\t\tparts,\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\t\t\t// Loop variable\n\t\t\ti,\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks(\"once memory\"),\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( (match = rheaders.exec( responseHeadersString )) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\t// Lazy-add the new callback in a way that preserves old ones\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR ).complete = completeDeferred.add;\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || ajaxLocation ) + \"\" ).replace( rhash, \"\" )\n\t\t\t.replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().match( rnotwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when we have a protocol:host:port mismatch\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) !==\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger(\"ajaxStart\");\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\tcacheURL = s.url;\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\tcacheURL = ( s.url += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data );\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\ts.url = rts.test( cacheURL ) ?\n\n\t\t\t\t\t// If there is already a '_' parameter, set its value\n\t\t\t\t\tcacheURL.replace( rts, \"$1_=\" + nonce++ ) :\n\n\t\t\t\t\t// Otherwise add one to the end\n\t\t\t\t\tcacheURL + ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + nonce++;\n\t\t\t}\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = setTimeout(function() {\n\t\t\t\t\tjqXHR.abort(\"timeout\");\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\tclearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"Last-Modified\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"etag\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger(\"ajaxStop\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t});\n\t};\n});\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/attributes/attr.js",
    "content": "define([\n\t\"../core\",\n\t\"../var/rnotwhite\",\n\t\"../var/strundefined\",\n\t\"../core/access\",\n\t\"./support\",\n\t\"../selector\"\n], function( jQuery, rnotwhite, strundefined, access, support ) {\n\nvar nodeHook, boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tattr: function( elem, name, value ) {\n\t\tvar hooks, ret,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set attributes on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === strundefined ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// All attributes are lowercase\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\n\t\t\t} else if ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else if ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\treturn ret;\n\n\t\t} else {\n\t\t\tret = jQuery.find.attr( elem, name );\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn ret == null ?\n\t\t\t\tundefined :\n\t\t\t\tret;\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name, propName,\n\t\t\ti = 0,\n\t\t\tattrNames = value && value.match( rnotwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( (name = attrNames[i++]) ) {\n\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\n\t\t\t\t// Boolean attributes get special treatment (#10870)\n\t\t\t\tif ( jQuery.expr.match.bool.test( name ) ) {\n\t\t\t\t\t// Set corresponding property to false\n\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t}\n\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tjQuery.nodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle;\n\t\tif ( !isXML ) {\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ name ];\n\t\t\tattrHandle[ name ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tname.toLowerCase() :\n\t\t\t\tnull;\n\t\t\tattrHandle[ name ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n});\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/attributes/classes.js",
    "content": "define([\n\t\"../core\",\n\t\"../var/rnotwhite\",\n\t\"../var/strundefined\",\n\t\"../data/var/data_priv\",\n\t\"../core/init\"\n], function( jQuery, rnotwhite, strundefined, data_priv ) {\n\nvar rclass = /[\\t\\r\\n\\f]/g;\n\njQuery.fn.extend({\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j, finalValue,\n\t\t\tproceed = typeof value === \"string\" && value,\n\t\t\ti = 0,\n\t\t\tlen = this.length;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\n\t\tif ( proceed ) {\n\t\t\t// The disjunction here is for better compressibility (see removeClass)\n\t\t\tclasses = ( value || \"\" ).match( rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\" \"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = jQuery.trim( cur );\n\t\t\t\t\tif ( elem.className !== finalValue ) {\n\t\t\t\t\t\telem.className = finalValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j, finalValue,\n\t\t\tproceed = arguments.length === 0 || typeof value === \"string\" && value,\n\t\t\ti = 0,\n\t\t\tlen = this.length;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\t\tif ( proceed ) {\n\t\t\tclasses = ( value || \"\" ).match( rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\"\"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) >= 0 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = value ? jQuery.trim( cur ) : \"\";\n\t\t\t\t\tif ( elem.className !== finalValue ) {\n\t\t\t\t\t\telem.className = finalValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value;\n\n\t\tif ( typeof stateVal === \"boolean\" && type === \"string\" ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// Toggle individual class names\n\t\t\t\tvar className,\n\t\t\t\t\ti = 0,\n\t\t\t\t\tself = jQuery( this ),\n\t\t\t\t\tclassNames = value.match( rnotwhite ) || [];\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( type === strundefined || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tdata_priv.set( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tthis.className = this.className || value === false ? \"\" : data_priv.get( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \",\n\t\t\ti = 0,\n\t\t\tl = this.length;\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) >= 0 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n});\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/attributes/prop.js",
    "content": "define([\n\t\"../core\",\n\t\"../core/access\",\n\t\"./support\"\n], function( jQuery, access, support ) {\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i;\n\njQuery.fn.extend({\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t},\n\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\tif ( notxml ) {\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\treturn hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?\n\t\t\t\tret :\n\t\t\t\t( elem[ name ] = value );\n\n\t\t} else {\n\t\t\treturn hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ?\n\t\t\t\tret :\n\t\t\t\telem[ name ];\n\t\t}\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\treturn elem.hasAttribute( \"tabindex\" ) || rfocusable.test( elem.nodeName ) || elem.href ?\n\t\t\t\t\telem.tabIndex :\n\t\t\t\t\t-1;\n\t\t\t}\n\t\t}\n\t}\n});\n\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t};\n}\n\njQuery.each([\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n});\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/attributes/support.js",
    "content": "define([\n\t\"../var/support\"\n], function( support ) {\n\n(function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: iOS<=5.1, Android<=4.2+\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE<=11+\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: Android<=2.3\n\t// Options inside disabled selects are incorrectly marked as disabled\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Support: IE<=11+\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n})();\n\nreturn support;\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/attributes/val.js",
    "content": "define([\n\t\"../core\",\n\t\"./support\",\n\t\"../core/init\"\n], function( jQuery, support ) {\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend({\n\tval: function( value ) {\n\t\tvar hooks, ret, isFunction,\n\t\t\telem = this[0];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\t\t\t\t\t// Handle most common string cases\n\t\t\t\t\tret.replace(rreturn, \"\") :\n\t\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each(function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\t\t\t\t\t// Support: IE10-11+\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\tjQuery.trim( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\" || index < 0,\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length,\n\t\t\t\t\ti = index < 0 ?\n\t\t\t\t\t\tmax :\n\t\t\t\t\t\tone ? index : 0;\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// IE6-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t( support.optDisabled ? !option.disabled : option.getAttribute( \"disabled\" ) === null ) &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\t\t\t\t\tif ( (option.selected = jQuery.inArray( option.value, values ) >= 0) ) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Radios and checkboxes getter/setter\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t};\n\t}\n});\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/attributes.js",
    "content": "define([\n\t\"./core\",\n\t\"./attributes/attr\",\n\t\"./attributes/prop\",\n\t\"./attributes/classes\",\n\t\"./attributes/val\"\n], function( jQuery ) {\n\n// Return jQuery for attributes-only inclusion\nreturn jQuery;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/callbacks.js",
    "content": "define([\n\t\"./core\",\n\t\"./var/rnotwhite\"\n], function( jQuery, rnotwhite ) {\n\n// String to Object options format cache\nvar optionsCache = {};\n\n// Convert String-formatted options into Object-formatted ones and store in cache\nfunction createOptions( options ) {\n\tvar object = optionsCache[ options ] = {};\n\tjQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t});\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\t( optionsCache[ options ] || createOptions( options ) ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Last fire value (for non-forgettable lists)\n\t\tmemory,\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\t\t// Flag to know if list is currently firing\n\t\tfiring,\n\t\t// First callback to fire (used internally by add and fireWith)\n\t\tfiringStart,\n\t\t// End of the loop when firing\n\t\tfiringLength,\n\t\t// Index of currently firing callback (modified by remove if needed)\n\t\tfiringIndex,\n\t\t// Actual callback list\n\t\tlist = [],\n\t\t// Stack of fire calls for repeatable lists\n\t\tstack = !options.once && [],\n\t\t// Fire callbacks\n\t\tfire = function( data ) {\n\t\t\tmemory = options.memory && data;\n\t\t\tfired = true;\n\t\t\tfiringIndex = firingStart || 0;\n\t\t\tfiringStart = 0;\n\t\t\tfiringLength = list.length;\n\t\t\tfiring = true;\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\n\t\t\t\tif ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {\n\t\t\t\t\tmemory = false; // To prevent further calls using add\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfiring = false;\n\t\t\tif ( list ) {\n\t\t\t\tif ( stack ) {\n\t\t\t\t\tif ( stack.length ) {\n\t\t\t\t\t\tfire( stack.shift() );\n\t\t\t\t\t}\n\t\t\t\t} else if ( memory ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t} else {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Actual Callbacks object\n\t\tself = {\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\t// First, we save the current length\n\t\t\t\t\tvar start = list.length;\n\t\t\t\t\t(function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tvar type = jQuery.type( arg );\n\t\t\t\t\t\t\tif ( type === \"function\" ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && type !== \"string\" ) {\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})( arguments );\n\t\t\t\t\t// Do we need to add the callbacks to the\n\t\t\t\t\t// current firing batch?\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tfiringLength = list.length;\n\t\t\t\t\t// With memory, if we're not firing then\n\t\t\t\t\t// we should call right away\n\t\t\t\t\t} else if ( memory ) {\n\t\t\t\t\t\tfiringStart = start;\n\t\t\t\t\t\tfire( memory );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\t\tvar index;\n\t\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\t\tlist.splice( index, 1 );\n\t\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\t\t\tif ( index <= firingLength ) {\n\t\t\t\t\t\t\t\t\tfiringLength--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );\n\t\t\t},\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tlist = [];\n\t\t\t\tfiringLength = 0;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Have the list do nothing anymore\n\t\t\tdisable: function() {\n\t\t\t\tlist = stack = memory = undefined;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it disabled?\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\t\t\t// Lock the list in its current state\n\t\t\tlock: function() {\n\t\t\t\tstack = undefined;\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it locked?\n\t\t\tlocked: function() {\n\t\t\t\treturn !stack;\n\t\t\t},\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( list && ( !fired || stack ) ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tstack.push( args );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfire( args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/core/access.js",
    "content": "define([\n\t\"../core\"\n], function( jQuery ) {\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( jQuery.type( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\tjQuery.access( elems, fn, i, key[i], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn chainable ?\n\t\telems :\n\n\t\t// Gets\n\t\tbulk ?\n\t\t\tfn.call( elems ) :\n\t\t\tlen ? fn( elems[0], key ) : emptyGet;\n};\n\nreturn access;\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/core/init.js",
    "content": "// Initialize a jQuery object\ndefine([\n\t\"../core\",\n\t\"./var/rsingleTag\",\n\t\"../traversing/findFilter\"\n], function( jQuery, rsingleTag ) {\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\n\tinit = jQuery.fn.init = function( selector, context ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[0] === \"<\" && selector[ selector.length - 1 ] === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[1],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Support: Blackberry 4.6\n\t\t\t\t\t// gEBID returns nodes no longer in the document (#6963)\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || rootjQuery ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn typeof rootjQuery.ready !== \"undefined\" ?\n\t\t\t\trootjQuery.ready( selector ) :\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\nreturn init;\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/core/parseHTML.js",
    "content": "define([\n\t\"../core\",\n\t\"./var/rsingleTag\",\n\t\"../manipulation\" // buildFragment\n], function( jQuery, rsingleTag ) {\n\n// data: string of html\n// context (optional): If specified, the fragment will be created in this context, defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\tcontext = context || document;\n\n\tvar parsed = rsingleTag.exec( data ),\n\t\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[1] ) ];\n\t}\n\n\tparsed = jQuery.buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\nreturn jQuery.parseHTML;\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/core/ready.js",
    "content": "define([\n\t\"../core\",\n\t\"../core/init\",\n\t\"../deferred\"\n], function( jQuery ) {\n\n// The deferred used on DOM ready\nvar readyList;\n\njQuery.fn.ready = function( fn ) {\n\t// Add the callback\n\tjQuery.ready.promise().done( fn );\n\n\treturn this;\n};\n\njQuery.extend({\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.triggerHandler ) {\n\t\t\tjQuery( document ).triggerHandler( \"ready\" );\n\t\t\tjQuery( document ).off( \"ready\" );\n\t\t}\n\t}\n});\n\n/**\n * The ready event handler and self cleanup method\n */\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed, false );\n\twindow.removeEventListener( \"load\", completed, false );\n\tjQuery.ready();\n}\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called after the browser event has already occurred.\n\t\t// We once tried to use readyState \"interactive\" here, but it caused issues like the one\n\t\t// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\tsetTimeout( jQuery.ready );\n\n\t\t} else {\n\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", completed, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", completed, false );\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n// Kick off the DOM ready check even if the user does not\njQuery.ready.promise();\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/core/var/rsingleTag.js",
    "content": "define(function() {\n\t// Match a standalone tag\n\treturn (/^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/);\n});\n"
  },
  {
    "path": "bower_components/jquery/src/core.js",
    "content": "define([\n\t\"./var/arr\",\n\t\"./var/slice\",\n\t\"./var/concat\",\n\t\"./var/push\",\n\t\"./var/indexOf\",\n\t\"./var/class2type\",\n\t\"./var/toString\",\n\t\"./var/hasOwn\",\n\t\"./var/support\"\n], function( arr, slice, concat, push, indexOf, class2type, toString, hasOwn, support ) {\n\nvar\n\t// Use the correct document accordingly with window argument (sandbox)\n\tdocument = window.document,\n\n\tversion = \"@VERSION\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android<4.1\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t};\n\njQuery.fn = jQuery.prototype = {\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num != null ?\n\n\t\t\t// Return just the one element from the set\n\t\t\t( num < 0 ? this[ num + this.length ] : this[ num ] ) :\n\n\t\t\t// Return all the elements in a clean array\n\t\t\tslice.call( this );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\t\tret.context = this.context;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray,\n\n\tisWindow: function( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\t\t// parseFloat NaNs numeric-cast false positives (null|true|false|\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t// adding 1 corrects loss of precision from parseFloat (#15100)\n\t\treturn !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0;\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\t// Not plain objects:\n\t\t// - Any object or value whose internal [[Class]] property is not \"[object Object]\"\n\t\t// - DOM nodes\n\t\t// - window\n\t\tif ( jQuery.type( obj ) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( obj.constructor &&\n\t\t\t\t!hasOwn.call( obj.constructor.prototype, \"isPrototypeOf\" ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// If the function hasn't returned already, we're confident that\n\t\t// |obj| is a plain object, created by {} or constructed with new Object\n\t\treturn true;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn obj + \"\";\n\t\t}\n\t\t// Support: Android<4.0, iOS<6 (functionish RegExp)\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ toString.call(obj) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\t// Evaluates a script in a global context\n\tglobalEval: function( code ) {\n\t\tvar script,\n\t\t\tindirect = eval;\n\n\t\tcode = jQuery.trim( code );\n\n\t\tif ( code ) {\n\t\t\t// If the code includes a valid, prologue position\n\t\t\t// strict mode pragma, execute code by injecting a\n\t\t\t// script tag into the document.\n\t\t\tif ( code.indexOf(\"use strict\") === 1 ) {\n\t\t\t\tscript = document.createElement(\"script\");\n\t\t\t\tscript.text = code;\n\t\t\t\tdocument.head.appendChild( script ).parentNode.removeChild( script );\n\t\t\t} else {\n\t\t\t// Otherwise, avoid the DOM node creation, insertion\n\t\t\t// and removal by using an indirect global eval\n\t\t\t\tindirect( code );\n\t\t\t}\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Support: IE9-11+\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( obj, callback, args ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = obj.length,\n\t\t\tisArray = isArraylike( obj );\n\n\t\tif ( args ) {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android<4.1\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArraylike( Object(arr) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tisArray = isArraylike( elems ),\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar tmp, args, proxy;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\tnow: Date.now,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n});\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nfunction isArraylike( obj ) {\n\n\t// Support: iOS 8.2 (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = \"length\" in obj && obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( type === \"function\" || jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\tif ( obj.nodeType === 1 && length ) {\n\t\treturn true;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/css/addGetHookIf.js",
    "content": "define(function() {\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn (this.get = hookFn).apply( this, arguments );\n\t\t}\n\t};\n}\n\nreturn addGetHookIf;\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/css/curCSS.js",
    "content": "define([\n\t\"../core\",\n\t\"./var/rnumnonpx\",\n\t\"./var/rmargin\",\n\t\"./var/getStyles\",\n\t\"../selector\" // contains\n], function( jQuery, rnumnonpx, rmargin, getStyles ) {\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// Support: IE9\n\t// getPropertyValue is only needed for .css('filter') (#12537)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\t}\n\n\tif ( computed ) {\n\n\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// Support: iOS < 6\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels\n\t\t// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\n\t\tif ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\t\t// Support: IE\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\nreturn curCSS;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/css/defaultDisplay.js",
    "content": "define([\n\t\"../core\",\n\t\"../manipulation\" // appendTo\n], function( jQuery ) {\n\nvar iframe,\n\telemdisplay = {};\n\n/**\n * Retrieve the actual display of a element\n * @param {String} name nodeName of the element\n * @param {Object} doc Document object\n */\n// Called only from within defaultDisplay\nfunction actualDisplay( name, doc ) {\n\tvar style,\n\t\telem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\n\t\t// getDefaultComputedStyle might be reliably used only on attached element\n\t\tdisplay = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?\n\n\t\t\t// Use of this method is a temporary fix (more like optimization) until something better comes along,\n\t\t\t// since it was removed from specification and supported only in FF\n\t\t\tstyle.display : jQuery.css( elem[ 0 ], \"display\" );\n\n\t// We don't have any data stored on the element,\n\t// so use \"detach\" method as fast way to get rid of the element\n\telem.detach();\n\n\treturn display;\n}\n\n/**\n * Try to determine the default display value of an element\n * @param {String} nodeName\n */\nfunction defaultDisplay( nodeName ) {\n\tvar doc = document,\n\t\tdisplay = elemdisplay[ nodeName ];\n\n\tif ( !display ) {\n\t\tdisplay = actualDisplay( nodeName, doc );\n\n\t\t// If the simple way fails, read from inside an iframe\n\t\tif ( display === \"none\" || !display ) {\n\n\t\t\t// Use the already-created iframe if possible\n\t\t\tiframe = (iframe || jQuery( \"<iframe frameborder='0' width='0' height='0'/>\" )).appendTo( doc.documentElement );\n\n\t\t\t// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse\n\t\t\tdoc = iframe[ 0 ].contentDocument;\n\n\t\t\t// Support: IE\n\t\t\tdoc.write();\n\t\t\tdoc.close();\n\n\t\t\tdisplay = actualDisplay( nodeName, doc );\n\t\t\tiframe.detach();\n\t\t}\n\n\t\t// Store the correct default display\n\t\telemdisplay[ nodeName ] = display;\n\t}\n\n\treturn display;\n}\n\nreturn defaultDisplay;\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/css/hiddenVisibleSelectors.js",
    "content": "define([\n\t\"../core\",\n\t\"../selector\"\n], function( jQuery ) {\n\njQuery.expr.filters.hidden = function( elem ) {\n\t// Support: Opera <= 12.12\n\t// Opera reports offsetWidths and offsetHeights less than zero on some elements\n\treturn elem.offsetWidth <= 0 && elem.offsetHeight <= 0;\n};\njQuery.expr.filters.visible = function( elem ) {\n\treturn !jQuery.expr.filters.hidden( elem );\n};\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/css/support.js",
    "content": "define([\n\t\"../core\",\n\t\"../var/support\"\n], function( jQuery, support ) {\n\n(function() {\n\tvar pixelPositionVal, boxSizingReliableVal,\n\t\tdocElem = document.documentElement,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE9-11+\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tcontainer.style.cssText = \"border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;\" +\n\t\t\"position:absolute\";\n\tcontainer.appendChild( div );\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computePixelPositionAndBoxSizingReliable() {\n\t\tdiv.style.cssText =\n\t\t\t// Support: Firefox<29, Android 2.3\n\t\t\t// Vendor-prefix box-sizing\n\t\t\t\"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;\" +\n\t\t\t\"box-sizing:border-box;display:block;margin-top:1%;top:1%;\" +\n\t\t\t\"border:1px;padding:1px;width:4px;position:absolute\";\n\t\tdiv.innerHTML = \"\";\n\t\tdocElem.appendChild( container );\n\n\t\tvar divStyle = window.getComputedStyle( div, null );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\t\tboxSizingReliableVal = divStyle.width === \"4px\";\n\n\t\tdocElem.removeChild( container );\n\t}\n\n\t// Support: node.js jsdom\n\t// Don't assume that getComputedStyle is a property of the global object\n\tif ( window.getComputedStyle ) {\n\t\tjQuery.extend( support, {\n\t\t\tpixelPosition: function() {\n\n\t\t\t\t// This test is executed only once but we still do memoizing\n\t\t\t\t// since we can use the boxSizingReliable pre-computing.\n\t\t\t\t// No need to check if the test was already performed, though.\n\t\t\t\tcomputePixelPositionAndBoxSizingReliable();\n\t\t\t\treturn pixelPositionVal;\n\t\t\t},\n\t\t\tboxSizingReliable: function() {\n\t\t\t\tif ( boxSizingReliableVal == null ) {\n\t\t\t\t\tcomputePixelPositionAndBoxSizingReliable();\n\t\t\t\t}\n\t\t\t\treturn boxSizingReliableVal;\n\t\t\t},\n\t\t\treliableMarginRight: function() {\n\n\t\t\t\t// Support: Android 2.3\n\t\t\t\t// Check if div with explicit width and no margin-right incorrectly\n\t\t\t\t// gets computed margin-right based on width of container. (#3333)\n\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t\t// This support function is only executed once so no memoizing is needed.\n\t\t\t\tvar ret,\n\t\t\t\t\tmarginDiv = div.appendChild( document.createElement( \"div\" ) );\n\n\t\t\t\t// Reset CSS: box-sizing; display; margin; border; padding\n\t\t\t\tmarginDiv.style.cssText = div.style.cssText =\n\t\t\t\t\t// Support: Firefox<29, Android 2.3\n\t\t\t\t\t// Vendor-prefix box-sizing\n\t\t\t\t\t\"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;\" +\n\t\t\t\t\t\"box-sizing:content-box;display:block;margin:0;border:0;padding:0\";\n\t\t\t\tmarginDiv.style.marginRight = marginDiv.style.width = \"0\";\n\t\t\t\tdiv.style.width = \"1px\";\n\t\t\t\tdocElem.appendChild( container );\n\n\t\t\t\tret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );\n\n\t\t\t\tdocElem.removeChild( container );\n\t\t\t\tdiv.removeChild( marginDiv );\n\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t});\n\t}\n})();\n\nreturn support;\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/css/swap.js",
    "content": "define([\n\t\"../core\"\n], function( jQuery ) {\n\n// A method for quickly swapping in/out CSS properties to get correct calculations.\njQuery.swap = function( elem, options, callback, args ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.apply( elem, args || [] );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\nreturn jQuery.swap;\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/css/var/cssExpand.js",
    "content": "define(function() {\n\treturn [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n});\n"
  },
  {
    "path": "bower_components/jquery/src/css/var/getStyles.js",
    "content": "define(function() {\n\treturn function( elem ) {\n\t\t// Support: IE<=11+, Firefox<=30+ (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tif ( elem.ownerDocument.defaultView.opener ) {\n\t\t\treturn elem.ownerDocument.defaultView.getComputedStyle( elem, null );\n\t\t}\n\n\t\treturn window.getComputedStyle( elem, null );\n\t};\n});\n"
  },
  {
    "path": "bower_components/jquery/src/css/var/isHidden.js",
    "content": "define([\n\t\"../../core\",\n\t\"../../selector\"\n\t// css is assumed\n], function( jQuery ) {\n\n\treturn function( elem, el ) {\n\t\t// isHidden might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\t\treturn jQuery.css( elem, \"display\" ) === \"none\" || !jQuery.contains( elem.ownerDocument, elem );\n\t};\n});\n"
  },
  {
    "path": "bower_components/jquery/src/css/var/rmargin.js",
    "content": "define(function() {\n\treturn (/^margin/);\n});\n"
  },
  {
    "path": "bower_components/jquery/src/css/var/rnumnonpx.js",
    "content": "define([\n\t\"../../var/pnum\"\n], function( pnum ) {\n\treturn new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n});\n"
  },
  {
    "path": "bower_components/jquery/src/css.js",
    "content": "define([\n\t\"./core\",\n\t\"./var/pnum\",\n\t\"./core/access\",\n\t\"./css/var/rmargin\",\n\t\"./css/var/rnumnonpx\",\n\t\"./css/var/cssExpand\",\n\t\"./css/var/isHidden\",\n\t\"./css/var/getStyles\",\n\t\"./css/curCSS\",\n\t\"./css/defaultDisplay\",\n\t\"./css/addGetHookIf\",\n\t\"./css/support\",\n\t\"./data/var/data_priv\",\n\n\t\"./core/init\",\n\t\"./css/swap\",\n\t\"./core/ready\",\n\t\"./selector\" // contains\n], function( jQuery, pnum, access, rmargin, rnumnonpx, cssExpand, isHidden,\n\tgetStyles, curCSS, defaultDisplay, addGetHookIf, support, data_priv ) {\n\nvar\n\t// Swappable if display is none or starts with table except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trnumsplit = new RegExp( \"^(\" + pnum + \")(.*)$\", \"i\" ),\n\trrelNum = new RegExp( \"^([+-])=(\" + pnum + \")\", \"i\" ),\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t},\n\n\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ];\n\n// Return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( style, name ) {\n\n\t// Shortcut for names that are not vendor prefixed\n\tif ( name in style ) {\n\t\treturn name;\n\t}\n\n\t// Check for vendor prefixed names\n\tvar capName = name[0].toUpperCase() + name.slice(1),\n\t\torigName = name,\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in style ) {\n\t\t\treturn name;\n\t\t}\n\t}\n\n\treturn origName;\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\tvar matches = rnumsplit.exec( value );\n\treturn matches ?\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\tvar i = extra === ( isBorderBox ? \"border\" : \"content\" ) ?\n\t\t// If we already have the right measurement, avoid augmentation\n\t\t4 :\n\t\t// Otherwise initialize for horizontal or vertical properties\n\t\tname === \"width\" ? 1 : 0,\n\n\t\tval = 0;\n\n\tfor ( ; i < 4; i += 2 ) {\n\t\t// Both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\tif ( isBorderBox ) {\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// At this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t} else {\n\t\t\t// At this point, extra isn't content, so add padding\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// At this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property, which is equivalent to the border-box value\n\tvar valueIsBorderBox = true,\n\t\tval = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\tstyles = getStyles( elem ),\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t// Some non-html elements return undefined for offsetWidth, so check for null/undefined\n\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n\tif ( val <= 0 || val == null ) {\n\t\t// Fall back to computed then uncomputed css if necessary\n\t\tval = curCSS( elem, name, styles );\n\t\tif ( val < 0 || val == null ) {\n\t\t\tval = elem.style[ name ];\n\t\t}\n\n\t\t// Computed unit is not pixels. Stop here and return.\n\t\tif ( rnumnonpx.test(val) ) {\n\t\t\treturn val;\n\t\t}\n\n\t\t// Check for style in case a browser which returns unreliable values\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\t\tvalueIsBorderBox = isBorderBox &&\n\t\t\t( support.boxSizingReliable() || val === elem.style[ name ] );\n\n\t\t// Normalize \"\", auto, and prepare for extra\n\t\tval = parseFloat( val ) || 0;\n\t}\n\n\t// Use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles\n\t\t)\n\t) + \"px\";\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem, hidden,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tvalues[ index ] = data_priv.get( elem, \"olddisplay\" );\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t// being hidden by cascaded rules or not\n\t\t\tif ( !values[ index ] && display === \"none\" ) {\n\t\t\t\telem.style.display = \"\";\n\t\t\t}\n\n\t\t\t// Set elements which have been overridden with display: none\n\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t// for such an element\n\t\t\tif ( elem.style.display === \"\" && isHidden( elem ) ) {\n\t\t\t\tvalues[ index ] = data_priv.access( elem, \"olddisplay\", defaultDisplay(elem.nodeName) );\n\t\t\t}\n\t\t} else {\n\t\t\thidden = isHidden( elem );\n\n\t\t\tif ( display !== \"none\" || !hidden ) {\n\t\t\t\tdata_priv.set( elem, \"olddisplay\", hidden ? display : jQuery.css( elem, \"display\" ) );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of most of the elements in a second loop\n\t// to avoid the constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( !show || elem.style.display === \"none\" || elem.style.display === \"\" ) {\n\t\t\telem.style.display = show ? values[ index ] || \"\" : \"none\";\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.extend({\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t\"float\": \"cssFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style;\n\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n\t\t\t\tvalue = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"px\";\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {\n\t\t\t\tstyle[ name ] = value;\n\t\t\t}\n\n\t\t} else {\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = jQuery.camelCase( name );\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || jQuery.isNumeric( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t}\n});\n\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) && elem.offsetWidth === 0 ?\n\t\t\t\t\tjQuery.swap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t}) :\n\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar styles = extra && getStyles( elem );\n\t\t\treturn setPositiveNumber( elem, value, extra ?\n\t\t\t\taugmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\t\tstyles\n\t\t\t\t) : 0\n\t\t\t);\n\t\t}\n\t};\n});\n\n// Support: Android 2.3\njQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" },\n\t\t\t\tcurCSS, [ elem, \"marginRight\" ] );\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each({\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split(\" \") : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n});\n\njQuery.fn.extend({\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( jQuery.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t},\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( isHidden( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t});\n\t}\n});\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/data/Data.js",
    "content": "define([\n\t\"../core\",\n\t\"../var/rnotwhite\",\n\t\"./accepts\"\n], function( jQuery, rnotwhite ) {\n\nfunction Data() {\n\t// Support: Android<4,\n\t// Old WebKit does not have Object.preventExtensions/freeze method,\n\t// return new empty object instead with no [[set]] accessor\n\tObject.defineProperty( this.cache = {}, 0, {\n\t\tget: function() {\n\t\t\treturn {};\n\t\t}\n\t});\n\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\nData.accepts = jQuery.acceptData;\n\nData.prototype = {\n\tkey: function( owner ) {\n\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t// but we should not, see #8335.\n\t\t// Always return the key for a frozen object.\n\t\tif ( !Data.accepts( owner ) ) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar descriptor = {},\n\t\t\t// Check if the owner object already has a cache key\n\t\t\tunlock = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !unlock ) {\n\t\t\tunlock = Data.uid++;\n\n\t\t\t// Secure it in a non-enumerable, non-writable property\n\t\t\ttry {\n\t\t\t\tdescriptor[ this.expando ] = { value: unlock };\n\t\t\t\tObject.defineProperties( owner, descriptor );\n\n\t\t\t// Support: Android<4\n\t\t\t// Fallback to a less secure definition\n\t\t\t} catch ( e ) {\n\t\t\t\tdescriptor[ this.expando ] = unlock;\n\t\t\t\tjQuery.extend( owner, descriptor );\n\t\t\t}\n\t\t}\n\n\t\t// Ensure the cache object\n\t\tif ( !this.cache[ unlock ] ) {\n\t\t\tthis.cache[ unlock ] = {};\n\t\t}\n\n\t\treturn unlock;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\t// There may be an unlock assigned to this node,\n\t\t\t// if there is no entry for this \"owner\", create one inline\n\t\t\t// and set the unlock as though an owner entry had always existed\n\t\t\tunlock = this.key( owner ),\n\t\t\tcache = this.cache[ unlock ];\n\n\t\t// Handle: [ owner, key, value ] args\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ data ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\t\t\t// Fresh assignments by object are shallow copied\n\t\t\tif ( jQuery.isEmptyObject( cache ) ) {\n\t\t\t\tjQuery.extend( this.cache[ unlock ], data );\n\t\t\t// Otherwise, copy the properties one-by-one to the cache object\n\t\t\t} else {\n\t\t\t\tfor ( prop in data ) {\n\t\t\t\t\tcache[ prop ] = data[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\t// Either a valid cache is found, or will be created.\n\t\t// New caches will be created and the unlock returned,\n\t\t// allowing direct access to the newly created\n\t\t// empty data object. A valid owner object must be provided.\n\t\tvar cache = this.cache[ this.key( owner ) ];\n\n\t\treturn key === undefined ?\n\t\t\tcache : cache[ key ];\n\t},\n\taccess: function( owner, key, value ) {\n\t\tvar stored;\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t((key && typeof key === \"string\") && value === undefined) ) {\n\n\t\t\tstored = this.get( owner, key );\n\n\t\t\treturn stored !== undefined ?\n\t\t\t\tstored : this.get( owner, jQuery.camelCase(key) );\n\t\t}\n\n\t\t// [*]When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i, name, camel,\n\t\t\tunlock = this.key( owner ),\n\t\t\tcache = this.cache[ unlock ];\n\n\t\tif ( key === undefined ) {\n\t\t\tthis.cache[ unlock ] = {};\n\n\t\t} else {\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( jQuery.isArray( key ) ) {\n\t\t\t\t// If \"name\" is an array of keys...\n\t\t\t\t// When data is initially created, via (\"key\", \"val\") signature,\n\t\t\t\t// keys will be converted to camelCase.\n\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\n\t\t\t\t// both plain key and camelCase key. #12786\n\t\t\t\t// This will only penalize the array argument path.\n\t\t\t\tname = key.concat( key.map( jQuery.camelCase ) );\n\t\t\t} else {\n\t\t\t\tcamel = jQuery.camelCase( key );\n\t\t\t\t// Try the string as a key before any manipulation\n\t\t\t\tif ( key in cache ) {\n\t\t\t\t\tname = [ key, camel ];\n\t\t\t\t} else {\n\t\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\t\tname = camel;\n\t\t\t\t\tname = name in cache ?\n\t\t\t\t\t\t[ name ] : ( name.match( rnotwhite ) || [] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ti = name.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ name[ i ] ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\treturn !jQuery.isEmptyObject(\n\t\t\tthis.cache[ owner[ this.expando ] ] || {}\n\t\t);\n\t},\n\tdiscard: function( owner ) {\n\t\tif ( owner[ this.expando ] ) {\n\t\t\tdelete this.cache[ owner[ this.expando ] ];\n\t\t}\n\t}\n};\n\nreturn Data;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/data/accepts.js",
    "content": "define([\n\t\"../core\"\n], function( jQuery ) {\n\n/**\n * Determines whether an object can have data\n */\njQuery.acceptData = function( owner ) {\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\t/* jshint -W018 */\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\nreturn jQuery.acceptData;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/data/var/data_priv.js",
    "content": "define([\n\t\"../Data\"\n], function( Data ) {\n\treturn new Data();\n});\n"
  },
  {
    "path": "bower_components/jquery/src/data/var/data_user.js",
    "content": "define([\n\t\"../Data\"\n], function( Data ) {\n\treturn new Data();\n});\n"
  },
  {
    "path": "bower_components/jquery/src/data.js",
    "content": "define([\n\t\"./core\",\n\t\"./var/rnotwhite\",\n\t\"./core/access\",\n\t\"./data/var/data_priv\",\n\t\"./data/var/data_user\"\n], function( jQuery, rnotwhite, access, data_priv, data_user ) {\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\t\tdata === \"false\" ? false :\n\t\t\t\t\tdata === \"null\" ? null :\n\t\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdata_user.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend({\n\thasData: function( elem ) {\n\t\treturn data_user.hasData( elem ) || data_priv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn data_user.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdata_user.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to data_priv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn data_priv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdata_priv.remove( elem, name );\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = data_user.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !data_priv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE11+\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice(5) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdata_priv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tdata_user.set( this, key );\n\t\t\t});\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data,\n\t\t\t\tcamelKey = jQuery.camelCase( key );\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// with the key as-is\n\t\t\t\tdata = data_user.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// with the key camelized\n\t\t\t\tdata = data_user.get( elem, camelKey );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, camelKey, undefined );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each(function() {\n\t\t\t\t// First, attempt to store a copy or reference of any\n\t\t\t\t// data that might've been store with a camelCased key.\n\t\t\t\tvar data = data_user.get( this, camelKey );\n\n\t\t\t\t// For HTML5 data-* attribute interop, we have to\n\t\t\t\t// store property names with dashes in a camelCase form.\n\t\t\t\t// This might not apply to all properties...*\n\t\t\t\tdata_user.set( this, camelKey, value );\n\n\t\t\t\t// *... In the case of properties that might _actually_\n\t\t\t\t// have dashes, we need to also store a copy of that\n\t\t\t\t// unchanged property.\n\t\t\t\tif ( key.indexOf(\"-\") !== -1 && data !== undefined ) {\n\t\t\t\t\tdata_user.set( this, key, value );\n\t\t\t\t}\n\t\t\t});\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tdata_user.remove( this, key );\n\t\t});\n\t}\n});\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/deferred.js",
    "content": "define([\n\t\"./core\",\n\t\"./var/slice\",\n\t\"./callbacks\"\n], function( jQuery, slice ) {\n\njQuery.extend({\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks(\"memory\") ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[1] ](function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject )\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t}).promise();\n\t\t\t\t},\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[1] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(function() {\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ]\n\t\t\tdeferred[ tuple[0] ] = function() {\n\t\t\t\tdeferred[ tuple[0] + \"With\" ]( this === deferred ? promise : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\tdeferred[ tuple[0] + \"With\" ] = list.fireWith;\n\t\t});\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred. If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\t\t\t\t\t} else if ( !( --remaining ) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// Add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject )\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n});\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/deprecated.js",
    "content": "define([\n\t\"./core\",\n\t\"./traversing\"\n], function( jQuery ) {\n\n// The number of elements contained in the matched element set\njQuery.fn.size = function() {\n\treturn this.length;\n};\n\njQuery.fn.andSelf = jQuery.fn.addBack;\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/dimensions.js",
    "content": "define([\n\t\"./core\",\n\t\"./core/access\",\n\t\"./css\"\n], function( jQuery, access ) {\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name }, function( defaultExtra, funcName ) {\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t\t\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\n\t\t\t\t\t// isn't a whole lot we can do. See pull request at this URL for discussion:\n\t\t\t\t\t// https://github.com/jquery/jquery/pull/764\n\t\t\t\t\treturn elem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable, null );\n\t\t};\n\t});\n});\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/effects/Tween.js",
    "content": "define([\n\t\"../core\",\n\t\"../css\"\n], function( jQuery ) {\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || \"swing\";\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\tif ( tween.elem[ tween.prop ] != null &&\n\t\t\t\t(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE9\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t}\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back Compat <1.8 extension point\njQuery.fx.step = {};\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/effects/animatedSelector.js",
    "content": "define([\n\t\"../core\",\n\t\"../selector\",\n\t\"../effects\"\n], function( jQuery ) {\n\njQuery.expr.filters.animated = function( elem ) {\n\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t}).length;\n};\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/effects.js",
    "content": "define([\n\t\"./core\",\n\t\"./var/pnum\",\n\t\"./css/var/cssExpand\",\n\t\"./css/var/isHidden\",\n\t\"./css/defaultDisplay\",\n\t\"./data/var/data_priv\",\n\n\t\"./core/init\",\n\t\"./effects/Tween\",\n\t\"./queue\",\n\t\"./css\",\n\t\"./deferred\",\n\t\"./traversing\"\n], function( jQuery, pnum, cssExpand, isHidden, defaultDisplay, data_priv ) {\n\nvar\n\tfxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" ),\n\trrun = /queueHooks$/,\n\tanimationPrefilters = [ defaultPrefilter ],\n\ttweeners = {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value ),\n\t\t\t\ttarget = tween.cur(),\n\t\t\t\tparts = rfxnum.exec( value ),\n\t\t\t\tunit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t\t\t// Starting value computation is required for potential unit mismatches\n\t\t\t\tstart = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +target ) &&\n\t\t\t\t\trfxnum.exec( jQuery.css( tween.elem, prop ) ),\n\t\t\t\tscale = 1,\n\t\t\t\tmaxIterations = 20;\n\n\t\t\tif ( start && start[ 3 ] !== unit ) {\n\t\t\t\t// Trust units reported by jQuery.css\n\t\t\t\tunit = unit || start[ 3 ];\n\n\t\t\t\t// Make sure we update the tween properties later on\n\t\t\t\tparts = parts || [];\n\n\t\t\t\t// Iteratively approximate from a nonzero starting point\n\t\t\t\tstart = +target || 1;\n\n\t\t\t\tdo {\n\t\t\t\t\t// If previous iteration zeroed out, double until we get *something*.\n\t\t\t\t\t// Use string for doubling so we don't accidentally see scale as unchanged below\n\t\t\t\t\tscale = scale || \".5\";\n\n\t\t\t\t\t// Adjust and apply\n\t\t\t\t\tstart = start / scale;\n\t\t\t\t\tjQuery.style( tween.elem, prop, start + unit );\n\n\t\t\t\t// Update scale, tolerating zero or NaN from tween.cur(),\n\t\t\t\t// break the loop if scale is unchanged or perfect, or if we've just had enough\n\t\t\t\t} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );\n\t\t\t}\n\n\t\t\t// Update tween properties\n\t\t\tif ( parts ) {\n\t\t\t\tstart = tween.start = +start || +target || 0;\n\t\t\t\ttween.unit = unit;\n\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\ttween.end = parts[ 1 ] ?\n\t\t\t\t\tstart + ( parts[ 1 ] + 1 ) * parts[ 2 ] :\n\t\t\t\t\t+parts[ 2 ];\n\t\t\t}\n\n\t\t\treturn tween;\n\t\t} ]\n\t};\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\tsetTimeout(function() {\n\t\tfxNow = undefined;\n\t});\n\treturn ( fxNow = jQuery.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4 ; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( tweeners[ prop ] || [] ).concat( tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( (tween = collection[ index ].call( animation, prop, value )) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\t/* jshint validthis: true */\n\tvar prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHidden( elem ),\n\t\tdataShow = data_priv.get( elem, \"fxshow\" );\n\n\t// Handle queue: false promises\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always(function() {\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always(function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t// Height/width overflow pass\n\tif ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\n\t\t// Make sure that nothing sneaks out\n\t\t// Record all 3 overflow attributes because IE9-10 do not\n\t\t// change the overflow attribute when overflowX and\n\t\t// overflowY are set to the same value\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Set display property to inline-block for height/width\n\t\t// animations on inline elements that are having width/height animated\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\n\t\t// Test default display if display is currently \"none\"\n\t\tcheckDisplay = display === \"none\" ?\n\t\t\tdata_priv.get( elem, \"olddisplay\" ) || defaultDisplay( elem.nodeName ) : display;\n\n\t\tif ( checkDisplay === \"inline\" && jQuery.css( elem, \"float\" ) === \"none\" ) {\n\t\t\tstyle.display = \"inline-block\";\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always(function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t});\n\t}\n\n\t// show/hide pass\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.exec( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\n\t\t// Any non-fx value stops us from restoring the original display value\n\t\t} else {\n\t\t\tdisplay = undefined;\n\t\t}\n\t}\n\n\tif ( !jQuery.isEmptyObject( orig ) ) {\n\t\tif ( dataShow ) {\n\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\thidden = dataShow.hidden;\n\t\t\t}\n\t\t} else {\n\t\t\tdataShow = data_priv.access( elem, \"fxshow\", {} );\n\t\t}\n\n\t\t// Store state if its toggle - enables .stop().toggle() to \"reverse\"\n\t\tif ( toggle ) {\n\t\t\tdataShow.hidden = !hidden;\n\t\t}\n\t\tif ( hidden ) {\n\t\t\tjQuery( elem ).show();\n\t\t} else {\n\t\t\tanim.done(function() {\n\t\t\t\tjQuery( elem ).hide();\n\t\t\t});\n\t\t}\n\t\tanim.done(function() {\n\t\t\tvar prop;\n\n\t\t\tdata_priv.remove( elem, \"fxshow\" );\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t}\n\t\t});\n\t\tfor ( prop in orig ) {\n\t\t\ttween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\n\t\t\tif ( !( prop in dataShow ) ) {\n\t\t\t\tdataShow[ prop ] = tween.start;\n\t\t\t\tif ( hidden ) {\n\t\t\t\t\ttween.end = tween.start;\n\t\t\t\t\ttween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t// If this is a noop like .hide().hide(), restore an overwritten display value\n\t} else if ( (display === \"none\" ? defaultDisplay( elem.nodeName ) : display) === \"inline\" ) {\n\t\tstyle.display = display;\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( jQuery.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = animationPrefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t}),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\t\t\t\t// Support: Android 2.3\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ]);\n\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t} else {\n\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tanimation = deferred.promise({\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, { specialEasing: {} }, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length ; index++ ) {\n\t\tresult = animationPrefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t})\n\t);\n\n\t// attach callbacks from options\n\treturn animation.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.split(\" \");\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length ; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\ttweeners[ prop ] = tweeners[ prop ] || [];\n\t\t\ttweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tanimationPrefilters.unshift( callback );\n\t\t} else {\n\t\t\tanimationPrefilters.push( callback );\n\t\t}\n\t}\n});\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend({\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHidden ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate({ opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || data_priv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = data_priv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tvar index,\n\t\t\t\tdata = data_priv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t});\n\t}\n});\n\njQuery.each([ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n});\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx(\"show\"),\n\tslideUp: genFx(\"hide\"),\n\tslideToggle: genFx(\"toggle\"),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n});\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\t\t// Checks the timer has not already been removed\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tif ( timer() ) {\n\t\tjQuery.fx.start();\n\t} else {\n\t\tjQuery.timers.pop();\n\t}\n};\n\njQuery.fx.interval = 13;\n\njQuery.fx.start = function() {\n\tif ( !timerId ) {\n\t\ttimerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.stop = function() {\n\tclearInterval( timerId );\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\t// Default speed\n\t_default: 400\n};\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/event/ajax.js",
    "content": "define([\n\t\"../core\",\n\t\"../event\"\n], function( jQuery ) {\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [ \"ajaxStart\", \"ajaxStop\", \"ajaxComplete\", \"ajaxError\", \"ajaxSuccess\", \"ajaxSend\" ], function( i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n});\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/event/alias.js",
    "content": "define([\n\t\"../core\",\n\t\"../event\"\n], function( jQuery ) {\n\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n});\n\njQuery.fn.extend({\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t},\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ? this.off( selector, \"**\" ) : this.off( types, selector || \"**\", fn );\n\t}\n});\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/event/support.js",
    "content": "define([\n\t\"../var/support\"\n], function( support ) {\n\nsupport.focusinBubbles = \"onfocusin\" in window;\n\nreturn support;\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/event.js",
    "content": "define([\n\t\"./core\",\n\t\"./var/strundefined\",\n\t\"./var/rnotwhite\",\n\t\"./var/hasOwn\",\n\t\"./var/slice\",\n\t\"./event/support\",\n\t\"./data/var/data_priv\",\n\n\t\"./core/init\",\n\t\"./data/accepts\",\n\t\"./selector\"\n], function( jQuery, strundefined, rnotwhite, hasOwn, slice, support, data_priv ) {\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)$/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = data_priv.get( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !(events = elemData.events) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !(eventHandle = elemData.handle) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend({\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join(\".\")\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !(handlers = events[ type ]) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = data_priv.hasData( elem ) && data_priv.get( elem );\n\n\t\tif ( !elemData || !(events = elemData.events) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[2] && new RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdelete elemData.handle;\n\t\t\tdata_priv.remove( elem, \"events\" );\n\t\t}\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split(\".\") : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf(\".\") >= 0 ) {\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split(\".\");\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf(\":\") < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join(\".\");\n\t\tevent.namespace_re = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === (elem.ownerDocument || document) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( data_priv.get( cur, \"events\" ) || {} )[ event.type ] && data_priv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && jQuery.acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&\n\t\t\t\tjQuery.acceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\telem[ type ]();\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event );\n\n\t\tvar i, j, ret, matched, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\targs = slice.call( arguments ),\n\t\t\thandlers = ( data_priv.get( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[0] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\n\t\t\t\t// a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n\t\t\t\t\t\t\t.apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( (event.result = ret) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, matches, sel, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\t// Black-hole SVG <use> instance trees (#13180)\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\n\t\tif ( delegateCount && cur.nodeType && (!event.button || event.type !== \"click\") ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.disabled !== true || event.type !== \"click\" ) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) >= 0 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matches[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push({ elem: cur, handlers: matches });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\tprops: \"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: \"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\t\t\tvar eventDoc, doc, body,\n\t\t\t\tbutton = original.button;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop, copy,\n\t\t\ttype = event.type,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = this.fixHooks[ type ];\n\n\t\tif ( !fixHook ) {\n\t\t\tthis.fixHooks[ type ] = fixHook =\n\t\t\t\trmouseEvent.test( type ) ? this.mouseHooks :\n\t\t\t\trkeyEvent.test( type ) ? this.keyHooks :\n\t\t\t\t{};\n\t\t}\n\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = new jQuery.Event( originalEvent );\n\n\t\ti = copy.length;\n\t\twhile ( i-- ) {\n\t\t\tprop = copy[ i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Support: Cordova 2.5 (WebKit) (#13255)\n\t\t// All events should have a target; Cordova deviceready doesn't\n\t\tif ( !event.target ) {\n\t\t\tevent.target = document;\n\t\t}\n\n\t\t// Support: Safari 6.0+, Chrome<28\n\t\t// Target should not be a text node (#504, #13143)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\tspecial: {\n\t\tload: {\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\tthis.focus();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this.type === \"checkbox\" && this.click && jQuery.nodeName( this, \"input\" ) ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn jQuery.nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tsimulate: function( type, elem, event, bubble ) {\n\t\t// Piggyback on a donor event to simulate a different one.\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t\t// simulated event prevents default then we do the same on the donor.\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true,\n\t\t\t\toriginalEvent: {}\n\t\t\t}\n\t\t);\n\t\tif ( bubble ) {\n\t\t\tjQuery.event.trigger( e, null, elem );\n\t\t} else {\n\t\t\tjQuery.event.dispatch.call( elem, e );\n\t\t}\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\njQuery.removeEvent = function( elem, type, handle ) {\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle, false );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\t// Allow instantiation without the 'new' keyword\n\tif ( !(this instanceof jQuery.Event) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\t\t\t\t// Support: Android<4.0\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && e.preventDefault ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && e.stopImmediatePropagation ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// Support: Chrome 15+\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mousenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n});\n\n// Support: Firefox, Chrome, Safari\n// Create \"bubbling\" focus and blur events\nif ( !support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\t\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = data_priv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdata_priv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = data_priv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdata_priv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdata_priv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\njQuery.fn.extend({\n\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n\t\tvar origFn, type;\n\n\t\t// Types can be a map of types/handlers\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-Object, selector, data )\n\t\t\tif ( typeof selector !== \"string\" ) {\n\t\t\t\t// ( types-Object, data )\n\t\t\t\tdata = data || selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( data == null && fn == null ) {\n\t\t\t// ( types, fn )\n\t\t\tfn = selector;\n\t\t\tdata = selector = undefined;\n\t\t} else if ( fn == null ) {\n\t\t\tif ( typeof selector === \"string\" ) {\n\t\t\t\t// ( types, selector, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = undefined;\n\t\t\t} else {\n\t\t\t\t// ( types, data, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t} else if ( !fn ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( one === 1 ) {\n\t\t\torigFn = fn;\n\t\t\tfn = function( event ) {\n\t\t\t\t// Can use an empty set, since event contains the info\n\t\t\t\tjQuery().off( event );\n\t\t\t\treturn origFn.apply( this, arguments );\n\t\t\t};\n\t\t\t// Use same guid so caller can remove using origFn\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\n\t\t});\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn this.on( types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t});\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t});\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[0];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n});\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/exports/amd.js",
    "content": "define([\n\t\"../core\"\n], function( jQuery ) {\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t});\n}\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/exports/global.js",
    "content": "define([\n\t\"../core\",\n\t\"../var/strundefined\"\n], function( jQuery, strundefined ) {\n\nvar\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( typeof noGlobal === strundefined ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/intro.js",
    "content": "/*!\n * jQuery JavaScript Library v@VERSION\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: @DATE\n */\n\n(function( global, factory ) {\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n}(typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Support: Firefox 18+\n// Can't be in strict mode, several libs including ASP.NET trace\n// the stack via arguments.caller.callee and Firefox dies if\n// you try to trace through \"use strict\" call chains. (#13335)\n//\"use strict\";\n"
  },
  {
    "path": "bower_components/jquery/src/jquery.js",
    "content": "define([\n\t\"./core\",\n\t\"./selector\",\n\t\"./traversing\",\n\t\"./callbacks\",\n\t\"./deferred\",\n\t\"./core/ready\",\n\t\"./data\",\n\t\"./queue\",\n\t\"./queue/delay\",\n\t\"./attributes\",\n\t\"./event\",\n\t\"./event/alias\",\n\t\"./manipulation\",\n\t\"./manipulation/_evalUrl\",\n\t\"./wrap\",\n\t\"./css\",\n\t\"./css/hiddenVisibleSelectors\",\n\t\"./serialize\",\n\t\"./ajax\",\n\t\"./ajax/xhr\",\n\t\"./ajax/script\",\n\t\"./ajax/jsonp\",\n\t\"./ajax/load\",\n\t\"./event/ajax\",\n\t\"./effects\",\n\t\"./effects/animatedSelector\",\n\t\"./offset\",\n\t\"./dimensions\",\n\t\"./deprecated\",\n\t\"./exports/amd\",\n\t\"./exports/global\"\n], function( jQuery ) {\n\nreturn jQuery;\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/manipulation/_evalUrl.js",
    "content": "define([\n\t\"../ajax\"\n], function( jQuery ) {\n\njQuery._evalUrl = function( url ) {\n\treturn jQuery.ajax({\n\t\turl: url,\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tasync: false,\n\t\tglobal: false,\n\t\t\"throws\": true\n\t});\n};\n\nreturn jQuery._evalUrl;\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/manipulation/support.js",
    "content": "define([\n\t\"../var/support\"\n], function( support ) {\n\n(function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Safari<=5.1\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Safari<=5.1, Android<4.2\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE<=11+\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n})();\n\nreturn support;\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/manipulation/var/rcheckableType.js",
    "content": "define(function() {\n\treturn (/^(?:checkbox|radio)$/i);\n});\n"
  },
  {
    "path": "bower_components/jquery/src/manipulation.js",
    "content": "define([\n\t\"./core\",\n\t\"./var/concat\",\n\t\"./var/push\",\n\t\"./core/access\",\n\t\"./manipulation/var/rcheckableType\",\n\t\"./manipulation/support\",\n\t\"./data/var/data_priv\",\n\t\"./data/var/data_user\",\n\n\t\"./core/init\",\n\t\"./data/accepts\",\n\t\"./traversing\",\n\t\"./selector\",\n\t\"./event\"\n], function( jQuery, concat, push, access, rcheckableType, support, data_priv, data_user ) {\n\nvar\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,\n\trtagName = /<([\\w:]+)/,\n\trhtml = /<|&#?\\w+;/,\n\trnoInnerhtml = /<(?:script|style|link)/i,\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /^$|\\/(?:java|ecma)script/i,\n\trscriptTypeMasked = /^true\\/(.*)/,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,\n\n\t// We have to close these tags to support XHTML (#13200)\n\twrapMap = {\n\n\t\t// Support: IE9\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t\t_default: [ 0, \"\", \"\" ]\n\t};\n\n// Support: IE9\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: 1.x compatibility\n// Manipulating tables requires a tbody\nfunction manipulationTarget( elem, content ) {\n\treturn jQuery.nodeName( elem, \"table\" ) &&\n\t\tjQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ?\n\n\t\telem.getElementsByTagName(\"tbody\")[0] ||\n\t\t\telem.appendChild( elem.ownerDocument.createElement(\"tbody\") ) :\n\t\telem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = (elem.getAttribute(\"type\") !== null) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\n\tif ( match ) {\n\t\telem.type = match[ 1 ];\n\t} else {\n\t\telem.removeAttribute(\"type\");\n\t}\n\n\treturn elem;\n}\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdata_priv.set(\n\t\t\telems[ i ], \"globalEval\", !refElements || data_priv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( data_priv.hasData( src ) ) {\n\t\tpdataOld = data_priv.access( src );\n\t\tpdataCur = data_priv.set( dest, pdataOld );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdelete pdataCur.handle;\n\t\t\tpdataCur.events = {};\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( data_user.hasData( src ) ) {\n\t\tudataOld = data_user.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdata_user.set( dest, udataCur );\n\t}\n}\n\nfunction getAll( context, tag ) {\n\tvar ret = context.getElementsByTagName ? context.getElementsByTagName( tag || \"*\" ) :\n\t\t\tcontext.querySelectorAll ? context.querySelectorAll( tag || \"*\" ) :\n\t\t\t[];\n\n\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\t\tjQuery.merge( [ context ], ret ) :\n\t\tret;\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tbuildFragment: function( elems, context, scripts, selection ) {\n\t\tvar elem, tmp, tag, wrap, contains, j,\n\t\t\tfragment = context.createDocumentFragment(),\n\t\t\tnodes = [],\n\t\t\ti = 0,\n\t\t\tl = elems.length;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\telem = elems[ i ];\n\n\t\t\tif ( elem || elem === 0 ) {\n\n\t\t\t\t// Add nodes directly\n\t\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\t\t\t\t\t// Support: QtWebKit, PhantomJS\n\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t\t// Convert non-html into a text node\n\t\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t\t// Convert html into DOM nodes\n\t\t\t\t} else {\n\t\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement(\"div\") );\n\n\t\t\t\t\t// Deserialize a standard representation\n\t\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\t\ttmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, \"<$1></$2>\" ) + wrap[ 2 ];\n\n\t\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\t\tj = wrap[ 0 ];\n\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: QtWebKit, PhantomJS\n\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t\t// Remember the top-level container\n\t\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\t\ttmp.textContent = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Remove wrapper from fragment\n\t\tfragment.textContent = \"\";\n\n\t\ti = 0;\n\t\twhile ( (elem = nodes[ i++ ]) ) {\n\n\t\t\t// #4087 - If origin and destination elements are the same, and this is\n\t\t\t// that element, do not do anything\n\t\t\tif ( selection && jQuery.inArray( elem, selection ) !== -1 ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t\t// Append to fragment\n\t\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t\t// Preserve script evaluation history\n\t\t\tif ( contains ) {\n\t\t\t\tsetGlobalEval( tmp );\n\t\t\t}\n\n\t\t\t// Capture executables\n\t\t\tif ( scripts ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (elem = tmp[ j++ ]) ) {\n\t\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\t\tscripts.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn fragment;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type, key,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = elems[ i ]) !== undefined; i++ ) {\n\t\t\tif ( jQuery.acceptData( elem ) ) {\n\t\t\t\tkey = elem[ data_priv.expando ];\n\n\t\t\t\tif ( key && (data = data_priv.cache[ key ]) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( data_priv.cache[ key ] ) {\n\t\t\t\t\t\t// Discard any remaining `private` data\n\t\t\t\t\t\tdelete data_priv.cache[ key ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Discard any remaining `user` data\n\t\t\tdelete data_user.cache[ elem[ data_user.expando ] ];\n\t\t}\n\t}\n});\n\njQuery.fn.extend({\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each(function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t});\n\t},\n\n\tafter: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t});\n\t},\n\n\tremove: function( selector, keepData /* Internal Use Only */ ) {\n\t\tvar elem,\n\t\t\telems = selector ? jQuery.filter( selector, this ) : this,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem ) );\n\t\t\t}\n\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\tif ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\t\tsetGlobalEval( getAll( elem, \"script\" ) );\n\t\t\t\t}\n\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map(function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t});\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar arg = arguments[ 0 ];\n\n\t\t// Make the changes, replacing each context element with the new content\n\t\tthis.domManip( arguments, function( elem ) {\n\t\t\targ = this.parentNode;\n\n\t\t\tjQuery.cleanData( getAll( this ) );\n\n\t\t\tif ( arg ) {\n\t\t\t\targ.replaceChild( elem, this );\n\t\t\t}\n\t\t});\n\n\t\t// Force removal if there was no new content (e.g., from empty arguments)\n\t\treturn arg && (arg.length || arg.nodeType) ? this : this.remove();\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, callback ) {\n\n\t\t// Flatten any nested arrays\n\t\targs = concat.apply( [], args );\n\n\t\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tset = this,\n\t\t\tiNoClone = l - 1,\n\t\t\tvalue = args[ 0 ],\n\t\t\tisFunction = jQuery.isFunction( value );\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( isFunction ||\n\t\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\t\treturn this.each(function( index ) {\n\t\t\t\tvar self = set.eq( index );\n\t\t\t\tif ( isFunction ) {\n\t\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t\t}\n\t\t\t\tself.domManip( args, callback );\n\t\t\t});\n\t\t}\n\n\t\tif ( l ) {\n\t\t\tfragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );\n\t\t\tfirst = fragment.firstChild;\n\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfragment = first;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\t\thasScripts = scripts.length;\n\n\t\t\t\t// Use the original fragment for the last item instead of the first because it can end up\n\t\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\tnode = fragment;\n\n\t\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\t\t\t// Support: QtWebKit\n\t\t\t\t\t\t\t// jQuery.merge because push.apply(_, arraylike) throws\n\t\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcallback.call( this[ i ], node, i );\n\t\t\t\t}\n\n\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t\t// Reenable scripts\n\t\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t\t!data_priv.access( node, \"globalEval\" ) && jQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\t\tif ( node.src ) {\n\t\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\t\tif ( jQuery._evalUrl ) {\n\t\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.globalEval( node.textContent.replace( rcleanScript, \"\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: QtWebKit\n\t\t\t// .get() because push.apply(_, arraylike) throws\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/offset.js",
    "content": "define([\n\t\"./core\",\n\t\"./var/strundefined\",\n\t\"./core/access\",\n\t\"./css/var/rnumnonpx\",\n\t\"./css/curCSS\",\n\t\"./css/addGetHookIf\",\n\t\"./css/support\",\n\n\t\"./core/init\",\n\t\"./css\",\n\t\"./selector\" // contains\n], function( jQuery, strundefined, access, rnumnonpx, curCSS, addGetHookIf, support ) {\n\nvar docElem = window.document.documentElement;\n\n/**\n * Gets a window from an element\n */\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;\n}\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf(\"auto\") > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\t\t\toptions = options.call( elem, i, curOffset );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend({\n\toffset: function( options ) {\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each(function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t});\n\t\t}\n\n\t\tvar docElem, win,\n\t\t\telem = this[ 0 ],\n\t\t\tbox = { top: 0, left: 0 },\n\t\t\tdoc = elem && elem.ownerDocument;\n\n\t\tif ( !doc ) {\n\t\t\treturn;\n\t\t}\n\n\t\tdocElem = doc.documentElement;\n\n\t\t// Make sure it's not a disconnected DOM node\n\t\tif ( !jQuery.contains( docElem, elem ) ) {\n\t\t\treturn box;\n\t\t}\n\n\t\t// Support: BlackBerry 5, iOS 3 (original iPhone)\n\t\t// If we don't have gBCR, just use 0,0 rather than error\n\t\tif ( typeof elem.getBoundingClientRect !== strundefined ) {\n\t\t\tbox = elem.getBoundingClientRect();\n\t\t}\n\t\twin = getWindow( doc );\n\t\treturn {\n\t\t\ttop: box.top + win.pageYOffset - docElem.clientTop,\n\t\t\tleft: box.left + win.pageXOffset - docElem.clientLeft\n\t\t};\n\t},\n\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\t\t\t// Assume getBoundingClientRect is there when computed position is fixed\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\t// Get *real* offsetParent\n\t\t\toffsetParent = this.offsetParent();\n\n\t\t\t// Get correct offsets\n\t\t\toffset = this.offset();\n\t\t\tif ( !jQuery.nodeName( offsetParent[ 0 ], \"html\" ) ) {\n\t\t\t\tparentOffset = offsetParent.offset();\n\t\t\t}\n\n\t\t\t// Add offsetParent borders\n\t\t\tparentOffset.top += jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true );\n\t\t\tparentOffset.left += jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true );\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || docElem;\n\n\t\t\twhile ( offsetParent && ( !jQuery.nodeName( offsetParent, \"html\" ) && jQuery.css( offsetParent, \"position\" ) === \"static\" ) ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || docElem;\n\t\t});\n\t}\n});\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : window.pageXOffset,\n\t\t\t\t\ttop ? val : window.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length, null );\n\t};\n});\n\n// Support: Safari<7+, Chrome<37+\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://code.google.com/p/chromium/issues/detail?id=229280\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n});\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/outro.js",
    "content": "}));\n"
  },
  {
    "path": "bower_components/jquery/src/queue/delay.js",
    "content": "define([\n\t\"../core\",\n\t\"../queue\",\n\t\"../effects\" // Delay is optional because of this dependency\n], function( jQuery ) {\n\n// Based off of the plugin by Clint Helfers, with permission.\n// http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\tclearTimeout( timeout );\n\t\t};\n\t});\n};\n\nreturn jQuery.fn.delay;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/queue.js",
    "content": "define([\n\t\"./core\",\n\t\"./data/var/data_priv\",\n\t\"./deferred\",\n\t\"./callbacks\"\n], function( jQuery, data_priv ) {\n\njQuery.extend({\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = data_priv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray( data ) ) {\n\t\t\t\t\tqueue = data_priv.access( elem, type, jQuery.makeArray(data) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn data_priv.get( elem, key ) || data_priv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks(\"once memory\").add(function() {\n\t\t\t\tdata_priv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t})\n\t\t});\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = data_priv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n});\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/selector-native.js",
    "content": "define([\n\t\"./core\"\n], function( jQuery ) {\n\n/*\n * Optional (non-Sizzle) selector module for custom builds.\n *\n * Note that this DOES NOT SUPPORT many documented jQuery\n * features in exchange for its smaller size:\n *\n * Attribute not equal selector\n * Positional selectors (:first; :eq(n); :odd; etc.)\n * Type selectors (:input; :checkbox; :button; etc.)\n * State-based selectors (:animated; :visible; :hidden; etc.)\n * :has(selector)\n * :not(complex selector)\n * custom selectors via Sizzle extensions\n * Leading combinators (e.g., $collection.find(\"> *\"))\n * Reliable functionality on XML fragments\n * Requiring all parts of a selector to match elements under context\n *   (e.g., $div.find(\"div > *\") now matches children of $div)\n * Matching against non-elements\n * Reliable sorting of disconnected nodes\n * querySelectorAll bug fixes (e.g., unreliable :focus on WebKit)\n *\n * If any of these are unacceptable tradeoffs, either use Sizzle or\n * customize this stub for the project's specific needs.\n */\n\nvar docElem = window.document.documentElement,\n\tselector_hasDuplicate,\n\tmatches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector,\n\tselector_sortOrder = function( a, b ) {\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\tselector_hasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );\n\n\t\tif ( compare ) {\n\t\t\t// Disconnected nodes\n\t\t\tif ( compare & 1 ) {\n\n\t\t\t\t// Choose the first element that is related to our document\n\t\t\t\tif ( a === document || jQuery.contains(document, a) ) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\tif ( b === document || jQuery.contains(document, b) ) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\n\t\t\t\t// Maintain original order\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\treturn compare & 4 ? -1 : 1;\n\t\t}\n\n\t\t// Not directly comparable, sort on existence of method\n\t\treturn a.compareDocumentPosition ? -1 : 1;\n\t};\n\njQuery.extend({\n\tfind: function( selector, context, results, seed ) {\n\t\tvar elem, nodeType,\n\t\t\ti = 0;\n\n\t\tresults = results || [];\n\t\tcontext = context || document;\n\n\t\t// Same basic safeguard as Sizzle\n\t\tif ( !selector || typeof selector !== \"string\" ) {\n\t\t\treturn results;\n\t\t}\n\n\t\t// Early return if context is not an element or document\n\t\tif ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {\n\t\t\treturn [];\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\twhile ( (elem = seed[i++]) ) {\n\t\t\t\tif ( jQuery.find.matchesSelector(elem, selector) ) {\n\t\t\t\t\tresults.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tjQuery.merge( results, context.querySelectorAll(selector) );\n\t\t}\n\n\t\treturn results;\n\t},\n\tunique: function( results ) {\n\t\tvar elem,\n\t\t\tduplicates = [],\n\t\t\ti = 0,\n\t\t\tj = 0;\n\n\t\tselector_hasDuplicate = false;\n\t\tresults.sort( selector_sortOrder );\n\n\t\tif ( selector_hasDuplicate ) {\n\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\t\tj = duplicates.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t\twhile ( j-- ) {\n\t\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t},\n\ttext: function( elem ) {\n\t\tvar node,\n\t\t\tret = \"\",\n\t\t\ti = 0,\n\t\t\tnodeType = elem.nodeType;\n\n\t\tif ( !nodeType ) {\n\t\t\t// If no nodeType, this is expected to be an array\n\t\t\twhile ( (node = elem[i++]) ) {\n\t\t\t\t// Do not traverse comment nodes\n\t\t\t\tret += jQuery.text( node );\n\t\t\t}\n\t\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t\t// Use textContent for elements\n\t\t\treturn elem.textContent;\n\t\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\t\treturn elem.nodeValue;\n\t\t}\n\t\t// Do not include comment or processing instruction nodes\n\n\t\treturn ret;\n\t},\n\tcontains: function( a, b ) {\n\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\tbup = b && b.parentNode;\n\t\treturn a === bup || !!( bup && bup.nodeType === 1 && adown.contains(bup) );\n\t},\n\tisXMLDoc: function( elem ) {\n\t\treturn (elem.ownerDocument || elem).documentElement.nodeName !== \"HTML\";\n\t},\n\texpr: {\n\t\tattrHandle: {},\n\t\tmatch: {\n\t\t\tbool: /^(?:checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped)$/i,\n\t\t\tneedsContext: /^[\\x20\\t\\r\\n\\f]*[>+~]/\n\t\t}\n\t}\n});\n\njQuery.extend( jQuery.find, {\n\tmatches: function( expr, elements ) {\n\t\treturn jQuery.find( expr, null, null, elements );\n\t},\n\tmatchesSelector: function( elem, expr ) {\n\t\treturn matches.call( elem, expr );\n\t},\n\tattr: function( elem, name ) {\n\t\treturn elem.getAttribute( name );\n\t}\n});\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/selector-sizzle.js",
    "content": "define([\n\t\"./core\",\n\t\"sizzle\"\n], function( jQuery, Sizzle ) {\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.pseudos;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/selector.js",
    "content": "define([ \"./selector-sizzle\" ]);\n"
  },
  {
    "path": "bower_components/jquery/src/serialize.js",
    "content": "define([\n\t\"./core\",\n\t\"./manipulation/var/rcheckableType\",\n\t\"./core/init\",\n\t\"./traversing\", // filter\n\t\"./attributes/prop\"\n], function( jQuery, rcheckableType ) {\n\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\n\t\t\t}\n\t\t});\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, value ) {\n\t\t\t// If value is a function, invoke it and return its value\n\t\t\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t};\n\n\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\tif ( traditional === undefined ) {\n\t\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t});\n\n\t} else {\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" ).replace( r20, \"+\" );\n};\n\njQuery.fn.extend({\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map(function() {\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t})\n\t\t.filter(function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t})\n\t\t.map(function( i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val ) {\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t}).get();\n\t}\n});\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/sizzle/dist/sizzle.js",
    "content": "/*!\n * Sizzle CSS Selector Engine v2.2.0-pre\n * http://sizzlejs.com/\n *\n * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2014-12-16\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// General-purpose constants\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// http://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\trescape = /'|\\\\/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar match, elem, m, nodeType,\n\t\t// QSA vars\n\t\ti, groups, old, nid, newContext, newSelector;\n\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\n\tcontext = context || document;\n\tresults = results || [];\n\tnodeType = context.nodeType;\n\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\tif ( !seed && documentIsHTML ) {\n\n\t\t// Try to shortcut find operations when possible (e.g., not under DocumentFragment)\n\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document (jQuery #6963)\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\n\t\t// QSA path\n\t\tif ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\t\t\tnid = old = expando;\n\t\t\tnewContext = context;\n\t\t\tnewSelector = nodeType !== 1 && selector;\n\n\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t// IE 8 doesn't work on object elements\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t} else {\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t}\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\ti = groups.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\t\t\t\t}\n\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;\n\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t}\n\n\t\t\tif ( newSelector ) {\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch(qsaError) {\n\t\t\t\t} finally {\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( div.parentNode ) {\n\t\t\tdiv.parentNode.removeChild( div );\n\t\t}\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = attrs.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\t( ~b.sourceIndex || MAX_NEGATIVE ) -\n\t\t\t( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, parent,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// If no document and documentElement is available, return\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Set our document\n\tdocument = doc;\n\tdocElem = doc.documentElement;\n\tparent = doc.defaultView;\n\n\t// Support: IE>8\n\t// If iframe document is assigned to \"document\" variable and if iframe has been reloaded,\n\t// IE will throw \"permission denied\" error when accessing \"document\" variable, see jQuery #13936\n\t// IE6-8 do not support the defaultView property so parent will be undefined\n\tif ( parent && parent !== parent.top ) {\n\t\t// IE11 does not have attachEvent, so all must suffer\n\t\tif ( parent.addEventListener ) {\n\t\t\tparent.addEventListener( \"unload\", unloadHandler, false );\n\t\t} else if ( parent.attachEvent ) {\n\t\t\tparent.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Support tests\n\t---------------------------------------------------------------------- */\n\tdocumentIsHTML = !isXML( doc );\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.className = \"i\";\n\t\treturn !div.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( doc.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( doc.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( div ) {\n\t\tdocElem.appendChild( div ).id = expando;\n\t\treturn !doc.getElementsByName || !doc.getElementsByName( expando ).length;\n\t});\n\n\t// ID find and filter\n\tif ( support.getById ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [ m ] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\t// Support: IE6/7\n\t\t// getElementById is not reliable as a find shortcut\n\t\tdelete Expr.find[\"ID\"];\n\n\t\tExpr.filter[\"ID\"] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" && elem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See http://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( div ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\f]' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( div.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+\n\t\t\tif ( !div.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibing-combinator selector` fails\n\t\t\tif ( !div.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = doc.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tdiv.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( div.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully does not implement inclusive descendent\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === doc ? -1 :\n\t\t\t\tb === doc ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn doc;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\t\t\t\t\t\t\tdiff = cache[1];\n\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\t\t\t\t\t\tif ( (oldCache = outerCache[ dir ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\touterCache[ dir ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\tmatchedCount += i;\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is no seed and only one group\n\tif ( match.length === 1 ) {\n\n\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\n\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\trsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( div1 ) {\n\t// Should return 1, but returns 4 (following)\n\treturn div1.compareDocumentPosition( document.createElement(\"div\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( div ) {\n\tdiv.innerHTML = \"<a href='#'></a>\";\n\treturn div.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( div ) {\n\tdiv.innerHTML = \"<input/>\";\n\tdiv.firstChild.setAttribute( \"value\", \"\" );\n\treturn div.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( div ) {\n\treturn div.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\n// EXPOSE\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine(function() { return Sizzle; });\n// Sizzle requires that there be a global window in Common-JS like environments\n} else if ( typeof module !== \"undefined\" && module.exports ) {\n\tmodule.exports = Sizzle;\n} else {\n\twindow.Sizzle = Sizzle;\n}\n// EXPOSE\n\n})( window );\n"
  },
  {
    "path": "bower_components/jquery/src/traversing/findFilter.js",
    "content": "define([\n\t\"../core\",\n\t\"../var/indexOf\",\n\t\"./var/rneedsContext\",\n\t\"../selector\"\n], function( jQuery, indexOf, rneedsContext ) {\n\nvar risSimple = /^.[^:#\\[\\.,]*$/;\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\t/* jshint -W018 */\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t});\n\n\t}\n\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t});\n\n\t}\n\n\tif ( typeof qualifier === \"string\" ) {\n\t\tif ( risSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter( qualifier, elements, not );\n\t\t}\n\n\t\tqualifier = jQuery.filter( qualifier, elements );\n\t}\n\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( indexOf.call( qualifier, elem ) >= 0 ) !== not;\n\t});\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\treturn elems.length === 1 && elem.nodeType === 1 ?\n\t\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\n\t\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\t\treturn elem.nodeType === 1;\n\t\t}));\n};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar i,\n\t\t\tlen = this.length,\n\t\t\tret = [],\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}) );\n\t\t}\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\n\t\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\n\t\tret.selector = this.selector ? this.selector + \" \" + selector : selector;\n\t\treturn ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], false) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], true) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n});\n\n});\n"
  },
  {
    "path": "bower_components/jquery/src/traversing/var/rneedsContext.js",
    "content": "define([\n\t\"../../core\",\n\t\"../../selector\"\n], function( jQuery ) {\n\treturn jQuery.expr.match.needsContext;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/traversing.js",
    "content": "define([\n\t\"./core\",\n\t\"./var/indexOf\",\n\t\"./traversing/var/rneedsContext\",\n\t\"./core/init\",\n\t\"./traversing/findFilter\",\n\t\"./selector\"\n], function( jQuery, indexOf, rneedsContext ) {\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.extend({\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\ttruncate = until !== undefined;\n\n\t\twhile ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tmatched.push( elem );\n\t\t\t}\n\t\t}\n\t\treturn matched;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar matched = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tmatched.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn matched;\n\t}\n});\n\njQuery.fn.extend({\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter(function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tfor ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {\n\t\t\t\t// Always skip document fragments\n\t\t\t\tif ( cur.nodeType < 11 && (pos ?\n\t\t\t\t\tpos.index(cur) > -1 :\n\n\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\tjQuery.find.matchesSelector(cur, selectors)) ) {\n\n\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.unique(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter(selector)\n\t\t);\n\t}\n});\n\nfunction sibling( cur, dir ) {\n\twhile ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn elem.contentDocument || jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.unique( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n});\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/var/arr.js",
    "content": "define(function() {\n\treturn [];\n});\n"
  },
  {
    "path": "bower_components/jquery/src/var/class2type.js",
    "content": "define(function() {\n\t// [[Class]] -> type pairs\n\treturn {};\n});\n"
  },
  {
    "path": "bower_components/jquery/src/var/concat.js",
    "content": "define([\n\t\"./arr\"\n], function( arr ) {\n\treturn arr.concat;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/var/hasOwn.js",
    "content": "define([\n\t\"./class2type\"\n], function( class2type ) {\n\treturn class2type.hasOwnProperty;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/var/indexOf.js",
    "content": "define([\n\t\"./arr\"\n], function( arr ) {\n\treturn arr.indexOf;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/var/pnum.js",
    "content": "define(function() {\n\treturn (/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/).source;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/var/push.js",
    "content": "define([\n\t\"./arr\"\n], function( arr ) {\n\treturn arr.push;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/var/rnotwhite.js",
    "content": "define(function() {\n\treturn (/\\S+/g);\n});\n"
  },
  {
    "path": "bower_components/jquery/src/var/slice.js",
    "content": "define([\n\t\"./arr\"\n], function( arr ) {\n\treturn arr.slice;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/var/strundefined.js",
    "content": "define(function() {\n\treturn typeof undefined;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/var/support.js",
    "content": "define(function() {\n\t// All support tests are defined in their respective modules.\n\treturn {};\n});\n"
  },
  {
    "path": "bower_components/jquery/src/var/toString.js",
    "content": "define([\n\t\"./class2type\"\n], function( class2type ) {\n\treturn class2type.toString;\n});\n"
  },
  {
    "path": "bower_components/jquery/src/wrap.js",
    "content": "define([\n\t\"./core\",\n\t\"./core/init\",\n\t\"./manipulation\", // clone\n\t\"./traversing\" // parent, contents\n], function( jQuery ) {\n\njQuery.fn.extend({\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[ 0 ] ) {\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each(function( i ) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t}\n});\n\nreturn jQuery;\n});\n"
  },
  {
    "path": "bower_components/mocha/.bower.json",
    "content": "{\n  \"name\": \"mocha\",\n  \"homepage\": \"http://mocha.github.io/mocha\",\n  \"description\": \"simple, flexible, fun test framework\",\n  \"authors\": [\n    \"TJ Holowaychuk <tj@vision-media.ca>\",\n    \"Joshua Appelman <joshua@jbna.nl>\",\n    \"Oleg Gaidarenko <markelog@gmail.com>\",\n    \"Christoffer Hallas <christoffer.hallas@gmail.com>\",\n    \"Christopher Hiller <chiller@badwing.com>\",\n    \"Travis Jeffery <tj@travisjeffery.com>\",\n    \"Johnathan Ong <me@jongleberry.com>\",\n    \"Guillermo Rauch <rauchg@gmail.com>\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/mochajs/mocha.git\"\n  },\n  \"main\": [\n    \"mocha.js\",\n    \"mocha.css\"\n  ],\n  \"ignore\": [\n    \"bin\",\n    \"editors\",\n    \"images\",\n    \"lib\",\n    \"support\",\n    \"test\",\n    \".gitignore\",\n    \".npmignore\",\n    \".travis.yml\",\n    \"component.json\",\n    \"index.js\",\n    \"Makefile\",\n    \"package.json\"\n  ],\n  \"keywords\": [\n    \"mocha\",\n    \"test\",\n    \"bdd\",\n    \"tdd\",\n    \"tap\"\n  ],\n  \"license\": \"MIT\",\n  \"version\": \"2.3.3\",\n  \"_release\": \"2.3.3\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"v2.3.3\",\n    \"commit\": \"69a193eaf82d3410da03190f32fc27e28fa1b4b0\"\n  },\n  \"_source\": \"git://github.com/mochajs/mocha.git\",\n  \"_target\": \"*\",\n  \"_originalSource\": \"mocha\"\n}"
  },
  {
    "path": "bower_components/mocha/.editorconfig",
    "content": "# This file is for unifying the coding style for different editors and IDEs\n# editorconfig.org\n\nroot = true\n\n[*]\nend_of_line = lf\ncharset = utf-8\ninsert_final_newline = true\ntrim_trailing_whitespace = true\nindent_style = space\nindent_size = 2\n\n[Makefile]\nindent_style = tab\n\n[*.md]\ntrim_trailing_whitespace = false\n"
  },
  {
    "path": "bower_components/mocha/.eslintrc",
    "content": "---\nenv:\n  node: true\n\nrules:\n  brace-style: [2, 1tbs]\n  camelcase: 2\n  comma-dangle: [2, never]\n  comma-spacing: [2, {before: false, after: true}]\n  comma-style: [2, last]\n  computed-property-spacing: [2, never]\n  consistent-return: 0\n  consistent-this: [1, self]\n  curly: [2, all]\n  default-case: 2\n  dot-location: [2, property]\n  dot-notation: [2, { allowKeywords: true, allowPattern: \"^long$\" }]\n  eol-last: 2\n  eqeqeq: 2\n  func-style: [2, declaration]\n  guard-for-in: 2                                                          # TODO: Change to error\n  handle-callback-err: [2, ^(err|error)$]\n  indent: [2, 2, { SwitchCase: 1 }]\n  key-spacing: [2, { beforeColon: false, afterColon: true }]\n  max-len: [0, 80, 2]                                                      # TODO: Change to error\n  max-params: [1, 4]\n  new-cap: 0                                                               # TODO: Change to error\n  new-parens: 2\n  no-alert: 2\n  no-array-constructor: 0\n  no-bitwise: 0\n  no-caller: 2\n  no-catch-shadow: 2\n  no-cond-assign: [1, except-parens]                                       # TODO: Change to error\n  no-console: 0\n  no-constant-condition: 0\n  no-control-regex: 2\n  no-debugger: 1\n  no-delete-var: 2\n  no-dupe-args: 2\n  no-dupe-keys: 2\n  no-duplicate-case: 2\n  no-else-return: 2\n  no-empty: 2\n  no-empty-character-class: 2\n  no-eq-null: 0\n  no-eval: 2\n  no-ex-assign: 2\n  no-extend-native: 2\n  no-extra-bind: 2\n  no-extra-boolean-cast: 2\n  no-extra-semi: 2\n  no-fallthrough: 2\n  no-floating-decimal: 0\n  no-func-assign: 2\n  no-implied-eval: 2\n  no-inner-declarations: [2, functions]\n  no-invalid-regexp: 2\n  no-irregular-whitespace: 2\n  no-iterator: 2\n  no-labels: 2\n  no-lone-blocks: 2\n  no-lonely-if: 2\n  no-loop-func: 2\n  no-mixed-requires: [0, false]\n  no-mixed-spaces-and-tabs: [2, false]\n  no-multi-spaces: 2\n  no-multi-str: 2\n  no-multiple-empty-lines: [2, { max: 1 }]\n  no-native-reassign: 2\n  no-negated-in-lhs: 2\n  no-nested-ternary: 2\n  no-new: 2\n  no-new-func: 2\n  no-new-object: 2\n  no-new-require: 2\n  no-new-wrappers: 2\n  no-obj-calls: 2\n  no-octal: 2\n  no-octal-escape: 2\n  no-path-concat: 2\n  no-process-exit: 2\n  no-proto: 1                                                              # TODO: Change to error\n  no-redeclare: 2\n  no-regex-spaces: 2\n  no-return-assign: 2\n  no-script-url: 2\n  no-self-compare: 2\n  no-sequences: 2\n  no-shadow: 0\n  no-shadow-restricted-names: 2\n  no-spaced-func: 2\n  no-sparse-arrays: 2\n  no-trailing-spaces: 2\n  no-undef: 2\n  no-undef-init: 2\n  no-underscore-dangle: 0                                                  # TODO: Change to error\n  no-unneeded-ternary: 2\n  no-unreachable: 2\n  no-unused-expressions: 0\n  no-unused-vars: [2, { vars: all, args: after-used }]\n  no-use-before-define: 0\n  no-void: 2\n  no-with: 2\n  object-curly-spacing: [2, always]\n  one-var: [2, never]\n  operator-assignment: [2, always]\n  operator-linebreak: [2, before]\n  padded-blocks: [2, never]\n  quote-props: [2, as-needed]\n  quotes: [2, single, avoid-escape]\n  radix: 2\n  semi: [2, always]\n  semi-spacing: [2, { before: false, after: true }]\n  space-after-keywords: [2, always]\n  space-before-blocks: [2, always]\n  space-before-function-paren: [2, never]\n  space-in-parens: [2, never]\n  space-infix-ops: 2\n  space-return-throw-case: 2\n  space-unary-ops: [2, { words: true, nonwords: false }]\n  spaced-comment: [2, always, { exceptions: ['!'] }]\n  strict: [0, global]                                                      # TODO: Change to error\n  use-isnan: 2\n  valid-jsdoc: [0, { requireReturn: false }]                               # TODO: Change to warning\n  valid-typeof: 2\n  vars-on-top: 0\n  wrap-iife: 2\n  wrap-regex: 2\n  yoda: [2, never]\n"
  },
  {
    "path": "bower_components/mocha/.mailmap",
    "content": "TJ Holowaychuk <tj@vision-media.ca>\nTravis Jeffery <tj@travisjeffery.com>   <travisjeffery@gmail.com>\nTravis Jeffery <tj@travisjeffery.com>   Dr. Travis Jeffery <tj@travisjeffery.com>\nChristopher Hiller <boneskull@boneskull.com>  Christopher Hiller <chiller@badwing.com>\nDavid da Silva Contín <dasilvacontin@gmail.com>   David da Silva <daviddasilvacontin@me.com>\nDavid da Silva Contín <dasilvacontin@gmail.com>   David da Silva <dasilvacontin@gmail.com>\nAriel Mashraki <ariel@mashraki.co.il>   Ariel Mashraki <ariel@codeoasis.com>\nAriel Mashraki <ariel@mashraki.co.il>   Ariel Mashraki <ariel.mashraki@ironsrc.com>\nForbes Lindesay <forbes@lindesay.co.uk>   Forbes Lindesay <fpfl2@cam.ac.uk>\nBen Bradley <ben@bradleyit.com>   Ben Bradley <[ben.bradley@cigna.com|mailto:ben.bradley@cigna.com]>\nGlen Mailer <glenjamin@gmail.com>   Glen Mailer <glen.mailer@bskyb.com>\n"
  },
  {
    "path": "bower_components/mocha/CONTRIBUTING.md",
    "content": "# Contributing to Mocha\n\nHi!  We could use your help.  Let us help you help us.  Or something.\n\n## General\n\n1. If you are looking for a place to begin, **please send PRs for bugfixes instead of new features**, and/or **look for issues labeled `PR PLEASE`.**\n\n2.  **Help with documentation and the wiki is always appreciated**.\n\n3.  Please **be courteous and constructive** when commenting on issues, commits, and pull requests.\n\n## Bug Reports & Issues\n\n1.  When reporting a bug, please **provide steps to reproduce**.  If possible, show code.\n  \n2.  Please **show all code in JavaScript**.  We don't all read `<insert-language-that-compiles-to-JavaScript-here>`.  If you do not, you will be asked to.\n\n3.  Because Mocha works with many third-party libraries and tools, **ensure the bug you are reporting is actually within Mocha**.\n\n4.  If you report a bug, and it is inactive for a significant amount of time, it may be closed.  **Please respond promptly to requests for more information**.\n\n## Pull Requests\n\n1. Before sending a large PR, it's recommended to **create an issue to propose the change**.  Nobody wants to write a book of code and throw it away.\n\n2.  Because Mocha should be kept as maintainable as possible, its codebase must be kept slim.  Historically, *most PRs for new features are not merged*.  New features inevitably increase the size of the codebase, and thus reduce maintainability.  Only features *deemed essential* are likely to be merged--this is at the discretion of the maintainer(s).  If your PR for a feature is not merged, this doesn't necessarily mean your PR was a bad idea, wouldn't be used, or otherwise sucks.  It just means **only essential PRs for new features are likely to be merged**. \n\n3.  Due to the above, before creating a PR for a new feature, **create an issue to propose the feature.**\n\n4.  Please **respect existing coding conventions**, whatever those may be.\n\n5.  If your PR has been waiting in limbo for some time, it's very helpful to **rebase against master**, which will make it easier to merge.\n\n6.  Please **add tests for new code**.\n\n7.  **Always run `npm test` before sending a PR.**  If you break the tests, your PR will not be accepted until they are fixed.\n\n## Source Control\n\n1. Please **squash your commits** when sending a pull request.  If you are unfamiliar with this process, see [this guide](https://help.github.com/articles/about-git-rebase/).  If you have already pushed your changesets and are squashing thereafter, this may necessitate the use of a \"force push\".  Please [read the docs](http://git-scm.com/docs/git-push) before you attempt this. \n \n2. Please **follow the commit message conventions [outlined here](https://medium.com/code-adventures/git-conventions-a940ee20862d).**\n\n## TL;DR\n\n**Be kind, be diligent, look before you leap into a PR, and follow common community conventions**.\n\n*- The Mocha Team*\n"
  },
  {
    "path": "bower_components/mocha/HISTORY.md",
    "content": "2.3.3 / 2015-09-19\n==================\n\n * [#1875] - Fix Markdown reporter exceeds maximum call stack size ([@danielstjules])\n * [#1864] - Fix xunit missing output with --reporter-options output ([@danielstjules])\n * [#1846] - Support all harmony flags ([@danielstjules])\n * Fix fragile xunit reporter spec ([@danielstjules])\n * [#1669] - Fix catch uncaught errors outside test suite execution ([@danielstjules])\n * [#1868] - Revert jade to support npm < v1.3.7 ([@danielstjules])\n * [#1766] - Don't remove modules/components from stack trace in the browser ([@danielstjules])\n * [#1798] - Fix correctly attribute mutiple done err with hooks ([@danielstjules])\n * Fix use utils.reduce for IE8 compatibility ([@wsw0108])\n * Some linting errors fixed by [@danielstjules]\n * Call the inspect() function if message is not set ([@kevinburke])\n\n[#1875]: https://github.com/mochajs/mocha/issues/1875\n[#1864]: https://github.com/mochajs/mocha/issues/1864\n[#1846]: https://github.com/mochajs/mocha/issues/1846\n[#1669]: https://github.com/mochajs/mocha/issues/1669\n[#1868]: https://github.com/mochajs/mocha/issues/1868\n[#1766]: https://github.com/mochajs/mocha/issues/1766\n[#1798]: https://github.com/mochajs/mocha/issues/1798\n[@danielstjules]: https://github.com/danielstjules\n[@wsw0108]: https://github.com/wsw0108\n[@kevinburke]: https://github.com/kevinburke\n\n2.3.2 / 2015-09-07\n==================\n * [#1868] - Fix compatibility with older versions of NPM ([@boneskull])\n\n  [#1868]: https://github.com/mochajs/mocha/issues/1868\n\n2.3.1 / 2015-09-06\n==================\n\n  * [#1812] - Fix: Bail flag causes before() hooks to be run even after a failure ([@aaroncrows])\n\n  [#1812]: https://github.com/mochajs/mocha/issues/1812\n  [aaroncrows]: https://github.com/aaroncrows\n\n2.3.0 / 2015-08-30\n==================\n\n  * [#553] - added --allowUncaught option ([@amsul])\n  * [#1490] - Allow --async-only to be satisfied by returning a promise ([@jlai])\n  * [#1829] - support --max-old-space-size ([@gigadude])\n  * [#1811] - upgrade Jade dependency ([@outsideris])\n  * [#1769] - Fix async hook error handling ([@ajaykodali])\n  * [#1230] - More descriptive beforeEach/afterEach messages ([@duncanbeevers])\n  * [#1787] - Scope loading behaviour instead of using early return ([@aryeguy])\n  * [#1789] - Fix: html-runner crashing ([@sunesimonsen])\n  * [#1749] - Fix maximum call stack error on large amount of tests ([@tinganho])\n  * [#1230] - Decorate failed hook titles with test title ([@duncanbeevers])\n  * [#1260] - Build using Browserify ([@ndhoule])\n  * [#1728] - Don't use `__proto__` ([@ndhoule])\n  * [#1781] - Fix hook error tests ([@glenjamin])\n  * [#1754] - Allow boolean --reporter-options ([@papandreou])\n  * [#1766] - Fix overly aggressive stack suppression ([@moll])\n  * [#1752] - Avoid potential infinite loop ([@gsilk])\n  * [#1761] - Fix problems running under PhantomJS ([@chromakode])\n  * [#1700] - Fix more problems running under PhantomJS ([@jbnicolai])\n  * [#1774] - Support escaped spaces in CLI options ([@adamgruber])\n  * [#1687] - Fix HTML reporter links with special chars ([@benvinegar])\n  * [#1359] - Adopt code style and enforce it using ESLint ([@ndhoule] w/ assist from [@jbnicolai] & [@boneskull])\n  * various refactors ([@jbnicolai])\n  * [#1758] - Add cross-frame compatible Error checking ([@outdooricon])\n  * [#1741] - Remove moot `version` property from bower.json ([@kkirsche])\n  * [#1739] - Improve `HISTORY.md` ([@rstacruz])\n  * [#1730] - Support more io.js flags ([@ryedog])\n  * [#1349] - Allow HTML in HTML reporter errors ([@papandreou] / [@sunesimonsen])\n  * [#1572] - Prevent default browser behavior for failure/pass links ([@jschilli])\n  * [#1630] - Support underscored harmony flags ([@dominicbarnes])\n  * [#1718] - Support more harmony flags ([@slyg])\n  * [#1689] - Add stack to JSON-stream reporter ([@jonathandelgado])\n  * [#1654] - Fix `ReferenceError` \"location is not defined\" ([@jakemmarsh])\n\n  [#553]: https://github.com/mochajs/mocha/issues/553\n  [#1490]: https://github.com/mochajs/mocha/issues/1490\n  [#1829]: https://github.com/mochajs/mocha/issues/1829\n  [#1811]: https://github.com/mochajs/mocha/issues/1811\n  [#1769]: https://github.com/mochajs/mocha/issues/1769\n  [#1230]: https://github.com/mochajs/mocha/issues/1230\n  [#1787]: https://github.com/mochajs/mocha/issues/1787\n  [#1789]: https://github.com/mochajs/mocha/issues/1789\n  [#1749]: https://github.com/mochajs/mocha/issues/1749\n  [#1230]: https://github.com/mochajs/mocha/issues/1230\n  [#1260]: https://github.com/mochajs/mocha/issues/1260\n  [#1728]: https://github.com/mochajs/mocha/issues/1728\n  [#1781]: https://github.com/mochajs/mocha/issues/1781\n  [#1754]: https://github.com/mochajs/mocha/issues/1754\n  [#1766]: https://github.com/mochajs/mocha/issues/1766\n  [#1752]: https://github.com/mochajs/mocha/issues/1752\n  [#1761]: https://github.com/mochajs/mocha/issues/1761\n  [#1700]: https://github.com/mochajs/mocha/issues/1700\n  [#1774]: https://github.com/mochajs/mocha/issues/1774\n  [#1687]: https://github.com/mochajs/mocha/issues/1687\n  [#1359]: https://github.com/mochajs/mocha/issues/1359\n  [#1758]: https://github.com/mochajs/mocha/issues/1758\n  [#1741]: https://github.com/mochajs/mocha/issues/1741\n  [#1739]: https://github.com/mochajs/mocha/issues/1739\n  [#1730]: https://github.com/mochajs/mocha/issues/1730\n  [#1349]: https://github.com/mochajs/mocha/issues/1349\n  [#1572]: https://github.com/mochajs/mocha/issues/1572\n  [#1630]: https://github.com/mochajs/mocha/issues/1630\n  [#1718]: https://github.com/mochajs/mocha/issues/1718\n  [#1689]: https://github.com/mochajs/mocha/issues/1689\n  [#1654]: https://github.com/mochajs/mocha/issues/1654\n  [@adamgruber]: https://github.com/adamgruber\n  [@ajaykodali]: https://github.com/ajaykodali\n  [@amsul]: https://github.com/amsul\n  [@aryeguy]: https://github.com/aryeguy\n  [@benvinegar]: https://github.com/benvinegar\n  [@boneskull]: https://github.com/boneskull\n  [@chromakode]: https://github.com/chromakode\n  [@dominicbarnes]: https://github.com/dominicbarnes\n  [@duncanbeevers]: https://github.com/duncanbeevers\n  [@gigadude]: https://github.com/gigadude\n  [@glenjamin]: https://github.com/glenjamin\n  [@gsilk]: https://github.com/gsilk\n  [@jakemmarsh]: https://github.com/jakemmarsh\n  [@jbnicolai]: https://github.com/jbnicolai\n  [@jlai]: https://github.com/jlai\n  [@jonathandelgado]: https://github.com/jonathandelgado\n  [@jschilli]: https://github.com/jschilli\n  [@kkirsche]: https://github.com/kkirsche\n  [@moll]: https://github.com/moll\n  [@ndhoule]: https://github.com/ndhoule\n  [@outdooricon]: https://github.com/outdooricon\n  [@outsideris]: https://github.com/outsideris\n  [@papandreou]: https://github.com/papandreou\n  [@rstacruz]: https://github.com/rstacruz\n  [@ryedog]: https://github.com/ryedog\n  [@slyg]: https://github.com/slyg\n  [@sunesimonsen]: https://github.com/sunesimonsen\n  [@tinganho]: https://github.com/tinganho\n\n2.2.5 / 2015-05-14\n==================\n\n  * [#1699] - Upgrade jsdiff to v1.4.0 ([@nylen])\n  * [#1648] - fix diff background colors in the console ([@nylen])\n  * [#1327] - fix tests running twice, a regression issue. ([#1686], [@danielstjules])\n  * [#1675] - add integration tests ([@danielstjules])\n  * [#1682] - use a valid SPDX license identifier in package.json ([@kemitchell])\n  * [#1660] - fix assertion of invalid dates ([#1661], [@a8m])\n  * [#1241] - fix issue with multiline diffs appearing as single line ([#1655], [@a8m])\n\n[#1699]: https://github.com/mochajs/mocha/issues/1699\n[#1648]: https://github.com/mochajs/mocha/issues/1648\n[#1327]: https://github.com/mochajs/mocha/issues/1327\n[#1686]: https://github.com/mochajs/mocha/issues/1686\n[#1675]: https://github.com/mochajs/mocha/issues/1675\n[#1682]: https://github.com/mochajs/mocha/issues/1682\n[#1660]: https://github.com/mochajs/mocha/issues/1660\n[#1661]: https://github.com/mochajs/mocha/issues/1661\n[#1241]: https://github.com/mochajs/mocha/issues/1241\n[#1655]: https://github.com/mochajs/mocha/issues/1655\n[@nylen]: https://github.com/nylen\n[@danielstjules]: https://github.com/danielstjules\n[@kemitchell]: https://github.com/kemitchell\n[@a8m]: https://github.com/a8m\n\n2.2.4 / 2015-04-08\n==================\n\n  * Load mocha.opts in _mocha for now (close #1645)\n\n2.2.3 / 2015-04-07\n==================\n\n  * fix(reporter/base): string diff - issue #1241\n  * fix(reporter/base): string diff - issue #1241\n  * fix(reporter/base): don't show diffs for errors without expectation\n  * fix(reporter/base): don't assume error message is first line of stack\n  * improve: dry up reporter/base test\n  * fix(reporter/base): explicitly ignore showDiff #1614\n  * Add iojs to travis build\n  * Pass `--allow-natives-syntax` flag to node.\n  * Support --harmony_classes flag for io.js\n  * Fix 1556: Update utils.clean to handle newlines in func declarations\n  * Fix 1606: fix err handling in IE <= 8 and non-ES5 browsers\n  * Fix 1585: make _mocha executable again\n  * chore(package.json): add a8m as a contributor\n  * Fixed broken link on html-cov reporter\n  * support --es_staging flag\n  * fix issue where menu overlaps content.\n  * update contributors in package.json\n  * Remove trailing whitespace from reporter output\n  * Remove contributors list from readme\n  * log third-party reporter errors\n  * [Fix] Exclude not own properties when looping on options\n  * fix: support node args in mocha.opts (close #1573)\n  * fix(reporter/base): string diff - issue #1241\n\n2.2.1 / 2015-03-09\n==================\n\n  * Fix passing of args intended for node/iojs.\n\n2.2.0 / 2015-03-06\n==================\n\n  * Update mocha.js\n  * Add --fgrep. Use grep for RegExp, fgrep for str\n  * Ignore async global errors after spec resolution\n  * Fixing errors that prevent mocha.js from loading in the browser - fixes #1558\n  * fix(utils): issue #1558 + make\n  * add ability to delay root suite; closes #362, closes #1124\n  * fix insanity in http tests\n  * update travis: add node 0.12, add gitter, remove slack\n  * building\n  * resolve #1548: ensure the environment's \"node\" executable is used\n  * reporters/base: use supports-color to detect colorable term\n  * travis: use docker containers\n  * small fix: commander option for --expose-gc\n  * Ignore asynchronous errors after global failure\n  * Improve error output when a test fails with a non-error\n  * updated travis badge, uses svg instead of img\n  * Allow skip from test context for #332\n  * [JSHINT] Unnecessary semicolon fixed in bin/_mocha\n  * Added a reminder about the done() callback to test timeout error messages\n  * fixes #1496, in Mocha.run(fn), check if fn exists before executing it, added tests too\n  * Add Harmony Proxy flag for iojs\n  * test(utils|ms|*): test existing units\n  * add support for some iojs flags\n  * fix(utils.stringify): issue #1229, diff viewer\n  * Remove slack link\n  * Prevent multiple 'grep=' querystring params in html reporter\n  * Use grep as regexp (close #1381)\n  * utils.stringify should handle objects without an Object prototype\n  * in runnable test, comparing to undefined error's message rather than a literal\n  * Fix test running output truncation on async STDIO\n  * ammended for deprecated customFds option in child_process\n\n2.1.0 / 2014-12-23\n==================\n\n * showDiff: don’t stringify strings\n * Clean up unused module dependencies.\n * Filter zero-length strings from mocha.opts\n * only write to stdout in reporters\n * Revert \"only write to stdout in reporters\"\n * Print colored output only to a tty\n * update summary in README.md\n * rename Readme.md/History.md to README.md/HISTORY.md because neurotic\n * add .mailmap to fix \"git shortlog\" or \"git summary\" output\n * fixes #1461: nyan-reporter now respects Base.useColors, fixed bug where Base.color would not return a string when str wasn't a string.\n * Use existing test URL builder in failed replay links\n * modify .travis.yml: use travis_retry; closes #1449\n * fix -t 0 behavior; closes #1446\n * fix tests (whoops)\n * improve diff behavior\n * Preserve pathname when linking to individual tests\n * Fix test\n * Tiny typo in comments fixed\n * after hooks now being called on failed tests when using bail, fixes #1093\n * fix throwing undefined/null now makes tests fail, fixes #1395\n * compiler extensions are added as watched extensions, removed non-standard extensions from watch regex, resolves #1221\n * prefix/namespace for suite titles in markdown reporter, fixes #554\n * fix more bad markdown in CONTRIBUTING.md\n * fix bad markdown in CONTRIBUTING.md\n * add setImmediate/clearImmediate to globals; closes #1435\n * Fix buffer diffs (closes #1132, closes #1433)\n * add a CONTRIBUTING.md.  closes #882\n * fix intermittent build failures (maybe). closes #1407\n * add Slack notification to .travis.yml\n * Fix slack link\n * Add slack room to readme\n * Update maintainers\n * update maintainers and contributors\n * resolves #1393: kill children with more effort on SIGINT\n * xunit reporter support for optionally writing to a file\n * if a reporter has a .done method, call it before exiting\n * add support for reporter options\n * only write to stdout in reporters\n\n2.0.0 / 2014-10-21\n==================\n\n * remove: support for node 0.6.x, 0.4.x\n * fix: landing reporter with non ansi characters (#211)\n * fix: html reporter - preserve query params when navigating to suites/tests (#1358)\n * fix: json stream reporter add error message to failed test\n * fix: fixes for visionmedia -> mochajs\n * fix: use stdio, fixes node deprecation warnings (#1391)\n\n1.21.5 / 2014-10-11\n==================\n\n * fix: build for NodeJS v0.6.x\n * fix: do not attempt to highlight syntax when non-HTML reporter is used\n * update: escape-string-regexp to 1.0.2.\n * fix: botched indentation in canonicalize()\n * fix: .gitignore: ignore .patch and .diff files\n * fix: changed 'Catched' to 'Caught' in uncaught exception error handler messages\n * add: `pending` field for json reporter\n * fix: Runner.prototype.uncaught: don't double-end runnables that already have a state.\n * fix: --recursive, broken by f0facd2e\n * update: replaces escapeRegexp with the escape-string-regexp package.\n * update: commander to 2.3.0.\n * update: diff to 1.0.8.\n * fix: ability to disable syntax highlighting (#1329)\n * fix: added empty object to errorJSON() call to catch when no error is present\n * fix: never time out after calling enableTimeouts(false)\n * fix: timeout(0) will work at suite level (#1300)\n * Fix for --watch+only() issue (#888 )\n * fix: respect err.showDiff, add Base reporter test (#810)\n\n1.22.1-3 / 2014-07-27\n==================\n\n  * fix: disabling timeouts with this.timeout(0) (#1301)\n\n1.22.1-3 / 2014-07-27\n==================\n\n  * fix: local uis and reporters (#1288)\n  * fix: building 1.21.0's changes in the browser (#1284)\n\n1.21.0 / 2014-07-23\n==================\n\n  * add: --no-timeouts option (#1262, #1268)\n  * add: --*- deprecation node flags (#1217)\n  * add: --watch-extensions argument (#1247)\n  * change: spec reporter is default (#1228)\n  * fix: diff output showing incorrect +/- (#1182)\n  * fix: diffs of circular structures (#1179)\n  * fix: re-render the progress bar when progress has changed only (#1151)\n  * fix support for environments with global and window (#1159)\n  * fix: reverting to previously defined onerror handler (#1178)\n  * fix: stringify non error objects passed to done() (#1270)\n  * fix: using local ui, reporters (#1267)\n  * fix: cleaning es6 arrows (#1176)\n  * fix: don't include attrs in failure tag for xunit (#1244)\n  * fix: fail tests that return a promise if promise is rejected w/o a reason (#1224)\n  * fix: showing failed tests in doc reporter (#1117)\n  * fix: dot reporter dots being off (#1204)\n  * fix: catch empty throws (#1219)\n  * fix: honoring timeout for sync operations (#1242)\n  * update: growl to 1.8.0\n\n1.20.1 / 2014-06-03\n==================\n\n  * update: should dev dependency to ~4.0.0 (#1231)\n\n1.20.0 / 2014-05-28\n==================\n\n  * add: filenames to suite objects (#1222)\n\n1.19.0 / 2014-05-17\n==================\n\n  * add: browser script option to package.json\n  * add: export file in Mocha.Test objects (#1174)\n  * add: add docs for wrapped node flags\n  * fix: mocha.run() to return error status in browser (#1216)\n  * fix: clean() to show failure details (#1205)\n  * fix: regex that generates html for new keyword (#1201)\n  * fix: sibling suites have inherited but separate contexts (#1164)\n\n\n1.18.2 / 2014-03-18\n==================\n\n  * fix: html runner was prevented from using #mocha as the default root el (#1162)\n\n1.18.1 / 2014-03-18\n==================\n\n  * fix: named before/after hooks in bdd, tdd, qunit interfaces (#1161)\n\n1.18.0 / 2014-03-13\n==================\n\n  * add: promise support (#329)\n  * add: named before/after hooks (#966)\n\n1.17.1 / 2014-01-22\n==================\n\n  * fix: expected messages in should.js (should.js#168)\n  * fix: expect errno global in node versions < v0.9.11 (#1111)\n  * fix: unreliable checkGlobals optimization (#1110)\n\n1.17.0 / 2014-01-09\n==================\n\n  * add: able to require globals (describe, it, etc.) through mocha (#1077)\n  * fix: abort previous run on --watch change (#1100)\n  * fix: reset context for each --watch triggered run (#1099)\n  * fix: error when cli can't resolve path or pattern (#799)\n  * fix: canonicalize objects before stringifying and diffing them (#1079)\n  * fix: make CR call behave like carriage return for non tty (#1087)\n\n\n1.16.2 / 2013-12-23\n==================\n\n  * fix: couple issues with ie 8 (#1082, #1081)\n  * fix: issue running the xunit reporter in browsers (#1068)\n  * fix: issue with firefox < 3.5 (#725)\n\n\n1.16.1 / 2013-12-19\n==================\n\n  * fix: recompiled for missed changes from the last release\n\n\n1.16.0 / 2013-12-19\n==================\n\n  * add: Runnable.globals(arr) for per test global whitelist (#1046)\n  * add: mocha.throwError(err) for assertion libs to call (#985)\n  * remove: --watch's spinner (#806)\n  * fix: duplicate test output for multi-line specs in spec reporter (#1006)\n  * fix: gracefully exit on SIGINT (#1063)\n  * fix expose the specified ui only in the browser (#984)\n  * fix: ensure process exit code is preserved when using --no-exit (#1059)\n  * fix: return true from window.onerror handler (#868)\n  * fix: xunit reporter to use process.stdout.write (#1068)\n  * fix: utils.clean(str) indentation (#761)\n  * fix: xunit reporter returning test duration a NaN (#1039)\n\n1.15.1 / 2013-12-03\n==================\n\n  * fix: recompiled for missed changes from the last release\n\n1.15.0 / 2013-12-02\n==================\n\n  * add: `--no-exit` to prevent `process.exit()` (#1018)\n  * fix: using inline diffs (#1044)\n  * fix: show pending test details in xunit reporter (#1051)\n  * fix: faster global leak detection (#1024)\n  * fix: yui compression (#1035)\n  * fix: wrapping long lines in test results (#1030, #1031)\n  * fix: handle errors in hooks (#1043)\n\n1.14.0 / 2013-11-02\n==================\n\n  * add: unified diff (#862)\n  * add: set MOCHA_COLORS env var to use colors (#965)\n  * add: able to override tests links in html reporters (#776)\n  * remove: teamcity reporter (#954)\n  * update: commander dependency to 2.0.0 (#1010)\n  * fix: mocha --ui will try to require the ui if not built in, as --reporter does (#1022)\n  * fix: send cursor commands only if isatty (#184, #1003)\n  * fix: include assertion message in base reporter (#993, #991)\n  * fix: consistent return of it, it.only, and describe, describe.only (#840)\n\n1.13.0 / 2013-09-15\n==================\n\n  * add: sort test files with --sort (#813)\n  * update: diff depedency to 1.0.7\n  * update: glob dependency to 3.2.3 (#927)\n  * fix: diffs show whitespace differences (#976)\n  * fix: improve global leaks (#783)\n  * fix: firefox window.getInterface leak\n  * fix: accessing iframe via window[iframeIndex] leak\n  * fix: faster global leak checking\n  * fix: reporter pending css selector (#970)\n\n1.12.1 / 2013-08-29\n==================\n\n * remove test.js from .gitignore\n * update included version of ms.js\n\n1.12.0 / 2013-07-01\n==================\n\n * add: prevent diffs for differing types. Closes #900\n * add `Mocha.process` hack for phantomjs\n * fix: use compilers with requires\n * fix regexps in diffs. Closes #890\n * fix xunit NaN on failure. Closes #894\n * fix: strip tab indentation in `clean` utility method\n * fix: textmate bundle installation\n\n1.11.0 / 2013-06-12\n==================\n\n * add --prof support\n * add --harmony support\n * add --harmony-generators support\n * add \"Uncaught \" prefix to uncaught exceptions\n * add web workers support\n * add `suite.skip()`\n * change to output # of pending / passing even on failures. Closes #872\n * fix: prevent hooks from being called if we are bailing\n * fix `this.timeout(0)`\n\n1.10.0 / 2013-05-21\n==================\n\n * add add better globbing support for windows via `glob` module\n * add support to pass through flags such as --debug-brk=1234. Closes #852\n * add test.only, test.skip to qunit interface\n * change to always use word-based diffs for now. Closes #733\n * change `mocha init` tests.html to index.html\n * fix `process` global leak in the browser\n * fix: use resolve() instead of join() for --require\n * fix: filterLeaks() condition to not consider indices in global object as leaks\n * fix: restrict mocha.css styling to #mocha id\n * fix: save timer references to avoid Sinon interfering in the browser build.\n\n1.9.0 / 2013-04-03\n==================\n\n  * add improved setImmediate implementation\n  * replace --ignore-leaks with --check-leaks\n  * change default of ignoreLeaks to true. Closes #791\n  * remove scrolling for HTML reporter\n  * fix retina support\n  * fix tmbundle, restrict to js scope\n\n1.8.2 / 2013-03-11\n==================\n\n  * add `setImmediate` support for 0.10.x\n  * fix mocha -w spinner on windows\n\n1.8.1 / 2013-01-09\n==================\n\n  * fix .bail() arity check causing it to default to true\n\n1.8.0 / 2013-01-08\n==================\n\n  * add Mocha() options bail support\n  * add `Mocha#bail()` method\n  * add instanceof check back for inheriting from Error\n  * add component.json\n  * add diff.js to browser build\n  * update growl\n  * fix TAP reporter failures comment :D\n\n1.7.4 / 2012-12-06\n==================\n\n  * add total number of passes and failures to TAP\n  * remove .bind() calls. re #680\n  * fix indexOf. Closes #680\n\n1.7.3 / 2012-11-30\n==================\n\n  * fix uncaught error support for the browser\n  * revert uncaught \"fix\" which breaks node\n\n1.7.2 / 2012-11-28\n==================\n\n  * fix uncaught errors to expose the original error message\n\n1.7.0 / 2012-11-07\n==================\n\n  * add `--async-only` support to prevent false positives for missing `done()`\n  * add sorting by filename in code coverage\n  * add HTML 5 doctype to browser template.\n  * add play button to html reporter to rerun a single test\n  * add `this.timeout(ms)` as Suite#timeout(ms). Closes #599\n  * update growl dependency to 1.6.x\n  * fix encoding of test-case ?grep. Closes #637\n  * fix unicode chars on windows\n  * fix dom globals in Opera/IE. Closes #243\n  * fix markdown reporter a tags\n  * fix `this.timeout(\"5s\")` support\n\n1.6.0 / 2012-10-02\n==================\n\n  * add object diffs when `err.showDiff` is present\n  * add hiding of empty suites when pass/failures are toggled\n  * add faster `.length` checks to `checkGlobals()` before performing the filter\n\n1.5.0 / 2012-09-21\n==================\n\n  * add `ms()` to `.slow()` and `.timeout()`\n  * add `Mocha#checkLeaks()` to re-enable global leak checks\n  * add `this.slow()` option [aheckmann]\n  * add tab, CR, LF to error diffs for now\n  * add faster `.checkGlobals()` solution [guille]\n  * remove `fn.call()` from reduce util\n  * remove `fn.call()` from filter util\n  * fix forEach. Closes #582\n  * fix relaying of signals [TooTallNate]\n  * fix TAP reporter grep number\n\n1.4.2 / 2012-09-01\n==================\n\n  * add support to multiple `Mocha#globals()` calls, and strings\n  * add `mocha.reporter()` constructor support [jfirebaugh]\n  * add `mocha.timeout()`\n  * move query-string parser to utils.js\n  * move highlight code to utils.js\n  * fix third-party reporter support [exogen]\n  * fix client-side API to match node-side [jfirebaugh]\n  * fix mocha in iframe [joliss]\n\n1.4.1 / 2012-08-28\n==================\n\n  * add missing `Markdown` export\n  * fix `Mocha#grep()`, escape regexp strings\n  * fix reference error when `devicePixelRatio` is not defined. Closes #549\n\n1.4.0 / 2012-08-22\n==================\n\n  * add mkdir -p to `mocha init`. Closes #539\n  * add `.only()`. Closes #524\n  * add `.skip()`. Closes #524\n  * change str.trim() to use utils.trim(). Closes #533\n  * fix HTML progress indicator retina display\n  * fix url-encoding of click-to-grep HTML functionality\n\n1.3.2 / 2012-08-01\n==================\n\n  * fix exports double-execution regression. Closes #531\n\n1.3.1 / 2012-08-01\n==================\n\n  * add passes/failures toggling to HTML reporter\n  * add pending state to `xit()` and `xdescribe()` [Brian Moore]\n  * add the @charset \"UTF-8\"; to fix #522 with FireFox. [Jonathan Creamer]\n  * add border-bottom to #stats links\n  * add check for runnable in `Runner#uncaught()`. Closes #494\n  * add 0.4 and 0.6 back to travis.yml\n  * add `-E, --growl-errors` to growl on failures only\n  * add prefixes to debug() names. Closes #497\n  * add `Mocha#invert()` to js api\n  * change dot reporter to use sexy unicode dots\n  * fix error when clicking pending test in HTML reporter\n  * fix `make tm`\n\n1.3.0 / 2012-07-05\n==================\n\n  * add window scrolling to `HTML` reporter\n  * add v8 `--trace-*` option support\n  * add support for custom reports via `--reporter MODULE`\n  * add `--invert` switch to invert `--grep` matches\n  * fix export of `Nyan` reporter. Closes #495\n  * fix escaping of `HTML` suite titles. Closes #486\n  * fix `done()` called multiple times with an error test\n  * change `--grep` - regexp escape the input\n\n1.2.2 / 2012-06-28\n==================\n\n  * Added 0.8.0 support\n\n1.2.1 / 2012-06-25\n==================\n\n  * Added `this.test.error(err)` support to after each hooks. Closes #287\n  * Added: export top-level suite on global mocha object (mocha.suite). Closes #448\n  * Fixed `js` code block format error in markdown reporter\n  * Fixed deprecation warning when using `path.existsSync`\n  * Fixed --globals with wildcard\n  * Fixed chars in nyan when his head moves back\n  * Remove `--growl` from test/mocha.opts. Closes #289\n\n1.2.0 / 2012-06-17\n==================\n\n  * Added `nyan` reporter [Atsuya Takagi]\n  * Added `mocha init <path>` to copy client files\n  * Added \"specify\" synonym for \"it\" [domenic]\n  * Added global leak wildcard support [nathanbowser]\n  * Fixed runner emitter leak. closes #432\n  * Fixed omission of .js extension. Closes #454\n\n1.1.0 / 2012-05-30\n==================\n\n  * Added: check each `mocha(1)` arg for directories to walk\n  * Added `--recursive` [tricknotes]\n  * Added `context` for BDD [hokaccha]\n  * Added styling for new clickable titles\n  * Added clickable suite titles to HTML reporter\n  * Added warning when strings are thrown as errors\n  * Changed: green arrows again in HTML reporter styling\n  * Changed ul/li elements instead of divs for better copy-and-pasting [joliss]\n  * Fixed issue #325 - add better grep support to js api\n  * Fixed: save timer references to avoid Sinon interfering.\n\n1.0.3 / 2012-04-30\n==================\n\n  * Fixed string diff newlines\n  * Fixed: removed mocha.css target. Closes #401\n\n1.0.2 / 2012-04-25\n==================\n\n  * Added HTML reporter duration. Closes #47\n  * Fixed: one postMessage event listener [exogen]\n  * Fixed: allow --globals to be used multiple times. Closes #100 [brendannee]\n  * Fixed #158: removes jquery include from browser tests\n  * Fixed grep. Closes #372 [brendannee]\n  * Fixed #166 - When grepping don't display the empty suites\n  * Removed test/browser/style.css. Closes #385\n\n1.0.1 / 2012-04-04\n==================\n\n  * Fixed `.timeout()` in hooks\n  * Fixed: allow callback for `mocha.run()` in client version\n  * Fixed browser hook error display. Closes #361\n\n1.0.0 / 2012-03-24\n==================\n\n  * Added js API. Closes #265\n  * Added: initial run of tests with `--watch`. Closes #345\n  * Added: mark `location` as a global on the CS. Closes #311\n  * Added `markdown` reporter (github flavour)\n  * Added: scrolling menu to coverage.html. Closes #335\n  * Added source line to html report for Safari [Tyson Tate]\n  * Added \"min\" reporter, useful for `--watch` [Jakub Nešetřil]\n  * Added support for arbitrary compilers via . Closes #338 [Ian Young]\n  * Added Teamcity export to lib/reporters/index [Michael Riley]\n  * Fixed chopping of first char in error reporting. Closes #334 [reported by topfunky]\n  * Fixed terrible FF / Opera stack traces\n\n0.14.1 / 2012-03-06\n==================\n\n  * Added lib-cov to _.npmignore_\n  * Added reporter to `mocha.run([reporter])` as argument\n  * Added some margin-top to the HTML reporter\n  * Removed jQuery dependency\n  * Fixed `--watch`: purge require cache. Closes #266\n\n0.14.0 / 2012-03-01\n==================\n\n  * Added string diff support for terminal reporters\n\n0.13.0 / 2012-02-23\n==================\n\n  * Added preliminary test coverage support. Closes #5\n  * Added `HTMLCov` reporter\n  * Added `JSONCov` reporter [kunklejr]\n  * Added `xdescribe()` and `xit()` to the BDD interface. Closes #263 (docs   * Changed: make json reporter output pretty json\n  * Fixed node-inspector support, swapped `--debug` for `debug` to match node.\nneeded)\nCloses #247\n\n0.12.1 / 2012-02-14\n==================\n\n  * Added `npm docs mocha` support [TooTallNate]\n  * Added a `Context` object used for hook and test-case this. Closes #253\n  * Fixed `Suite#clone()` `.ctx` reference. Closes #262\n\n0.12.0 / 2012-02-02\n==================\n\n  * Added .coffee `--watch` support. Closes #242\n  * Added support to `--require` files relative to the CWD. Closes #241\n  * Added quick n dirty syntax highlighting. Closes #248\n  * Changed: made HTML progress indicator smaller\n  * Fixed xunit errors attribute [dhendo]\n\n0.10.2 / 2012-01-21\n==================\n\n  * Fixed suite count in reporter stats. Closes #222\n  * Fixed `done()` after timeout error reporting [Phil Sung]\n  * Changed the 0-based errors to 1\n\n0.10.1 / 2012-01-17\n==================\n\n  * Added support for node 0.7.x\n  * Fixed absolute path support. Closes #215 [kompiro]\n  * Fixed `--no-colors` option [Jussi Virtanen]\n  * Fixed Arial CSS typo in the correct file\n\n0.10.0 / 2012-01-13\n==================\n\n  * Added `-b, --bail` to exit on first exception [guillermo]\n  * Added support for `-gc` / `--expose-gc` [TooTallNate]\n  * Added `qunit`-inspired interface\n  * Added MIT LICENSE. Closes #194\n  * Added: `--watch` all .js in the CWD. Closes #139\n  * Fixed `self.test` reference in runner. Closes #189\n  * Fixed double reporting of uncaught exceptions after timeout. Closes #195\n\n0.8.2 / 2012-01-05\n==================\n\n  * Added test-case context support. Closes #113\n  * Fixed exit status. Closes #187\n  * Update commander. Closes #190\n\n0.8.1 / 2011-12-30\n==================\n\n  * Fixed reporting of uncaught exceptions. Closes #183\n  * Fixed error message defaulting [indutny]\n  * Changed mocha(1) from bash to node for windows [Nathan Rajlich]\n\n0.8.0 / 2011-12-28\n==================\n\n  * Added `XUnit` reporter [FeeFighters/visionmedia]\n  * Added `say(1)` notification support [Maciej Małecki]\n  * Changed: fail when done() is invoked with a non-Error. Closes #171\n  * Fixed `err.stack`, defaulting to message. Closes #180\n  * Fixed: `make tm` mkdir -p the dest. Closes #137\n  * Fixed mocha(1) --help bin name\n  * Fixed `-d` for `--debug` support\n\n0.7.1 / 2011-12-22\n==================\n\n  * Removed `mocha-debug(1)`, use `mocha --debug`\n  * Fixed CWD relative requires\n  * Fixed growl issue on windows [Raynos]\n  * Fixed: platform specific line endings [TooTallNate]\n  * Fixed: escape strings in HTML reporter. Closes #164\n\n0.7.0 / 2011-12-18\n==================\n\n  * Added support for IE{7,8} [guille]\n  * Changed: better browser nextTick implementation [guille]\n\n0.6.0 / 2011-12-18\n==================\n\n  * Added setZeroTimeout timeout for browser (nicer stack traces). Closes #153\n  * Added \"view source\" on hover for HTML reporter to make it obvious\n  * Changed: replace custom growl with growl lib\n  * Fixed duplicate reporting for HTML reporter. Closes #154\n  * Fixed silent hook errors in the HTML reporter. Closes #150\n\n0.5.0 / 2011-12-14\n==================\n\n  * Added: push node_modules directory onto module.paths for relative require Closes #93\n  * Added teamcity reporter [blindsey]\n  * Fixed: recover from uncaught exceptions for tests. Closes #94\n  * Fixed: only emit \"test end\" for uncaught within test, not hook\n\n0.4.0 / 2011-12-14\n==================\n\n  * Added support for test-specific timeouts via `this.timeout(0)`. Closes #134\n  * Added guillermo's client-side EventEmitter. Closes #132\n  * Added progress indicator to the HTML reporter\n  * Fixed slow browser tests. Closes #135\n  * Fixed \"suite\" color for light terminals\n  * Fixed `require()` leak spotted by [guillermo]\n\n0.3.6 / 2011-12-09\n==================\n\n  * Removed suite merging (for now)\n\n0.3.5 / 2011-12-08\n==================\n\n  * Added support for `window.onerror` [guillermo]\n  * Fixed: clear timeout on uncaught exceptions. Closes #131 [guillermo]\n  * Added `mocha.css` to PHONY list.\n  * Added `mocha.js` to PHONY list.\n\n0.3.4 / 2011-12-08\n==================\n\n  * Added: allow `done()` to be called with non-Error\n  * Added: return Runner from `mocha.run()`. Closes #126\n  * Fixed: run afterEach even on failures. Closes #125\n  * Fixed clobbering of current runnable. Closes #121\n\n0.3.3 / 2011-12-08\n==================\n\n  * Fixed hook timeouts. Closes #120\n  * Fixed uncaught exceptions in hooks\n\n0.3.2 / 2011-12-05\n==================\n\n  * Fixed weird reporting when `err.message` is not present\n\n0.3.1 / 2011-12-04\n==================\n\n  * Fixed hook event emitter leak. Closes #117\n  * Fixed: export `Spec` constructor. Closes #116\n\n0.3.0 / 2011-12-04\n==================\n\n  * Added `-w, --watch`. Closes #72\n  * Added `--ignore-leaks` to ignore global leak checking\n  * Added browser `?grep=pattern` support\n  * Added `--globals <names>` to specify accepted globals. Closes #99\n  * Fixed `mocha-debug(1)` on some systems. Closes #232\n  * Fixed growl total, use `runner.total`\n\n0.2.0 / 2011-11-30\n==================\n\n  * Added `--globals <names>` to specify accepted globals. Closes #99\n  * Fixed funky highlighting of messages. Closes #97\n  * Fixed `mocha-debug(1)`. Closes #232\n  * Fixed growl total, use runner.total\n\n0.1.0 / 2011-11-29\n==================\n\n  * Added `suiteSetup` and `suiteTeardown` to TDD interface [David Henderson]\n  * Added growl icons. Closes #84\n  * Fixed coffee-script support\n\n0.0.8 / 2011-11-25\n==================\n\n  * Fixed: use `Runner#total` for accurate reporting\n\n0.0.7 / 2011-11-25\n==================\n\n  * Added `Hook`\n  * Added `Runnable`\n  * Changed: `Test` is `Runnable`\n  * Fixed global leak reporting in hooks\n  * Fixed: > 2 calls to done() only report the error once\n  * Fixed: clear timer on failure. Closes #80\n\n0.0.6 / 2011-11-25\n==================\n\n  * Fixed return on immediate async error. Closes #80\n\n0.0.5 / 2011-11-24\n==================\n\n  * Fixed: make mocha.opts whitespace less picky [kkaefer]\n\n0.0.4 / 2011-11-24\n==================\n\n  * Added `--interfaces`\n  * Added `--reporters`\n  * Added `-c, --colors`. Closes #69\n  * Fixed hook timeouts\n\n0.0.3 / 2011-11-23\n==================\n\n  * Added `-C, --no-colors` to explicitly disable\n  * Added coffee-script support\n\n0.0.2 / 2011-11-22\n==================\n\n  * Fixed global leak detection due to Safari bind() change\n  * Fixed: escape html entities in Doc reporter\n  * Fixed: escape html entities in HTML reporter\n  * Fixed pending test support for HTML reporter. Closes #66\n\n0.0.1 / 2011-11-22\n==================\n\n  * Added `--timeout` second shorthand support, ex `--timeout 3s`.\n  * Fixed \"test end\" event for uncaughtExceptions. Closes #61\n\n0.0.1-alpha6 / 2011-11-19\n==================\n\n  * Added travis CI support (needs enabling when public)\n  * Added preliminary browser support\n  * Added `make mocha.css` target. Closes #45\n  * Added stack trace to TAP errors. Closes #52\n  * Renamed tearDown to teardown. Closes #49\n  * Fixed: cascading hooksc. Closes #30\n  * Fixed some colors for non-tty\n  * Fixed errors thrown in sync test-cases due to nextTick\n  * Fixed Base.window.width... again give precedence to 0.6.x\n\n0.0.1-alpha5 / 2011-11-17\n==================\n\n  * Added `doc` reporter. Closes #33\n  * Added suite merging. Closes #28\n  * Added TextMate bundle and `make tm`. Closes #20\n\n0.0.1-alpha4 / 2011-11-15\n==================\n\n  * Fixed getWindowSize() for 0.4.x\n\n0.0.1-alpha3 / 2011-11-15\n==================\n\n  * Added `-s, --slow <ms>` to specify \"slow\" test threshold\n  * Added `mocha-debug(1)`\n  * Added `mocha.opts` support. Closes #31\n  * Added: default [files] to _test/*.js_\n  * Added protection against multiple calls to `done()`. Closes #35\n  * Changed: bright yellow for slow Dot reporter tests\n\n0.0.1-alpha1 / 2011-11-08\n==================\n\n  * Missed this one :)\n\n0.0.1-alpha1 / 2011-11-08\n==================\n\n  * Initial release\n"
  },
  {
    "path": "bower_components/mocha/LICENSE",
    "content": "(The MIT License)\n\nCopyright (c) 2011-2015 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "bower_components/mocha/README.md",
    "content": "[![Build Status](https://api.travis-ci.org/mochajs/mocha.svg?branch=master)](http://travis-ci.org/mochajs/mocha) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/mochajs/mocha?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)\n\n  [![Mocha test framework](http://f.cl.ly/items/3l1k0n2A1U3M1I1L210p/Screen%20Shot%202012-02-24%20at%202.21.43%20PM.png)](http://mochajs.org)\n\n  Mocha is a simple, flexible, fun JavaScript test framework for node.js and the browser. For more information view the [documentation](http://mochajs.org).\n\n## Links\n\n  - [Google Group](http://groups.google.com/group/mochajs)\n  - [Wiki](https://github.com/mochajs/mocha/wiki)\n  - Mocha [Extensions and reporters](https://github.com/mochajs/mocha/wiki)\n"
  },
  {
    "path": "bower_components/mocha/bower.json",
    "content": "{\n  \"name\": \"mocha\",\n  \"homepage\": \"http://mocha.github.io/mocha\",\n  \"description\": \"simple, flexible, fun test framework\",\n  \"authors\": [\n    \"TJ Holowaychuk <tj@vision-media.ca>\",\n    \"Joshua Appelman <joshua@jbna.nl>\",\n    \"Oleg Gaidarenko <markelog@gmail.com>\",\n    \"Christoffer Hallas <christoffer.hallas@gmail.com>\",\n    \"Christopher Hiller <chiller@badwing.com>\",\n    \"Travis Jeffery <tj@travisjeffery.com>\",\n    \"Johnathan Ong <me@jongleberry.com>\",\n    \"Guillermo Rauch <rauchg@gmail.com>\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/mochajs/mocha.git\"\n  },\n  \"main\": [\n    \"mocha.js\",\n    \"mocha.css\"\n  ],\n  \"ignore\": [\n    \"bin\",\n    \"editors\",\n    \"images\",\n    \"lib\",\n    \"support\",\n    \"test\",\n    \".gitignore\",\n    \".npmignore\",\n    \".travis.yml\",\n    \"component.json\",\n    \"index.js\",\n    \"Makefile\",\n    \"package.json\"\n  ],\n  \"keywords\": [\n    \"mocha\",\n    \"test\",\n    \"bdd\",\n    \"tdd\",\n    \"tap\"\n  ],\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "bower_components/mocha/mocha.css",
    "content": "@charset \"utf-8\";\n\nbody {\n  margin:0;\n}\n\n#mocha {\n  font: 20px/1.5 \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  margin: 60px 50px;\n}\n\n#mocha ul,\n#mocha li {\n  margin: 0;\n  padding: 0;\n}\n\n#mocha ul {\n  list-style: none;\n}\n\n#mocha h1,\n#mocha h2 {\n  margin: 0;\n}\n\n#mocha h1 {\n  margin-top: 15px;\n  font-size: 1em;\n  font-weight: 200;\n}\n\n#mocha h1 a {\n  text-decoration: none;\n  color: inherit;\n}\n\n#mocha h1 a:hover {\n  text-decoration: underline;\n}\n\n#mocha .suite .suite h1 {\n  margin-top: 0;\n  font-size: .8em;\n}\n\n#mocha .hidden {\n  display: none;\n}\n\n#mocha h2 {\n  font-size: 12px;\n  font-weight: normal;\n  cursor: pointer;\n}\n\n#mocha .suite {\n  margin-left: 15px;\n}\n\n#mocha .test {\n  margin-left: 15px;\n  overflow: hidden;\n}\n\n#mocha .test.pending:hover h2::after {\n  content: '(pending)';\n  font-family: arial, sans-serif;\n}\n\n#mocha .test.pass.medium .duration {\n  background: #c09853;\n}\n\n#mocha .test.pass.slow .duration {\n  background: #b94a48;\n}\n\n#mocha .test.pass::before {\n  content: '✓';\n  font-size: 12px;\n  display: block;\n  float: left;\n  margin-right: 5px;\n  color: #00d6b2;\n}\n\n#mocha .test.pass .duration {\n  font-size: 9px;\n  margin-left: 5px;\n  padding: 2px 5px;\n  color: #fff;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.2);\n  -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.2);\n  box-shadow: inset 0 1px 1px rgba(0,0,0,.2);\n  -webkit-border-radius: 5px;\n  -moz-border-radius: 5px;\n  -ms-border-radius: 5px;\n  -o-border-radius: 5px;\n  border-radius: 5px;\n}\n\n#mocha .test.pass.fast .duration {\n  display: none;\n}\n\n#mocha .test.pending {\n  color: #0b97c4;\n}\n\n#mocha .test.pending::before {\n  content: '◦';\n  color: #0b97c4;\n}\n\n#mocha .test.fail {\n  color: #c00;\n}\n\n#mocha .test.fail pre {\n  color: black;\n}\n\n#mocha .test.fail::before {\n  content: '✖';\n  font-size: 12px;\n  display: block;\n  float: left;\n  margin-right: 5px;\n  color: #c00;\n}\n\n#mocha .test pre.error {\n  color: #c00;\n  max-height: 300px;\n  overflow: auto;\n}\n\n#mocha .test .html-error {\n  overflow: auto;\n  color: black;\n  line-height: 1.5;\n  display: block;\n  float: left;\n  clear: left;\n  font: 12px/1.5 monaco, monospace;\n  margin: 5px;\n  padding: 15px;\n  border: 1px solid #eee;\n  max-width: 85%; /*(1)*/\n  max-width: calc(100% - 42px); /*(2)*/\n  max-height: 300px;\n  word-wrap: break-word;\n  border-bottom-color: #ddd;\n  -webkit-border-radius: 3px;\n  -webkit-box-shadow: 0 1px 3px #eee;\n  -moz-border-radius: 3px;\n  -moz-box-shadow: 0 1px 3px #eee;\n  border-radius: 3px;\n}\n\n#mocha .test .html-error pre.error {\n  border: none;\n  -webkit-border-radius: none;\n  -webkit-box-shadow: none;\n  -moz-border-radius: none;\n  -moz-box-shadow: none;\n  padding: 0;\n  margin: 0;\n  margin-top: 18px;\n  max-height: none;\n}\n\n/**\n * (1): approximate for browsers not supporting calc\n * (2): 42 = 2*15 + 2*10 + 2*1 (padding + margin + border)\n *      ^^ seriously\n */\n#mocha .test pre {\n  display: block;\n  float: left;\n  clear: left;\n  font: 12px/1.5 monaco, monospace;\n  margin: 5px;\n  padding: 15px;\n  border: 1px solid #eee;\n  max-width: 85%; /*(1)*/\n  max-width: calc(100% - 42px); /*(2)*/\n  word-wrap: break-word;\n  border-bottom-color: #ddd;\n  -webkit-border-radius: 3px;\n  -webkit-box-shadow: 0 1px 3px #eee;\n  -moz-border-radius: 3px;\n  -moz-box-shadow: 0 1px 3px #eee;\n  border-radius: 3px;\n}\n\n#mocha .test h2 {\n  position: relative;\n}\n\n#mocha .test a.replay {\n  position: absolute;\n  top: 3px;\n  right: 0;\n  text-decoration: none;\n  vertical-align: middle;\n  display: block;\n  width: 15px;\n  height: 15px;\n  line-height: 15px;\n  text-align: center;\n  background: #eee;\n  font-size: 15px;\n  -moz-border-radius: 15px;\n  border-radius: 15px;\n  -webkit-transition: opacity 200ms;\n  -moz-transition: opacity 200ms;\n  transition: opacity 200ms;\n  opacity: 0.3;\n  color: #888;\n}\n\n#mocha .test:hover a.replay {\n  opacity: 1;\n}\n\n#mocha-report.pass .test.fail {\n  display: none;\n}\n\n#mocha-report.fail .test.pass {\n  display: none;\n}\n\n#mocha-report.pending .test.pass,\n#mocha-report.pending .test.fail {\n  display: none;\n}\n#mocha-report.pending .test.pass.pending {\n  display: block;\n}\n\n#mocha-error {\n  color: #c00;\n  font-size: 1.5em;\n  font-weight: 100;\n  letter-spacing: 1px;\n}\n\n#mocha-stats {\n  position: fixed;\n  top: 15px;\n  right: 10px;\n  font-size: 12px;\n  margin: 0;\n  color: #888;\n  z-index: 1;\n}\n\n#mocha-stats .progress {\n  float: right;\n  padding-top: 0;\n}\n\n#mocha-stats em {\n  color: black;\n}\n\n#mocha-stats a {\n  text-decoration: none;\n  color: inherit;\n}\n\n#mocha-stats a:hover {\n  border-bottom: 1px solid #eee;\n}\n\n#mocha-stats li {\n  display: inline-block;\n  margin: 0 5px;\n  list-style: none;\n  padding-top: 11px;\n}\n\n#mocha-stats canvas {\n  width: 40px;\n  height: 40px;\n}\n\n#mocha code .comment { color: #ddd; }\n#mocha code .init { color: #2f6fad; }\n#mocha code .string { color: #5890ad; }\n#mocha code .keyword { color: #8a6343; }\n#mocha code .number { color: #2f6fad; }\n\n@media screen and (max-device-width: 480px) {\n  #mocha {\n    margin: 60px 0px;\n  }\n\n  #mocha #stats {\n    position: absolute;\n  }\n}\n"
  },
  {
    "path": "bower_components/mocha/mocha.js",
    "content": "(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n(function (process){\nmodule.exports = process.env.COV\n  ? require('./lib-cov/mocha')\n  : require('./lib/mocha');\n\n}).call(this,require('_process'))\n},{\"./lib-cov/mocha\":undefined,\"./lib/mocha\":14,\"_process\":51}],2:[function(require,module,exports){\n/* eslint-disable no-unused-vars */\nmodule.exports = function(type) {\n  return function() {};\n};\n\n},{}],3:[function(require,module,exports){\n/**\n * Module exports.\n */\n\nexports.EventEmitter = EventEmitter;\n\n/**\n * Object#hasOwnProperty reference.\n */\nvar objToString = Object.prototype.toString;\n\n/**\n * Check if a value is an array.\n *\n * @api private\n * @param {*} val The value to test.\n * @return {boolean} true if the value is a boolean, otherwise false.\n */\nfunction isArray(val) {\n  return objToString.call(val) === '[object Array]';\n}\n\n/**\n * Event emitter constructor.\n *\n * @api public\n */\nfunction EventEmitter() {}\n\n/**\n * Add a listener.\n *\n * @api public\n * @param {string} name Event name.\n * @param {Function} fn Event handler.\n * @return {EventEmitter} Emitter instance.\n */\nEventEmitter.prototype.on = function(name, fn) {\n  if (!this.$events) {\n    this.$events = {};\n  }\n\n  if (!this.$events[name]) {\n    this.$events[name] = fn;\n  } else if (isArray(this.$events[name])) {\n    this.$events[name].push(fn);\n  } else {\n    this.$events[name] = [this.$events[name], fn];\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n/**\n * Adds a volatile listener.\n *\n * @api public\n * @param {string} name Event name.\n * @param {Function} fn Event handler.\n * @return {EventEmitter} Emitter instance.\n */\nEventEmitter.prototype.once = function(name, fn) {\n  var self = this;\n\n  function on() {\n    self.removeListener(name, on);\n    fn.apply(this, arguments);\n  }\n\n  on.listener = fn;\n  this.on(name, on);\n\n  return this;\n};\n\n/**\n * Remove a listener.\n *\n * @api public\n * @param {string} name Event name.\n * @param {Function} fn Event handler.\n * @return {EventEmitter} Emitter instance.\n */\nEventEmitter.prototype.removeListener = function(name, fn) {\n  if (this.$events && this.$events[name]) {\n    var list = this.$events[name];\n\n    if (isArray(list)) {\n      var pos = -1;\n\n      for (var i = 0, l = list.length; i < l; i++) {\n        if (list[i] === fn || (list[i].listener && list[i].listener === fn)) {\n          pos = i;\n          break;\n        }\n      }\n\n      if (pos < 0) {\n        return this;\n      }\n\n      list.splice(pos, 1);\n\n      if (!list.length) {\n        delete this.$events[name];\n      }\n    } else if (list === fn || (list.listener && list.listener === fn)) {\n      delete this.$events[name];\n    }\n  }\n\n  return this;\n};\n\n/**\n * Remove all listeners for an event.\n *\n * @api public\n * @param {string} name Event name.\n * @return {EventEmitter} Emitter instance.\n */\nEventEmitter.prototype.removeAllListeners = function(name) {\n  if (name === undefined) {\n    this.$events = {};\n    return this;\n  }\n\n  if (this.$events && this.$events[name]) {\n    this.$events[name] = null;\n  }\n\n  return this;\n};\n\n/**\n * Get all listeners for a given event.\n *\n * @api public\n * @param {string} name Event name.\n * @return {EventEmitter} Emitter instance.\n */\nEventEmitter.prototype.listeners = function(name) {\n  if (!this.$events) {\n    this.$events = {};\n  }\n\n  if (!this.$events[name]) {\n    this.$events[name] = [];\n  }\n\n  if (!isArray(this.$events[name])) {\n    this.$events[name] = [this.$events[name]];\n  }\n\n  return this.$events[name];\n};\n\n/**\n * Emit an event.\n *\n * @api public\n * @param {string} name Event name.\n * @return {boolean} true if at least one handler was invoked, else false.\n */\nEventEmitter.prototype.emit = function(name) {\n  if (!this.$events) {\n    return false;\n  }\n\n  var handler = this.$events[name];\n\n  if (!handler) {\n    return false;\n  }\n\n  var args = Array.prototype.slice.call(arguments, 1);\n\n  if (typeof handler === 'function') {\n    handler.apply(this, args);\n  } else if (isArray(handler)) {\n    var listeners = handler.slice();\n\n    for (var i = 0, l = listeners.length; i < l; i++) {\n      listeners[i].apply(this, args);\n    }\n  } else {\n    return false;\n  }\n\n  return true;\n};\n\n},{}],4:[function(require,module,exports){\n/**\n * Expose `Progress`.\n */\n\nmodule.exports = Progress;\n\n/**\n * Initialize a new `Progress` indicator.\n */\nfunction Progress() {\n  this.percent = 0;\n  this.size(0);\n  this.fontSize(11);\n  this.font('helvetica, arial, sans-serif');\n}\n\n/**\n * Set progress size to `size`.\n *\n * @api public\n * @param {number} size\n * @return {Progress} Progress instance.\n */\nProgress.prototype.size = function(size) {\n  this._size = size;\n  return this;\n};\n\n/**\n * Set text to `text`.\n *\n * @api public\n * @param {string} text\n * @return {Progress} Progress instance.\n */\nProgress.prototype.text = function(text) {\n  this._text = text;\n  return this;\n};\n\n/**\n * Set font size to `size`.\n *\n * @api public\n * @param {number} size\n * @return {Progress} Progress instance.\n */\nProgress.prototype.fontSize = function(size) {\n  this._fontSize = size;\n  return this;\n};\n\n/**\n * Set font to `family`.\n *\n * @param {string} family\n * @return {Progress} Progress instance.\n */\nProgress.prototype.font = function(family) {\n  this._font = family;\n  return this;\n};\n\n/**\n * Update percentage to `n`.\n *\n * @param {number} n\n * @return {Progress} Progress instance.\n */\nProgress.prototype.update = function(n) {\n  this.percent = n;\n  return this;\n};\n\n/**\n * Draw on `ctx`.\n *\n * @param {CanvasRenderingContext2d} ctx\n * @return {Progress} Progress instance.\n */\nProgress.prototype.draw = function(ctx) {\n  try {\n    var percent = Math.min(this.percent, 100);\n    var size = this._size;\n    var half = size / 2;\n    var x = half;\n    var y = half;\n    var rad = half - 1;\n    var fontSize = this._fontSize;\n\n    ctx.font = fontSize + 'px ' + this._font;\n\n    var angle = Math.PI * 2 * (percent / 100);\n    ctx.clearRect(0, 0, size, size);\n\n    // outer circle\n    ctx.strokeStyle = '#9f9f9f';\n    ctx.beginPath();\n    ctx.arc(x, y, rad, 0, angle, false);\n    ctx.stroke();\n\n    // inner circle\n    ctx.strokeStyle = '#eee';\n    ctx.beginPath();\n    ctx.arc(x, y, rad - 1, 0, angle, true);\n    ctx.stroke();\n\n    // text\n    var text = this._text || (percent | 0) + '%';\n    var w = ctx.measureText(text).width;\n\n    ctx.fillText(text, x - w / 2 + 1, y + fontSize / 2 - 1);\n  } catch (err) {\n    // don't fail if we can't render progress\n  }\n  return this;\n};\n\n},{}],5:[function(require,module,exports){\n(function (global){\nexports.isatty = function isatty() {\n  return true;\n};\n\nexports.getWindowSize = function getWindowSize() {\n  if ('innerHeight' in global) {\n    return [global.innerHeight, global.innerWidth];\n  }\n  // In a Web Worker, the DOM Window is not available.\n  return [640, 480];\n};\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],6:[function(require,module,exports){\n/**\n * Expose `Context`.\n */\n\nmodule.exports = Context;\n\n/**\n * Initialize a new `Context`.\n *\n * @api private\n */\nfunction Context() {}\n\n/**\n * Set or get the context `Runnable` to `runnable`.\n *\n * @api private\n * @param {Runnable} runnable\n * @return {Context}\n */\nContext.prototype.runnable = function(runnable) {\n  if (!arguments.length) {\n    return this._runnable;\n  }\n  this.test = this._runnable = runnable;\n  return this;\n};\n\n/**\n * Set test timeout `ms`.\n *\n * @api private\n * @param {number} ms\n * @return {Context} self\n */\nContext.prototype.timeout = function(ms) {\n  if (!arguments.length) {\n    return this.runnable().timeout();\n  }\n  this.runnable().timeout(ms);\n  return this;\n};\n\n/**\n * Set test timeout `enabled`.\n *\n * @api private\n * @param {boolean} enabled\n * @return {Context} self\n */\nContext.prototype.enableTimeouts = function(enabled) {\n  this.runnable().enableTimeouts(enabled);\n  return this;\n};\n\n/**\n * Set test slowness threshold `ms`.\n *\n * @api private\n * @param {number} ms\n * @return {Context} self\n */\nContext.prototype.slow = function(ms) {\n  this.runnable().slow(ms);\n  return this;\n};\n\n/**\n * Mark a test as skipped.\n *\n * @api private\n * @return {Context} self\n */\nContext.prototype.skip = function() {\n  this.runnable().skip();\n  return this;\n};\n\n/**\n * Inspect the context void of `._runnable`.\n *\n * @api private\n * @return {string}\n */\nContext.prototype.inspect = function() {\n  return JSON.stringify(this, function(key, val) {\n    return key === 'runnable' || key === 'test' ? undefined : val;\n  }, 2);\n};\n\n},{}],7:[function(require,module,exports){\n/**\n * Module dependencies.\n */\n\nvar Runnable = require('./runnable');\nvar inherits = require('./utils').inherits;\n\n/**\n * Expose `Hook`.\n */\n\nmodule.exports = Hook;\n\n/**\n * Initialize a new `Hook` with the given `title` and callback `fn`.\n *\n * @param {String} title\n * @param {Function} fn\n * @api private\n */\nfunction Hook(title, fn) {\n  Runnable.call(this, title, fn);\n  this.type = 'hook';\n}\n\n/**\n * Inherit from `Runnable.prototype`.\n */\ninherits(Hook, Runnable);\n\n/**\n * Get or set the test `err`.\n *\n * @param {Error} err\n * @return {Error}\n * @api public\n */\nHook.prototype.error = function(err) {\n  if (!arguments.length) {\n    err = this._error;\n    this._error = null;\n    return err;\n  }\n\n  this._error = err;\n};\n\n},{\"./runnable\":35,\"./utils\":39}],8:[function(require,module,exports){\n/**\n * Module dependencies.\n */\n\nvar Suite = require('../suite');\nvar Test = require('../test');\nvar escapeRe = require('escape-string-regexp');\n\n/**\n * BDD-style interface:\n *\n *      describe('Array', function() {\n *        describe('#indexOf()', function() {\n *          it('should return -1 when not present', function() {\n *            // ...\n *          });\n *\n *          it('should return the index when present', function() {\n *            // ...\n *          });\n *        });\n *      });\n *\n * @param {Suite} suite Root suite.\n */\nmodule.exports = function(suite) {\n  var suites = [suite];\n\n  suite.on('pre-require', function(context, file, mocha) {\n    var common = require('./common')(suites, context);\n\n    context.before = common.before;\n    context.after = common.after;\n    context.beforeEach = common.beforeEach;\n    context.afterEach = common.afterEach;\n    context.run = mocha.options.delay && common.runWithSuite(suite);\n    /**\n     * Describe a \"suite\" with the given `title`\n     * and callback `fn` containing nested suites\n     * and/or tests.\n     */\n\n    context.describe = context.context = function(title, fn) {\n      var suite = Suite.create(suites[0], title);\n      suite.file = file;\n      suites.unshift(suite);\n      fn.call(suite);\n      suites.shift();\n      return suite;\n    };\n\n    /**\n     * Pending describe.\n     */\n\n    context.xdescribe = context.xcontext = context.describe.skip = function(title, fn) {\n      var suite = Suite.create(suites[0], title);\n      suite.pending = true;\n      suites.unshift(suite);\n      fn.call(suite);\n      suites.shift();\n    };\n\n    /**\n     * Exclusive suite.\n     */\n\n    context.describe.only = function(title, fn) {\n      var suite = context.describe(title, fn);\n      mocha.grep(suite.fullTitle());\n      return suite;\n    };\n\n    /**\n     * Describe a specification or test-case\n     * with the given `title` and callback `fn`\n     * acting as a thunk.\n     */\n\n    context.it = context.specify = function(title, fn) {\n      var suite = suites[0];\n      if (suite.pending) {\n        fn = null;\n      }\n      var test = new Test(title, fn);\n      test.file = file;\n      suite.addTest(test);\n      return test;\n    };\n\n    /**\n     * Exclusive test-case.\n     */\n\n    context.it.only = function(title, fn) {\n      var test = context.it(title, fn);\n      var reString = '^' + escapeRe(test.fullTitle()) + '$';\n      mocha.grep(new RegExp(reString));\n      return test;\n    };\n\n    /**\n     * Pending test case.\n     */\n\n    context.xit = context.xspecify = context.it.skip = function(title) {\n      context.it(title);\n    };\n  });\n};\n\n},{\"../suite\":37,\"../test\":38,\"./common\":9,\"escape-string-regexp\":68}],9:[function(require,module,exports){\n'use strict';\n\n/**\n * Functions common to more than one interface.\n *\n * @param {Suite[]} suites\n * @param {Context} context\n * @return {Object} An object containing common functions.\n */\nmodule.exports = function(suites, context) {\n  return {\n    /**\n     * This is only present if flag --delay is passed into Mocha. It triggers\n     * root suite execution.\n     *\n     * @param {Suite} suite The root wuite.\n     * @return {Function} A function which runs the root suite\n     */\n    runWithSuite: function runWithSuite(suite) {\n      return function run() {\n        suite.run();\n      };\n    },\n\n    /**\n     * Execute before running tests.\n     *\n     * @param {string} name\n     * @param {Function} fn\n     */\n    before: function(name, fn) {\n      suites[0].beforeAll(name, fn);\n    },\n\n    /**\n     * Execute after running tests.\n     *\n     * @param {string} name\n     * @param {Function} fn\n     */\n    after: function(name, fn) {\n      suites[0].afterAll(name, fn);\n    },\n\n    /**\n     * Execute before each test case.\n     *\n     * @param {string} name\n     * @param {Function} fn\n     */\n    beforeEach: function(name, fn) {\n      suites[0].beforeEach(name, fn);\n    },\n\n    /**\n     * Execute after each test case.\n     *\n     * @param {string} name\n     * @param {Function} fn\n     */\n    afterEach: function(name, fn) {\n      suites[0].afterEach(name, fn);\n    },\n\n    test: {\n      /**\n       * Pending test case.\n       *\n       * @param {string} title\n       */\n      skip: function(title) {\n        context.test(title);\n      }\n    }\n  };\n};\n\n},{}],10:[function(require,module,exports){\n/**\n * Module dependencies.\n */\n\nvar Suite = require('../suite');\nvar Test = require('../test');\n\n/**\n * TDD-style interface:\n *\n *     exports.Array = {\n *       '#indexOf()': {\n *         'should return -1 when the value is not present': function() {\n *\n *         },\n *\n *         'should return the correct index when the value is present': function() {\n *\n *         }\n *       }\n *     };\n *\n * @param {Suite} suite Root suite.\n */\nmodule.exports = function(suite) {\n  var suites = [suite];\n\n  suite.on('require', visit);\n\n  function visit(obj, file) {\n    var suite;\n    for (var key in obj) {\n      if (typeof obj[key] === 'function') {\n        var fn = obj[key];\n        switch (key) {\n          case 'before':\n            suites[0].beforeAll(fn);\n            break;\n          case 'after':\n            suites[0].afterAll(fn);\n            break;\n          case 'beforeEach':\n            suites[0].beforeEach(fn);\n            break;\n          case 'afterEach':\n            suites[0].afterEach(fn);\n            break;\n          default:\n            var test = new Test(key, fn);\n            test.file = file;\n            suites[0].addTest(test);\n        }\n      } else {\n        suite = Suite.create(suites[0], key);\n        suites.unshift(suite);\n        visit(obj[key]);\n        suites.shift();\n      }\n    }\n  }\n};\n\n},{\"../suite\":37,\"../test\":38}],11:[function(require,module,exports){\nexports.bdd = require('./bdd');\nexports.tdd = require('./tdd');\nexports.qunit = require('./qunit');\nexports.exports = require('./exports');\n\n},{\"./bdd\":8,\"./exports\":10,\"./qunit\":12,\"./tdd\":13}],12:[function(require,module,exports){\n/**\n * Module dependencies.\n */\n\nvar Suite = require('../suite');\nvar Test = require('../test');\nvar escapeRe = require('escape-string-regexp');\n\n/**\n * QUnit-style interface:\n *\n *     suite('Array');\n *\n *     test('#length', function() {\n *       var arr = [1,2,3];\n *       ok(arr.length == 3);\n *     });\n *\n *     test('#indexOf()', function() {\n *       var arr = [1,2,3];\n *       ok(arr.indexOf(1) == 0);\n *       ok(arr.indexOf(2) == 1);\n *       ok(arr.indexOf(3) == 2);\n *     });\n *\n *     suite('String');\n *\n *     test('#length', function() {\n *       ok('foo'.length == 3);\n *     });\n *\n * @param {Suite} suite Root suite.\n */\nmodule.exports = function(suite) {\n  var suites = [suite];\n\n  suite.on('pre-require', function(context, file, mocha) {\n    var common = require('./common')(suites, context);\n\n    context.before = common.before;\n    context.after = common.after;\n    context.beforeEach = common.beforeEach;\n    context.afterEach = common.afterEach;\n    context.run = mocha.options.delay && common.runWithSuite(suite);\n    /**\n     * Describe a \"suite\" with the given `title`.\n     */\n\n    context.suite = function(title) {\n      if (suites.length > 1) {\n        suites.shift();\n      }\n      var suite = Suite.create(suites[0], title);\n      suite.file = file;\n      suites.unshift(suite);\n      return suite;\n    };\n\n    /**\n     * Exclusive test-case.\n     */\n\n    context.suite.only = function(title, fn) {\n      var suite = context.suite(title, fn);\n      mocha.grep(suite.fullTitle());\n    };\n\n    /**\n     * Describe a specification or test-case\n     * with the given `title` and callback `fn`\n     * acting as a thunk.\n     */\n\n    context.test = function(title, fn) {\n      var test = new Test(title, fn);\n      test.file = file;\n      suites[0].addTest(test);\n      return test;\n    };\n\n    /**\n     * Exclusive test-case.\n     */\n\n    context.test.only = function(title, fn) {\n      var test = context.test(title, fn);\n      var reString = '^' + escapeRe(test.fullTitle()) + '$';\n      mocha.grep(new RegExp(reString));\n    };\n\n    context.test.skip = common.test.skip;\n  });\n};\n\n},{\"../suite\":37,\"../test\":38,\"./common\":9,\"escape-string-regexp\":68}],13:[function(require,module,exports){\n/**\n * Module dependencies.\n */\n\nvar Suite = require('../suite');\nvar Test = require('../test');\nvar escapeRe = require('escape-string-regexp');\n\n/**\n * TDD-style interface:\n *\n *      suite('Array', function() {\n *        suite('#indexOf()', function() {\n *          suiteSetup(function() {\n *\n *          });\n *\n *          test('should return -1 when not present', function() {\n *\n *          });\n *\n *          test('should return the index when present', function() {\n *\n *          });\n *\n *          suiteTeardown(function() {\n *\n *          });\n *        });\n *      });\n *\n * @param {Suite} suite Root suite.\n */\nmodule.exports = function(suite) {\n  var suites = [suite];\n\n  suite.on('pre-require', function(context, file, mocha) {\n    var common = require('./common')(suites, context);\n\n    context.setup = common.beforeEach;\n    context.teardown = common.afterEach;\n    context.suiteSetup = common.before;\n    context.suiteTeardown = common.after;\n    context.run = mocha.options.delay && common.runWithSuite(suite);\n\n    /**\n     * Describe a \"suite\" with the given `title` and callback `fn` containing\n     * nested suites and/or tests.\n     */\n    context.suite = function(title, fn) {\n      var suite = Suite.create(suites[0], title);\n      suite.file = file;\n      suites.unshift(suite);\n      fn.call(suite);\n      suites.shift();\n      return suite;\n    };\n\n    /**\n     * Pending suite.\n     */\n    context.suite.skip = function(title, fn) {\n      var suite = Suite.create(suites[0], title);\n      suite.pending = true;\n      suites.unshift(suite);\n      fn.call(suite);\n      suites.shift();\n    };\n\n    /**\n     * Exclusive test-case.\n     */\n    context.suite.only = function(title, fn) {\n      var suite = context.suite(title, fn);\n      mocha.grep(suite.fullTitle());\n    };\n\n    /**\n     * Describe a specification or test-case with the given `title` and\n     * callback `fn` acting as a thunk.\n     */\n    context.test = function(title, fn) {\n      var suite = suites[0];\n      if (suite.pending) {\n        fn = null;\n      }\n      var test = new Test(title, fn);\n      test.file = file;\n      suite.addTest(test);\n      return test;\n    };\n\n    /**\n     * Exclusive test-case.\n     */\n\n    context.test.only = function(title, fn) {\n      var test = context.test(title, fn);\n      var reString = '^' + escapeRe(test.fullTitle()) + '$';\n      mocha.grep(new RegExp(reString));\n    };\n\n    context.test.skip = common.test.skip;\n  });\n};\n\n},{\"../suite\":37,\"../test\":38,\"./common\":9,\"escape-string-regexp\":68}],14:[function(require,module,exports){\n(function (process,global,__dirname){\n/*!\n * mocha\n * Copyright(c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar escapeRe = require('escape-string-regexp');\nvar path = require('path');\nvar reporters = require('./reporters');\nvar utils = require('./utils');\n\n/**\n * Expose `Mocha`.\n */\n\nexports = module.exports = Mocha;\n\n/**\n * To require local UIs and reporters when running in node.\n */\n\nif (!process.browser) {\n  var cwd = process.cwd();\n  module.paths.push(cwd, path.join(cwd, 'node_modules'));\n}\n\n/**\n * Expose internals.\n */\n\nexports.utils = utils;\nexports.interfaces = require('./interfaces');\nexports.reporters = reporters;\nexports.Runnable = require('./runnable');\nexports.Context = require('./context');\nexports.Runner = require('./runner');\nexports.Suite = require('./suite');\nexports.Hook = require('./hook');\nexports.Test = require('./test');\n\n/**\n * Return image `name` path.\n *\n * @api private\n * @param {string} name\n * @return {string}\n */\nfunction image(name) {\n  return path.join(__dirname, '../images', name + '.png');\n}\n\n/**\n * Set up mocha with `options`.\n *\n * Options:\n *\n *   - `ui` name \"bdd\", \"tdd\", \"exports\" etc\n *   - `reporter` reporter instance, defaults to `mocha.reporters.spec`\n *   - `globals` array of accepted globals\n *   - `timeout` timeout in milliseconds\n *   - `bail` bail on the first test failure\n *   - `slow` milliseconds to wait before considering a test slow\n *   - `ignoreLeaks` ignore global leaks\n *   - `fullTrace` display the full stack-trace on failing\n *   - `grep` string or regexp to filter tests with\n *\n * @param {Object} options\n * @api public\n */\nfunction Mocha(options) {\n  options = options || {};\n  this.files = [];\n  this.options = options;\n  if (options.grep) {\n    this.grep(new RegExp(options.grep));\n  }\n  if (options.fgrep) {\n    this.grep(options.fgrep);\n  }\n  this.suite = new exports.Suite('', new exports.Context());\n  this.ui(options.ui);\n  this.bail(options.bail);\n  this.reporter(options.reporter, options.reporterOptions);\n  if (typeof options.timeout !== 'undefined' && options.timeout !== null) {\n    this.timeout(options.timeout);\n  }\n  this.useColors(options.useColors);\n  if (options.enableTimeouts !== null) {\n    this.enableTimeouts(options.enableTimeouts);\n  }\n  if (options.slow) {\n    this.slow(options.slow);\n  }\n\n  this.suite.on('pre-require', function(context) {\n    exports.afterEach = context.afterEach || context.teardown;\n    exports.after = context.after || context.suiteTeardown;\n    exports.beforeEach = context.beforeEach || context.setup;\n    exports.before = context.before || context.suiteSetup;\n    exports.describe = context.describe || context.suite;\n    exports.it = context.it || context.test;\n    exports.setup = context.setup || context.beforeEach;\n    exports.suiteSetup = context.suiteSetup || context.before;\n    exports.suiteTeardown = context.suiteTeardown || context.after;\n    exports.suite = context.suite || context.describe;\n    exports.teardown = context.teardown || context.afterEach;\n    exports.test = context.test || context.it;\n    exports.run = context.run;\n  });\n}\n\n/**\n * Enable or disable bailing on the first failure.\n *\n * @api public\n * @param {boolean} [bail]\n */\nMocha.prototype.bail = function(bail) {\n  if (!arguments.length) {\n    bail = true;\n  }\n  this.suite.bail(bail);\n  return this;\n};\n\n/**\n * Add test `file`.\n *\n * @api public\n * @param {string} file\n */\nMocha.prototype.addFile = function(file) {\n  this.files.push(file);\n  return this;\n};\n\n/**\n * Set reporter to `reporter`, defaults to \"spec\".\n *\n * @param {String|Function} reporter name or constructor\n * @param {Object} reporterOptions optional options\n * @api public\n * @param {string|Function} reporter name or constructor\n * @param {Object} reporterOptions optional options\n */\nMocha.prototype.reporter = function(reporter, reporterOptions) {\n  if (typeof reporter === 'function') {\n    this._reporter = reporter;\n  } else {\n    reporter = reporter || 'spec';\n    var _reporter;\n    // Try to load a built-in reporter.\n    if (reporters[reporter]) {\n      _reporter = reporters[reporter];\n    }\n    // Try to load reporters from process.cwd() and node_modules\n    if (!_reporter) {\n      try {\n        _reporter = require(reporter);\n      } catch (err) {\n        err.message.indexOf('Cannot find module') !== -1\n          ? console.warn('\"' + reporter + '\" reporter not found')\n          : console.warn('\"' + reporter + '\" reporter blew up with error:\\n' + err.stack);\n      }\n    }\n    if (!_reporter && reporter === 'teamcity') {\n      console.warn('The Teamcity reporter was moved to a package named '\n        + 'mocha-teamcity-reporter '\n        + '(https://npmjs.org/package/mocha-teamcity-reporter).');\n    }\n    if (!_reporter) {\n      throw new Error('invalid reporter \"' + reporter + '\"');\n    }\n    this._reporter = _reporter;\n  }\n  this.options.reporterOptions = reporterOptions;\n  return this;\n};\n\n/**\n * Set test UI `name`, defaults to \"bdd\".\n *\n * @api public\n * @param {string} bdd\n */\nMocha.prototype.ui = function(name) {\n  name = name || 'bdd';\n  this._ui = exports.interfaces[name];\n  if (!this._ui) {\n    try {\n      this._ui = require(name);\n    } catch (err) {\n      throw new Error('invalid interface \"' + name + '\"');\n    }\n  }\n  this._ui = this._ui(this.suite);\n  return this;\n};\n\n/**\n * Load registered files.\n *\n * @api private\n */\nMocha.prototype.loadFiles = function(fn) {\n  var self = this;\n  var suite = this.suite;\n  var pending = this.files.length;\n  this.files.forEach(function(file) {\n    file = path.resolve(file);\n    suite.emit('pre-require', global, file, self);\n    suite.emit('require', require(file), file, self);\n    suite.emit('post-require', global, file, self);\n    --pending || (fn && fn());\n  });\n};\n\n/**\n * Enable growl support.\n *\n * @api private\n */\nMocha.prototype._growl = function(runner, reporter) {\n  var notify = require('growl');\n\n  runner.on('end', function() {\n    var stats = reporter.stats;\n    if (stats.failures) {\n      var msg = stats.failures + ' of ' + runner.total + ' tests failed';\n      notify(msg, { name: 'mocha', title: 'Failed', image: image('error') });\n    } else {\n      notify(stats.passes + ' tests passed in ' + stats.duration + 'ms', {\n        name: 'mocha',\n        title: 'Passed',\n        image: image('ok')\n      });\n    }\n  });\n};\n\n/**\n * Add regexp to grep, if `re` is a string it is escaped.\n *\n * @param {RegExp|String} re\n * @return {Mocha}\n * @api public\n * @param {RegExp|string} re\n * @return {Mocha}\n */\nMocha.prototype.grep = function(re) {\n  this.options.grep = typeof re === 'string' ? new RegExp(escapeRe(re)) : re;\n  return this;\n};\n\n/**\n * Invert `.grep()` matches.\n *\n * @return {Mocha}\n * @api public\n */\nMocha.prototype.invert = function() {\n  this.options.invert = true;\n  return this;\n};\n\n/**\n * Ignore global leaks.\n *\n * @param {Boolean} ignore\n * @return {Mocha}\n * @api public\n * @param {boolean} ignore\n * @return {Mocha}\n */\nMocha.prototype.ignoreLeaks = function(ignore) {\n  this.options.ignoreLeaks = Boolean(ignore);\n  return this;\n};\n\n/**\n * Enable global leak checking.\n *\n * @return {Mocha}\n * @api public\n */\nMocha.prototype.checkLeaks = function() {\n  this.options.ignoreLeaks = false;\n  return this;\n};\n\n/**\n * Display long stack-trace on failing\n *\n * @return {Mocha}\n * @api public\n */\nMocha.prototype.fullTrace = function() {\n  this.options.fullStackTrace = true;\n  return this;\n};\n\n/**\n * Enable growl support.\n *\n * @return {Mocha}\n * @api public\n */\nMocha.prototype.growl = function() {\n  this.options.growl = true;\n  return this;\n};\n\n/**\n * Ignore `globals` array or string.\n *\n * @param {Array|String} globals\n * @return {Mocha}\n * @api public\n * @param {Array|string} globals\n * @return {Mocha}\n */\nMocha.prototype.globals = function(globals) {\n  this.options.globals = (this.options.globals || []).concat(globals);\n  return this;\n};\n\n/**\n * Emit color output.\n *\n * @param {Boolean} colors\n * @return {Mocha}\n * @api public\n * @param {boolean} colors\n * @return {Mocha}\n */\nMocha.prototype.useColors = function(colors) {\n  if (colors !== undefined) {\n    this.options.useColors = colors;\n  }\n  return this;\n};\n\n/**\n * Use inline diffs rather than +/-.\n *\n * @param {Boolean} inlineDiffs\n * @return {Mocha}\n * @api public\n * @param {boolean} inlineDiffs\n * @return {Mocha}\n */\nMocha.prototype.useInlineDiffs = function(inlineDiffs) {\n  this.options.useInlineDiffs = inlineDiffs !== undefined && inlineDiffs;\n  return this;\n};\n\n/**\n * Set the timeout in milliseconds.\n *\n * @param {Number} timeout\n * @return {Mocha}\n * @api public\n * @param {number} timeout\n * @return {Mocha}\n */\nMocha.prototype.timeout = function(timeout) {\n  this.suite.timeout(timeout);\n  return this;\n};\n\n/**\n * Set slowness threshold in milliseconds.\n *\n * @param {Number} slow\n * @return {Mocha}\n * @api public\n * @param {number} slow\n * @return {Mocha}\n */\nMocha.prototype.slow = function(slow) {\n  this.suite.slow(slow);\n  return this;\n};\n\n/**\n * Enable timeouts.\n *\n * @param {Boolean} enabled\n * @return {Mocha}\n * @api public\n * @param {boolean} enabled\n * @return {Mocha}\n */\nMocha.prototype.enableTimeouts = function(enabled) {\n  this.suite.enableTimeouts(arguments.length && enabled !== undefined ? enabled : true);\n  return this;\n};\n\n/**\n * Makes all tests async (accepting a callback)\n *\n * @return {Mocha}\n * @api public\n */\nMocha.prototype.asyncOnly = function() {\n  this.options.asyncOnly = true;\n  return this;\n};\n\n/**\n * Disable syntax highlighting (in browser).\n *\n * @api public\n */\nMocha.prototype.noHighlighting = function() {\n  this.options.noHighlighting = true;\n  return this;\n};\n\n/**\n * Enable uncaught errors to propagate (in browser).\n *\n * @return {Mocha}\n * @api public\n */\nMocha.prototype.allowUncaught = function() {\n  this.options.allowUncaught = true;\n  return this;\n};\n\n/**\n * Delay root suite execution.\n * @returns {Mocha}\n */\nMocha.prototype.delay = function delay() {\n  this.options.delay = true;\n  return this;\n};\n\n/**\n * Run tests and invoke `fn()` when complete.\n *\n * @api public\n * @param {Function} fn\n * @return {Runner}\n */\nMocha.prototype.run = function(fn) {\n  if (this.files.length) {\n    this.loadFiles();\n  }\n  var suite = this.suite;\n  var options = this.options;\n  options.files = this.files;\n  var runner = new exports.Runner(suite, options.delay);\n  var reporter = new this._reporter(runner, options);\n  runner.ignoreLeaks = options.ignoreLeaks !== false;\n  runner.fullStackTrace = options.fullStackTrace;\n  runner.asyncOnly = options.asyncOnly;\n  runner.allowUncaught = options.allowUncaught;\n  if (options.grep) {\n    runner.grep(options.grep, options.invert);\n  }\n  if (options.globals) {\n    runner.globals(options.globals);\n  }\n  if (options.growl) {\n    this._growl(runner, reporter);\n  }\n  if (options.useColors !== undefined) {\n    exports.reporters.Base.useColors = options.useColors;\n  }\n  exports.reporters.Base.inlineDiffs = options.useInlineDiffs;\n\n  function done(failures) {\n    if (reporter.done) {\n      reporter.done(failures, fn);\n    } else {\n      fn && fn(failures);\n    }\n  }\n\n  return runner.run(done);\n};\n\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {},\"/lib\")\n},{\"./context\":6,\"./hook\":7,\"./interfaces\":11,\"./reporters\":22,\"./runnable\":35,\"./runner\":36,\"./suite\":37,\"./test\":38,\"./utils\":39,\"_process\":51,\"escape-string-regexp\":68,\"growl\":69,\"path\":41}],15:[function(require,module,exports){\n/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n *  - `long` verbose formatting [false]\n *\n * @api public\n * @param {string|number} val\n * @param {Object} options\n * @return {string|number}\n */\nmodule.exports = function(val, options) {\n  options = options || {};\n  if (typeof val === 'string') {\n    return parse(val);\n  }\n  // https://github.com/mochajs/mocha/pull/1035\n  return options['long'] ? longFormat(val) : shortFormat(val);\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @api private\n * @param {string} str\n * @return {number}\n */\nfunction parse(str) {\n  var match = (/^((?:\\d+)?\\.?\\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i).exec(str);\n  if (!match) {\n    return;\n  }\n  var n = parseFloat(match[1]);\n  var type = (match[2] || 'ms').toLowerCase();\n  switch (type) {\n    case 'years':\n    case 'year':\n    case 'y':\n      return n * y;\n    case 'days':\n    case 'day':\n    case 'd':\n      return n * d;\n    case 'hours':\n    case 'hour':\n    case 'h':\n      return n * h;\n    case 'minutes':\n    case 'minute':\n    case 'm':\n      return n * m;\n    case 'seconds':\n    case 'second':\n    case 's':\n      return n * s;\n    case 'ms':\n      return n;\n    default:\n      // No default case\n  }\n}\n\n/**\n * Short format for `ms`.\n *\n * @api private\n * @param {number} ms\n * @return {string}\n */\nfunction shortFormat(ms) {\n  if (ms >= d) {\n    return Math.round(ms / d) + 'd';\n  }\n  if (ms >= h) {\n    return Math.round(ms / h) + 'h';\n  }\n  if (ms >= m) {\n    return Math.round(ms / m) + 'm';\n  }\n  if (ms >= s) {\n    return Math.round(ms / s) + 's';\n  }\n  return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @api private\n * @param {number} ms\n * @return {string}\n */\nfunction longFormat(ms) {\n  return plural(ms, d, 'day')\n    || plural(ms, h, 'hour')\n    || plural(ms, m, 'minute')\n    || plural(ms, s, 'second')\n    || ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n *\n * @api private\n * @param {number} ms\n * @param {number} n\n * @param {string} name\n */\nfunction plural(ms, n, name) {\n  if (ms < n) {\n    return;\n  }\n  if (ms < n * 1.5) {\n    return Math.floor(ms / n) + ' ' + name;\n  }\n  return Math.ceil(ms / n) + ' ' + name + 's';\n}\n\n},{}],16:[function(require,module,exports){\n\n/**\n * Expose `Pending`.\n */\n\nmodule.exports = Pending;\n\n/**\n * Initialize a new `Pending` error with the given message.\n *\n * @param {string} message\n */\nfunction Pending(message) {\n  this.message = message;\n}\n\n},{}],17:[function(require,module,exports){\n(function (process,global){\n/**\n * Module dependencies.\n */\n\nvar tty = require('tty');\nvar diff = require('diff');\nvar ms = require('../ms');\nvar utils = require('../utils');\nvar supportsColor = process.browser ? null : require('supports-color');\n\n/**\n * Expose `Base`.\n */\n\nexports = module.exports = Base;\n\n/**\n * Save timer references to avoid Sinon interfering.\n * See: https://github.com/mochajs/mocha/issues/237\n */\n\n/* eslint-disable no-unused-vars, no-native-reassign */\nvar Date = global.Date;\nvar setTimeout = global.setTimeout;\nvar setInterval = global.setInterval;\nvar clearTimeout = global.clearTimeout;\nvar clearInterval = global.clearInterval;\n/* eslint-enable no-unused-vars, no-native-reassign */\n\n/**\n * Check if both stdio streams are associated with a tty.\n */\n\nvar isatty = tty.isatty(1) && tty.isatty(2);\n\n/**\n * Enable coloring by default, except in the browser interface.\n */\n\nexports.useColors = !process.browser && (supportsColor || (process.env.MOCHA_COLORS !== undefined));\n\n/**\n * Inline diffs instead of +/-\n */\n\nexports.inlineDiffs = false;\n\n/**\n * Default color map.\n */\n\nexports.colors = {\n  pass: 90,\n  fail: 31,\n  'bright pass': 92,\n  'bright fail': 91,\n  'bright yellow': 93,\n  pending: 36,\n  suite: 0,\n  'error title': 0,\n  'error message': 31,\n  'error stack': 90,\n  checkmark: 32,\n  fast: 90,\n  medium: 33,\n  slow: 31,\n  green: 32,\n  light: 90,\n  'diff gutter': 90,\n  'diff added': 32,\n  'diff removed': 31\n};\n\n/**\n * Default symbol map.\n */\n\nexports.symbols = {\n  ok: '✓',\n  err: '✖',\n  dot: '․'\n};\n\n// With node.js on Windows: use symbols available in terminal default fonts\nif (process.platform === 'win32') {\n  exports.symbols.ok = '\\u221A';\n  exports.symbols.err = '\\u00D7';\n  exports.symbols.dot = '.';\n}\n\n/**\n * Color `str` with the given `type`,\n * allowing colors to be disabled,\n * as well as user-defined color\n * schemes.\n *\n * @param {string} type\n * @param {string} str\n * @return {string}\n * @api private\n */\nvar color = exports.color = function(type, str) {\n  if (!exports.useColors) {\n    return String(str);\n  }\n  return '\\u001b[' + exports.colors[type] + 'm' + str + '\\u001b[0m';\n};\n\n/**\n * Expose term window size, with some defaults for when stderr is not a tty.\n */\n\nexports.window = {\n  width: 75\n};\n\nif (isatty) {\n  exports.window.width = process.stdout.getWindowSize\n      ? process.stdout.getWindowSize(1)[0]\n      : tty.getWindowSize()[1];\n}\n\n/**\n * Expose some basic cursor interactions that are common among reporters.\n */\n\nexports.cursor = {\n  hide: function() {\n    isatty && process.stdout.write('\\u001b[?25l');\n  },\n\n  show: function() {\n    isatty && process.stdout.write('\\u001b[?25h');\n  },\n\n  deleteLine: function() {\n    isatty && process.stdout.write('\\u001b[2K');\n  },\n\n  beginningOfLine: function() {\n    isatty && process.stdout.write('\\u001b[0G');\n  },\n\n  CR: function() {\n    if (isatty) {\n      exports.cursor.deleteLine();\n      exports.cursor.beginningOfLine();\n    } else {\n      process.stdout.write('\\r');\n    }\n  }\n};\n\n/**\n * Outut the given `failures` as a list.\n *\n * @param {Array} failures\n * @api public\n */\n\nexports.list = function(failures) {\n  console.log();\n  failures.forEach(function(test, i) {\n    // format\n    var fmt = color('error title', '  %s) %s:\\n')\n      + color('error message', '     %s')\n      + color('error stack', '\\n%s\\n');\n\n    // msg\n    var msg;\n    var err = test.err;\n    var message;\n    if (err.message) {\n      message = err.message;\n    } else if (typeof err.inspect === 'function') {\n      message = err.inspect() + '';\n    } else {\n      message = '';\n    }\n    var stack = err.stack || message;\n    var index = stack.indexOf(message);\n    var actual = err.actual;\n    var expected = err.expected;\n    var escape = true;\n\n    if (index === -1) {\n      msg = message;\n    } else {\n      index += message.length;\n      msg = stack.slice(0, index);\n      // remove msg from stack\n      stack = stack.slice(index + 1);\n    }\n\n    // uncaught\n    if (err.uncaught) {\n      msg = 'Uncaught ' + msg;\n    }\n    // explicitly show diff\n    if (err.showDiff !== false && sameType(actual, expected) && expected !== undefined) {\n      escape = false;\n      if (!(utils.isString(actual) && utils.isString(expected))) {\n        err.actual = actual = utils.stringify(actual);\n        err.expected = expected = utils.stringify(expected);\n      }\n\n      fmt = color('error title', '  %s) %s:\\n%s') + color('error stack', '\\n%s\\n');\n      var match = message.match(/^([^:]+): expected/);\n      msg = '\\n      ' + color('error message', match ? match[1] : msg);\n\n      if (exports.inlineDiffs) {\n        msg += inlineDiff(err, escape);\n      } else {\n        msg += unifiedDiff(err, escape);\n      }\n    }\n\n    // indent stack trace\n    stack = stack.replace(/^/gm, '  ');\n\n    console.log(fmt, (i + 1), test.fullTitle(), msg, stack);\n  });\n};\n\n/**\n * Initialize a new `Base` reporter.\n *\n * All other reporters generally\n * inherit from this reporter, providing\n * stats such as test duration, number\n * of tests passed / failed etc.\n *\n * @param {Runner} runner\n * @api public\n */\n\nfunction Base(runner) {\n  var stats = this.stats = { suites: 0, tests: 0, passes: 0, pending: 0, failures: 0 };\n  var failures = this.failures = [];\n\n  if (!runner) {\n    return;\n  }\n  this.runner = runner;\n\n  runner.stats = stats;\n\n  runner.on('start', function() {\n    stats.start = new Date();\n  });\n\n  runner.on('suite', function(suite) {\n    stats.suites = stats.suites || 0;\n    suite.root || stats.suites++;\n  });\n\n  runner.on('test end', function() {\n    stats.tests = stats.tests || 0;\n    stats.tests++;\n  });\n\n  runner.on('pass', function(test) {\n    stats.passes = stats.passes || 0;\n\n    if (test.duration > test.slow()) {\n      test.speed = 'slow';\n    } else if (test.duration > test.slow() / 2) {\n      test.speed = 'medium';\n    } else {\n      test.speed = 'fast';\n    }\n\n    stats.passes++;\n  });\n\n  runner.on('fail', function(test, err) {\n    stats.failures = stats.failures || 0;\n    stats.failures++;\n    test.err = err;\n    failures.push(test);\n  });\n\n  runner.on('end', function() {\n    stats.end = new Date();\n    stats.duration = new Date() - stats.start;\n  });\n\n  runner.on('pending', function() {\n    stats.pending++;\n  });\n}\n\n/**\n * Output common epilogue used by many of\n * the bundled reporters.\n *\n * @api public\n */\nBase.prototype.epilogue = function() {\n  var stats = this.stats;\n  var fmt;\n\n  console.log();\n\n  // passes\n  fmt = color('bright pass', ' ')\n    + color('green', ' %d passing')\n    + color('light', ' (%s)');\n\n  console.log(fmt,\n    stats.passes || 0,\n    ms(stats.duration));\n\n  // pending\n  if (stats.pending) {\n    fmt = color('pending', ' ')\n      + color('pending', ' %d pending');\n\n    console.log(fmt, stats.pending);\n  }\n\n  // failures\n  if (stats.failures) {\n    fmt = color('fail', '  %d failing');\n\n    console.log(fmt, stats.failures);\n\n    Base.list(this.failures);\n    console.log();\n  }\n\n  console.log();\n};\n\n/**\n * Pad the given `str` to `len`.\n *\n * @api private\n * @param {string} str\n * @param {string} len\n * @return {string}\n */\nfunction pad(str, len) {\n  str = String(str);\n  return Array(len - str.length + 1).join(' ') + str;\n}\n\n/**\n * Returns an inline diff between 2 strings with coloured ANSI output\n *\n * @api private\n * @param {Error} err with actual/expected\n * @param {boolean} escape\n * @return {string} Diff\n */\nfunction inlineDiff(err, escape) {\n  var msg = errorDiff(err, 'WordsWithSpace', escape);\n\n  // linenos\n  var lines = msg.split('\\n');\n  if (lines.length > 4) {\n    var width = String(lines.length).length;\n    msg = lines.map(function(str, i) {\n      return pad(++i, width) + ' |' + ' ' + str;\n    }).join('\\n');\n  }\n\n  // legend\n  msg = '\\n'\n    + color('diff removed', 'actual')\n    + ' '\n    + color('diff added', 'expected')\n    + '\\n\\n'\n    + msg\n    + '\\n';\n\n  // indent\n  msg = msg.replace(/^/gm, '      ');\n  return msg;\n}\n\n/**\n * Returns a unified diff between two strings.\n *\n * @api private\n * @param {Error} err with actual/expected\n * @param {boolean} escape\n * @return {string} The diff.\n */\nfunction unifiedDiff(err, escape) {\n  var indent = '      ';\n  function cleanUp(line) {\n    if (escape) {\n      line = escapeInvisibles(line);\n    }\n    if (line[0] === '+') {\n      return indent + colorLines('diff added', line);\n    }\n    if (line[0] === '-') {\n      return indent + colorLines('diff removed', line);\n    }\n    if (line.match(/\\@\\@/)) {\n      return null;\n    }\n    if (line.match(/\\\\ No newline/)) {\n      return null;\n    }\n    return indent + line;\n  }\n  function notBlank(line) {\n    return typeof line !== 'undefined' && line !== null;\n  }\n  var msg = diff.createPatch('string', err.actual, err.expected);\n  var lines = msg.split('\\n').splice(4);\n  return '\\n      '\n    + colorLines('diff added', '+ expected') + ' '\n    + colorLines('diff removed', '- actual')\n    + '\\n\\n'\n    + lines.map(cleanUp).filter(notBlank).join('\\n');\n}\n\n/**\n * Return a character diff for `err`.\n *\n * @api private\n * @param {Error} err\n * @param {string} type\n * @param {boolean} escape\n * @return {string}\n */\nfunction errorDiff(err, type, escape) {\n  var actual = escape ? escapeInvisibles(err.actual) : err.actual;\n  var expected = escape ? escapeInvisibles(err.expected) : err.expected;\n  return diff['diff' + type](actual, expected).map(function(str) {\n    if (str.added) {\n      return colorLines('diff added', str.value);\n    }\n    if (str.removed) {\n      return colorLines('diff removed', str.value);\n    }\n    return str.value;\n  }).join('');\n}\n\n/**\n * Returns a string with all invisible characters in plain text\n *\n * @api private\n * @param {string} line\n * @return {string}\n */\nfunction escapeInvisibles(line) {\n  return line.replace(/\\t/g, '<tab>')\n    .replace(/\\r/g, '<CR>')\n    .replace(/\\n/g, '<LF>\\n');\n}\n\n/**\n * Color lines for `str`, using the color `name`.\n *\n * @api private\n * @param {string} name\n * @param {string} str\n * @return {string}\n */\nfunction colorLines(name, str) {\n  return str.split('\\n').map(function(str) {\n    return color(name, str);\n  }).join('\\n');\n}\n\n/**\n * Object#toString reference.\n */\nvar objToString = Object.prototype.toString;\n\n/**\n * Check that a / b have the same type.\n *\n * @api private\n * @param {Object} a\n * @param {Object} b\n * @return {boolean}\n */\nfunction sameType(a, b) {\n  return objToString.call(a) === objToString.call(b);\n}\n\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"../ms\":15,\"../utils\":39,\"_process\":51,\"diff\":67,\"supports-color\":41,\"tty\":5}],18:[function(require,module,exports){\n/**\n * Module dependencies.\n */\n\nvar Base = require('./base');\nvar utils = require('../utils');\n\n/**\n * Expose `Doc`.\n */\n\nexports = module.exports = Doc;\n\n/**\n * Initialize a new `Doc` reporter.\n *\n * @param {Runner} runner\n * @api public\n */\nfunction Doc(runner) {\n  Base.call(this, runner);\n\n  var indents = 2;\n\n  function indent() {\n    return Array(indents).join('  ');\n  }\n\n  runner.on('suite', function(suite) {\n    if (suite.root) {\n      return;\n    }\n    ++indents;\n    console.log('%s<section class=\"suite\">', indent());\n    ++indents;\n    console.log('%s<h1>%s</h1>', indent(), utils.escape(suite.title));\n    console.log('%s<dl>', indent());\n  });\n\n  runner.on('suite end', function(suite) {\n    if (suite.root) {\n      return;\n    }\n    console.log('%s</dl>', indent());\n    --indents;\n    console.log('%s</section>', indent());\n    --indents;\n  });\n\n  runner.on('pass', function(test) {\n    console.log('%s  <dt>%s</dt>', indent(), utils.escape(test.title));\n    var code = utils.escape(utils.clean(test.fn.toString()));\n    console.log('%s  <dd><pre><code>%s</code></pre></dd>', indent(), code);\n  });\n\n  runner.on('fail', function(test, err) {\n    console.log('%s  <dt class=\"error\">%s</dt>', indent(), utils.escape(test.title));\n    var code = utils.escape(utils.clean(test.fn.toString()));\n    console.log('%s  <dd class=\"error\"><pre><code>%s</code></pre></dd>', indent(), code);\n    console.log('%s  <dd class=\"error\">%s</dd>', indent(), utils.escape(err));\n  });\n}\n\n},{\"../utils\":39,\"./base\":17}],19:[function(require,module,exports){\n(function (process){\n/**\n * Module dependencies.\n */\n\nvar Base = require('./base');\nvar inherits = require('../utils').inherits;\nvar color = Base.color;\n\n/**\n * Expose `Dot`.\n */\n\nexports = module.exports = Dot;\n\n/**\n * Initialize a new `Dot` matrix test reporter.\n *\n * @api public\n * @param {Runner} runner\n */\nfunction Dot(runner) {\n  Base.call(this, runner);\n\n  var self = this;\n  var width = Base.window.width * .75 | 0;\n  var n = -1;\n\n  runner.on('start', function() {\n    process.stdout.write('\\n');\n  });\n\n  runner.on('pending', function() {\n    if (++n % width === 0) {\n      process.stdout.write('\\n  ');\n    }\n    process.stdout.write(color('pending', Base.symbols.dot));\n  });\n\n  runner.on('pass', function(test) {\n    if (++n % width === 0) {\n      process.stdout.write('\\n  ');\n    }\n    if (test.speed === 'slow') {\n      process.stdout.write(color('bright yellow', Base.symbols.dot));\n    } else {\n      process.stdout.write(color(test.speed, Base.symbols.dot));\n    }\n  });\n\n  runner.on('fail', function() {\n    if (++n % width === 0) {\n      process.stdout.write('\\n  ');\n    }\n    process.stdout.write(color('fail', Base.symbols.dot));\n  });\n\n  runner.on('end', function() {\n    console.log();\n    self.epilogue();\n  });\n}\n\n/**\n * Inherit from `Base.prototype`.\n */\ninherits(Dot, Base);\n\n}).call(this,require('_process'))\n},{\"../utils\":39,\"./base\":17,\"_process\":51}],20:[function(require,module,exports){\n(function (process,__dirname){\n/**\n * Module dependencies.\n */\n\nvar JSONCov = require('./json-cov');\nvar readFileSync = require('fs').readFileSync;\nvar join = require('path').join;\n\n/**\n * Expose `HTMLCov`.\n */\n\nexports = module.exports = HTMLCov;\n\n/**\n * Initialize a new `JsCoverage` reporter.\n *\n * @api public\n * @param {Runner} runner\n */\nfunction HTMLCov(runner) {\n  var jade = require('jade');\n  var file = join(__dirname, '/templates/coverage.jade');\n  var str = readFileSync(file, 'utf8');\n  var fn = jade.compile(str, { filename: file });\n  var self = this;\n\n  JSONCov.call(this, runner, false);\n\n  runner.on('end', function() {\n    process.stdout.write(fn({\n      cov: self.cov,\n      coverageClass: coverageClass\n    }));\n  });\n}\n\n/**\n * Return coverage class for a given coverage percentage.\n *\n * @api private\n * @param {number} coveragePctg\n * @return {string}\n */\nfunction coverageClass(coveragePctg) {\n  if (coveragePctg >= 75) {\n    return 'high';\n  }\n  if (coveragePctg >= 50) {\n    return 'medium';\n  }\n  if (coveragePctg >= 25) {\n    return 'low';\n  }\n  return 'terrible';\n}\n\n}).call(this,require('_process'),\"/lib/reporters\")\n},{\"./json-cov\":23,\"_process\":51,\"fs\":41,\"jade\":41,\"path\":41}],21:[function(require,module,exports){\n(function (global){\n/* eslint-env browser */\n\n/**\n * Module dependencies.\n */\n\nvar Base = require('./base');\nvar utils = require('../utils');\nvar Progress = require('../browser/progress');\nvar escapeRe = require('escape-string-regexp');\nvar escape = utils.escape;\n\n/**\n * Save timer references to avoid Sinon interfering (see GH-237).\n */\n\n/* eslint-disable no-unused-vars, no-native-reassign */\nvar Date = global.Date;\nvar setTimeout = global.setTimeout;\nvar setInterval = global.setInterval;\nvar clearTimeout = global.clearTimeout;\nvar clearInterval = global.clearInterval;\n/* eslint-enable no-unused-vars, no-native-reassign */\n\n/**\n * Expose `HTML`.\n */\n\nexports = module.exports = HTML;\n\n/**\n * Stats template.\n */\n\nvar statsTemplate = '<ul id=\"mocha-stats\">'\n  + '<li class=\"progress\"><canvas width=\"40\" height=\"40\"></canvas></li>'\n  + '<li class=\"passes\"><a href=\"javascript:void(0);\">passes:</a> <em>0</em></li>'\n  + '<li class=\"failures\"><a href=\"javascript:void(0);\">failures:</a> <em>0</em></li>'\n  + '<li class=\"duration\">duration: <em>0</em>s</li>'\n  + '</ul>';\n\n/**\n * Initialize a new `HTML` reporter.\n *\n * @api public\n * @param {Runner} runner\n */\nfunction HTML(runner) {\n  Base.call(this, runner);\n\n  var self = this;\n  var stats = this.stats;\n  var stat = fragment(statsTemplate);\n  var items = stat.getElementsByTagName('li');\n  var passes = items[1].getElementsByTagName('em')[0];\n  var passesLink = items[1].getElementsByTagName('a')[0];\n  var failures = items[2].getElementsByTagName('em')[0];\n  var failuresLink = items[2].getElementsByTagName('a')[0];\n  var duration = items[3].getElementsByTagName('em')[0];\n  var canvas = stat.getElementsByTagName('canvas')[0];\n  var report = fragment('<ul id=\"mocha-report\"></ul>');\n  var stack = [report];\n  var progress;\n  var ctx;\n  var root = document.getElementById('mocha');\n\n  if (canvas.getContext) {\n    var ratio = window.devicePixelRatio || 1;\n    canvas.style.width = canvas.width;\n    canvas.style.height = canvas.height;\n    canvas.width *= ratio;\n    canvas.height *= ratio;\n    ctx = canvas.getContext('2d');\n    ctx.scale(ratio, ratio);\n    progress = new Progress();\n  }\n\n  if (!root) {\n    return error('#mocha div missing, add it to your document');\n  }\n\n  // pass toggle\n  on(passesLink, 'click', function() {\n    unhide();\n    var name = (/pass/).test(report.className) ? '' : ' pass';\n    report.className = report.className.replace(/fail|pass/g, '') + name;\n    if (report.className.trim()) {\n      hideSuitesWithout('test pass');\n    }\n  });\n\n  // failure toggle\n  on(failuresLink, 'click', function() {\n    unhide();\n    var name = (/fail/).test(report.className) ? '' : ' fail';\n    report.className = report.className.replace(/fail|pass/g, '') + name;\n    if (report.className.trim()) {\n      hideSuitesWithout('test fail');\n    }\n  });\n\n  root.appendChild(stat);\n  root.appendChild(report);\n\n  if (progress) {\n    progress.size(40);\n  }\n\n  runner.on('suite', function(suite) {\n    if (suite.root) {\n      return;\n    }\n\n    // suite\n    var url = self.suiteURL(suite);\n    var el = fragment('<li class=\"suite\"><h1><a href=\"%s\">%s</a></h1></li>', url, escape(suite.title));\n\n    // container\n    stack[0].appendChild(el);\n    stack.unshift(document.createElement('ul'));\n    el.appendChild(stack[0]);\n  });\n\n  runner.on('suite end', function(suite) {\n    if (suite.root) {\n      return;\n    }\n    stack.shift();\n  });\n\n  runner.on('fail', function(test) {\n    if (test.type === 'hook') {\n      runner.emit('test end', test);\n    }\n  });\n\n  runner.on('test end', function(test) {\n    // TODO: add to stats\n    var percent = stats.tests / this.total * 100 | 0;\n    if (progress) {\n      progress.update(percent).draw(ctx);\n    }\n\n    // update stats\n    var ms = new Date() - stats.start;\n    text(passes, stats.passes);\n    text(failures, stats.failures);\n    text(duration, (ms / 1000).toFixed(2));\n\n    // test\n    var el;\n    if (test.state === 'passed') {\n      var url = self.testURL(test);\n      el = fragment('<li class=\"test pass %e\"><h2>%e<span class=\"duration\">%ems</span> <a href=\"%s\" class=\"replay\">‣</a></h2></li>', test.speed, test.title, test.duration, url);\n    } else if (test.pending) {\n      el = fragment('<li class=\"test pass pending\"><h2>%e</h2></li>', test.title);\n    } else {\n      el = fragment('<li class=\"test fail\"><h2>%e <a href=\"%e\" class=\"replay\">‣</a></h2></li>', test.title, self.testURL(test));\n      var stackString; // Note: Includes leading newline\n      var message = test.err.toString();\n\n      // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we\n      // check for the result of the stringifying.\n      if (message === '[object Error]') {\n        message = test.err.message;\n      }\n\n      if (test.err.stack) {\n        var indexOfMessage = test.err.stack.indexOf(test.err.message);\n        if (indexOfMessage === -1) {\n          stackString = test.err.stack;\n        } else {\n          stackString = test.err.stack.substr(test.err.message.length + indexOfMessage);\n        }\n      } else if (test.err.sourceURL && test.err.line !== undefined) {\n        // Safari doesn't give you a stack. Let's at least provide a source line.\n        stackString = '\\n(' + test.err.sourceURL + ':' + test.err.line + ')';\n      }\n\n      stackString = stackString || '';\n\n      if (test.err.htmlMessage && stackString) {\n        el.appendChild(fragment('<div class=\"html-error\">%s\\n<pre class=\"error\">%e</pre></div>', test.err.htmlMessage, stackString));\n      } else if (test.err.htmlMessage) {\n        el.appendChild(fragment('<div class=\"html-error\">%s</div>', test.err.htmlMessage));\n      } else {\n        el.appendChild(fragment('<pre class=\"error\">%e%e</pre>', message, stackString));\n      }\n    }\n\n    // toggle code\n    // TODO: defer\n    if (!test.pending) {\n      var h2 = el.getElementsByTagName('h2')[0];\n\n      on(h2, 'click', function() {\n        pre.style.display = pre.style.display === 'none' ? 'block' : 'none';\n      });\n\n      var pre = fragment('<pre><code>%e</code></pre>', utils.clean(test.fn.toString()));\n      el.appendChild(pre);\n      pre.style.display = 'none';\n    }\n\n    // Don't call .appendChild if #mocha-report was already .shift()'ed off the stack.\n    if (stack[0]) {\n      stack[0].appendChild(el);\n    }\n  });\n}\n\n/**\n * Makes a URL, preserving querystring (\"search\") parameters.\n *\n * @param {string} s\n * @return {string} A new URL.\n */\nfunction makeUrl(s) {\n  var search = window.location.search;\n\n  // Remove previous grep query parameter if present\n  if (search) {\n    search = search.replace(/[?&]grep=[^&\\s]*/g, '').replace(/^&/, '?');\n  }\n\n  return window.location.pathname + (search ? search + '&' : '?') + 'grep=' + encodeURIComponent(escapeRe(s));\n}\n\n/**\n * Provide suite URL.\n *\n * @param {Object} [suite]\n */\nHTML.prototype.suiteURL = function(suite) {\n  return makeUrl(suite.fullTitle());\n};\n\n/**\n * Provide test URL.\n *\n * @param {Object} [test]\n */\nHTML.prototype.testURL = function(test) {\n  return makeUrl(test.fullTitle());\n};\n\n/**\n * Display error `msg`.\n *\n * @param {string} msg\n */\nfunction error(msg) {\n  document.body.appendChild(fragment('<div id=\"mocha-error\">%s</div>', msg));\n}\n\n/**\n * Return a DOM fragment from `html`.\n *\n * @param {string} html\n */\nfunction fragment(html) {\n  var args = arguments;\n  var div = document.createElement('div');\n  var i = 1;\n\n  div.innerHTML = html.replace(/%([se])/g, function(_, type) {\n    switch (type) {\n      case 's': return String(args[i++]);\n      case 'e': return escape(args[i++]);\n      // no default\n    }\n  });\n\n  return div.firstChild;\n}\n\n/**\n * Check for suites that do not have elements\n * with `classname`, and hide them.\n *\n * @param {text} classname\n */\nfunction hideSuitesWithout(classname) {\n  var suites = document.getElementsByClassName('suite');\n  for (var i = 0; i < suites.length; i++) {\n    var els = suites[i].getElementsByClassName(classname);\n    if (!els.length) {\n      suites[i].className += ' hidden';\n    }\n  }\n}\n\n/**\n * Unhide .hidden suites.\n */\nfunction unhide() {\n  var els = document.getElementsByClassName('suite hidden');\n  for (var i = 0; i < els.length; ++i) {\n    els[i].className = els[i].className.replace('suite hidden', 'suite');\n  }\n}\n\n/**\n * Set an element's text contents.\n *\n * @param {HTMLElement} el\n * @param {string} contents\n */\nfunction text(el, contents) {\n  if (el.textContent) {\n    el.textContent = contents;\n  } else {\n    el.innerText = contents;\n  }\n}\n\n/**\n * Listen on `event` with callback `fn`.\n */\nfunction on(el, event, fn) {\n  if (el.addEventListener) {\n    el.addEventListener(event, fn, false);\n  } else {\n    el.attachEvent('on' + event, fn);\n  }\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"../browser/progress\":4,\"../utils\":39,\"./base\":17,\"escape-string-regexp\":68}],22:[function(require,module,exports){\n// Alias exports to a their normalized format Mocha#reporter to prevent a need\n// for dynamic (try/catch) requires, which Browserify doesn't handle.\nexports.Base = exports.base = require('./base');\nexports.Dot = exports.dot = require('./dot');\nexports.Doc = exports.doc = require('./doc');\nexports.TAP = exports.tap = require('./tap');\nexports.JSON = exports.json = require('./json');\nexports.HTML = exports.html = require('./html');\nexports.List = exports.list = require('./list');\nexports.Min = exports.min = require('./min');\nexports.Spec = exports.spec = require('./spec');\nexports.Nyan = exports.nyan = require('./nyan');\nexports.XUnit = exports.xunit = require('./xunit');\nexports.Markdown = exports.markdown = require('./markdown');\nexports.Progress = exports.progress = require('./progress');\nexports.Landing = exports.landing = require('./landing');\nexports.JSONCov = exports['json-cov'] = require('./json-cov');\nexports.HTMLCov = exports['html-cov'] = require('./html-cov');\nexports.JSONStream = exports['json-stream'] = require('./json-stream');\n\n},{\"./base\":17,\"./doc\":18,\"./dot\":19,\"./html\":21,\"./html-cov\":20,\"./json\":25,\"./json-cov\":23,\"./json-stream\":24,\"./landing\":26,\"./list\":27,\"./markdown\":28,\"./min\":29,\"./nyan\":30,\"./progress\":31,\"./spec\":32,\"./tap\":33,\"./xunit\":34}],23:[function(require,module,exports){\n(function (process,global){\n/**\n * Module dependencies.\n */\n\nvar Base = require('./base');\n\n/**\n * Expose `JSONCov`.\n */\n\nexports = module.exports = JSONCov;\n\n/**\n * Initialize a new `JsCoverage` reporter.\n *\n * @api public\n * @param {Runner} runner\n * @param {boolean} output\n */\nfunction JSONCov(runner, output) {\n  Base.call(this, runner);\n\n  output = arguments.length === 1 || output;\n  var self = this;\n  var tests = [];\n  var failures = [];\n  var passes = [];\n\n  runner.on('test end', function(test) {\n    tests.push(test);\n  });\n\n  runner.on('pass', function(test) {\n    passes.push(test);\n  });\n\n  runner.on('fail', function(test) {\n    failures.push(test);\n  });\n\n  runner.on('end', function() {\n    var cov = global._$jscoverage || {};\n    var result = self.cov = map(cov);\n    result.stats = self.stats;\n    result.tests = tests.map(clean);\n    result.failures = failures.map(clean);\n    result.passes = passes.map(clean);\n    if (!output) {\n      return;\n    }\n    process.stdout.write(JSON.stringify(result, null, 2));\n  });\n}\n\n/**\n * Map jscoverage data to a JSON structure\n * suitable for reporting.\n *\n * @api private\n * @param {Object} cov\n * @return {Object}\n */\n\nfunction map(cov) {\n  var ret = {\n    instrumentation: 'node-jscoverage',\n    sloc: 0,\n    hits: 0,\n    misses: 0,\n    coverage: 0,\n    files: []\n  };\n\n  for (var filename in cov) {\n    if (Object.prototype.hasOwnProperty.call(cov, filename)) {\n      var data = coverage(filename, cov[filename]);\n      ret.files.push(data);\n      ret.hits += data.hits;\n      ret.misses += data.misses;\n      ret.sloc += data.sloc;\n    }\n  }\n\n  ret.files.sort(function(a, b) {\n    return a.filename.localeCompare(b.filename);\n  });\n\n  if (ret.sloc > 0) {\n    ret.coverage = (ret.hits / ret.sloc) * 100;\n  }\n\n  return ret;\n}\n\n/**\n * Map jscoverage data for a single source file\n * to a JSON structure suitable for reporting.\n *\n * @api private\n * @param {string} filename name of the source file\n * @param {Object} data jscoverage coverage data\n * @return {Object}\n */\nfunction coverage(filename, data) {\n  var ret = {\n    filename: filename,\n    coverage: 0,\n    hits: 0,\n    misses: 0,\n    sloc: 0,\n    source: {}\n  };\n\n  data.source.forEach(function(line, num) {\n    num++;\n\n    if (data[num] === 0) {\n      ret.misses++;\n      ret.sloc++;\n    } else if (data[num] !== undefined) {\n      ret.hits++;\n      ret.sloc++;\n    }\n\n    ret.source[num] = {\n      source: line,\n      coverage: data[num] === undefined ? '' : data[num]\n    };\n  });\n\n  ret.coverage = ret.hits / ret.sloc * 100;\n\n  return ret;\n}\n\n/**\n * Return a plain-object representation of `test`\n * free of cyclic properties etc.\n *\n * @api private\n * @param {Object} test\n * @return {Object}\n */\nfunction clean(test) {\n  return {\n    duration: test.duration,\n    fullTitle: test.fullTitle(),\n    title: test.title\n  };\n}\n\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./base\":17,\"_process\":51}],24:[function(require,module,exports){\n(function (process){\n/**\n * Module dependencies.\n */\n\nvar Base = require('./base');\n\n/**\n * Expose `List`.\n */\n\nexports = module.exports = List;\n\n/**\n * Initialize a new `List` test reporter.\n *\n * @api public\n * @param {Runner} runner\n */\nfunction List(runner) {\n  Base.call(this, runner);\n\n  var self = this;\n  var total = runner.total;\n\n  runner.on('start', function() {\n    console.log(JSON.stringify(['start', { total: total }]));\n  });\n\n  runner.on('pass', function(test) {\n    console.log(JSON.stringify(['pass', clean(test)]));\n  });\n\n  runner.on('fail', function(test, err) {\n    test = clean(test);\n    test.err = err.message;\n    test.stack = err.stack || null;\n    console.log(JSON.stringify(['fail', test]));\n  });\n\n  runner.on('end', function() {\n    process.stdout.write(JSON.stringify(['end', self.stats]));\n  });\n}\n\n/**\n * Return a plain-object representation of `test`\n * free of cyclic properties etc.\n *\n * @api private\n * @param {Object} test\n * @return {Object}\n */\nfunction clean(test) {\n  return {\n    title: test.title,\n    fullTitle: test.fullTitle(),\n    duration: test.duration\n  };\n}\n\n}).call(this,require('_process'))\n},{\"./base\":17,\"_process\":51}],25:[function(require,module,exports){\n(function (process){\n/**\n * Module dependencies.\n */\n\nvar Base = require('./base');\n\n/**\n * Expose `JSON`.\n */\n\nexports = module.exports = JSONReporter;\n\n/**\n * Initialize a new `JSON` reporter.\n *\n * @api public\n * @param {Runner} runner\n */\nfunction JSONReporter(runner) {\n  Base.call(this, runner);\n\n  var self = this;\n  var tests = [];\n  var pending = [];\n  var failures = [];\n  var passes = [];\n\n  runner.on('test end', function(test) {\n    tests.push(test);\n  });\n\n  runner.on('pass', function(test) {\n    passes.push(test);\n  });\n\n  runner.on('fail', function(test) {\n    failures.push(test);\n  });\n\n  runner.on('pending', function(test) {\n    pending.push(test);\n  });\n\n  runner.on('end', function() {\n    var obj = {\n      stats: self.stats,\n      tests: tests.map(clean),\n      pending: pending.map(clean),\n      failures: failures.map(clean),\n      passes: passes.map(clean)\n    };\n\n    runner.testResults = obj;\n\n    process.stdout.write(JSON.stringify(obj, null, 2));\n  });\n}\n\n/**\n * Return a plain-object representation of `test`\n * free of cyclic properties etc.\n *\n * @api private\n * @param {Object} test\n * @return {Object}\n */\nfunction clean(test) {\n  return {\n    title: test.title,\n    fullTitle: test.fullTitle(),\n    duration: test.duration,\n    err: errorJSON(test.err || {})\n  };\n}\n\n/**\n * Transform `error` into a JSON object.\n *\n * @api private\n * @param {Error} err\n * @return {Object}\n */\nfunction errorJSON(err) {\n  var res = {};\n  Object.getOwnPropertyNames(err).forEach(function(key) {\n    res[key] = err[key];\n  }, err);\n  return res;\n}\n\n}).call(this,require('_process'))\n},{\"./base\":17,\"_process\":51}],26:[function(require,module,exports){\n(function (process){\n/**\n * Module dependencies.\n */\n\nvar Base = require('./base');\nvar inherits = require('../utils').inherits;\nvar cursor = Base.cursor;\nvar color = Base.color;\n\n/**\n * Expose `Landing`.\n */\n\nexports = module.exports = Landing;\n\n/**\n * Airplane color.\n */\n\nBase.colors.plane = 0;\n\n/**\n * Airplane crash color.\n */\n\nBase.colors['plane crash'] = 31;\n\n/**\n * Runway color.\n */\n\nBase.colors.runway = 90;\n\n/**\n * Initialize a new `Landing` reporter.\n *\n * @api public\n * @param {Runner} runner\n */\nfunction Landing(runner) {\n  Base.call(this, runner);\n\n  var self = this;\n  var width = Base.window.width * .75 | 0;\n  var total = runner.total;\n  var stream = process.stdout;\n  var plane = color('plane', '✈');\n  var crashed = -1;\n  var n = 0;\n\n  function runway() {\n    var buf = Array(width).join('-');\n    return '  ' + color('runway', buf);\n  }\n\n  runner.on('start', function() {\n    stream.write('\\n\\n\\n  ');\n    cursor.hide();\n  });\n\n  runner.on('test end', function(test) {\n    // check if the plane crashed\n    var col = crashed === -1 ? width * ++n / total | 0 : crashed;\n\n    // show the crash\n    if (test.state === 'failed') {\n      plane = color('plane crash', '✈');\n      crashed = col;\n    }\n\n    // render landing strip\n    stream.write('\\u001b[' + (width + 1) + 'D\\u001b[2A');\n    stream.write(runway());\n    stream.write('\\n  ');\n    stream.write(color('runway', Array(col).join('⋅')));\n    stream.write(plane);\n    stream.write(color('runway', Array(width - col).join('⋅') + '\\n'));\n    stream.write(runway());\n    stream.write('\\u001b[0m');\n  });\n\n  runner.on('end', function() {\n    cursor.show();\n    console.log();\n    self.epilogue();\n  });\n}\n\n/**\n * Inherit from `Base.prototype`.\n */\ninherits(Landing, Base);\n\n}).call(this,require('_process'))\n},{\"../utils\":39,\"./base\":17,\"_process\":51}],27:[function(require,module,exports){\n(function (process){\n/**\n * Module dependencies.\n */\n\nvar Base = require('./base');\nvar inherits = require('../utils').inherits;\nvar color = Base.color;\nvar cursor = Base.cursor;\n\n/**\n * Expose `List`.\n */\n\nexports = module.exports = List;\n\n/**\n * Initialize a new `List` test reporter.\n *\n * @api public\n * @param {Runner} runner\n */\nfunction List(runner) {\n  Base.call(this, runner);\n\n  var self = this;\n  var n = 0;\n\n  runner.on('start', function() {\n    console.log();\n  });\n\n  runner.on('test', function(test) {\n    process.stdout.write(color('pass', '    ' + test.fullTitle() + ': '));\n  });\n\n  runner.on('pending', function(test) {\n    var fmt = color('checkmark', '  -')\n      + color('pending', ' %s');\n    console.log(fmt, test.fullTitle());\n  });\n\n  runner.on('pass', function(test) {\n    var fmt = color('checkmark', '  ' + Base.symbols.dot)\n      + color('pass', ' %s: ')\n      + color(test.speed, '%dms');\n    cursor.CR();\n    console.log(fmt, test.fullTitle(), test.duration);\n  });\n\n  runner.on('fail', function(test) {\n    cursor.CR();\n    console.log(color('fail', '  %d) %s'), ++n, test.fullTitle());\n  });\n\n  runner.on('end', self.epilogue.bind(self));\n}\n\n/**\n * Inherit from `Base.prototype`.\n */\ninherits(List, Base);\n\n}).call(this,require('_process'))\n},{\"../utils\":39,\"./base\":17,\"_process\":51}],28:[function(require,module,exports){\n(function (process){\n/**\n * Module dependencies.\n */\n\nvar Base = require('./base');\nvar utils = require('../utils');\n\n/**\n * Constants\n */\n\nvar SUITE_PREFIX = '$';\n\n/**\n * Expose `Markdown`.\n */\n\nexports = module.exports = Markdown;\n\n/**\n * Initialize a new `Markdown` reporter.\n *\n * @api public\n * @param {Runner} runner\n */\nfunction Markdown(runner) {\n  Base.call(this, runner);\n\n  var level = 0;\n  var buf = '';\n\n  function title(str) {\n    return Array(level).join('#') + ' ' + str;\n  }\n\n  function mapTOC(suite, obj) {\n    var ret = obj;\n    var key = SUITE_PREFIX + suite.title;\n\n    obj = obj[key] = obj[key] || { suite: suite };\n    suite.suites.forEach(function(suite) {\n      mapTOC(suite, obj);\n    });\n\n    return ret;\n  }\n\n  function stringifyTOC(obj, level) {\n    ++level;\n    var buf = '';\n    var link;\n    for (var key in obj) {\n      if (key === 'suite') {\n        continue;\n      }\n      if (key !== SUITE_PREFIX) {\n        link = ' - [' + key.substring(1) + ']';\n        link += '(#' + utils.slug(obj[key].suite.fullTitle()) + ')\\n';\n        buf += Array(level).join('  ') + link;\n      }\n      buf += stringifyTOC(obj[key], level);\n    }\n    return buf;\n  }\n\n  function generateTOC(suite) {\n    var obj = mapTOC(suite, {});\n    return stringifyTOC(obj, 0);\n  }\n\n  generateTOC(runner.suite);\n\n  runner.on('suite', function(suite) {\n    ++level;\n    var slug = utils.slug(suite.fullTitle());\n    buf += '<a name=\"' + slug + '\"></a>' + '\\n';\n    buf += title(suite.title) + '\\n';\n  });\n\n  runner.on('suite end', function() {\n    --level;\n  });\n\n  runner.on('pass', function(test) {\n    var code = utils.clean(test.fn.toString());\n    buf += test.title + '.\\n';\n    buf += '\\n```js\\n';\n    buf += code + '\\n';\n    buf += '```\\n\\n';\n  });\n\n  runner.on('end', function() {\n    process.stdout.write('# TOC\\n');\n    process.stdout.write(generateTOC(runner.suite));\n    process.stdout.write(buf);\n  });\n}\n\n}).call(this,require('_process'))\n},{\"../utils\":39,\"./base\":17,\"_process\":51}],29:[function(require,module,exports){\n(function (process){\n/**\n * Module dependencies.\n */\n\nvar Base = require('./base');\nvar inherits = require('../utils').inherits;\n\n/**\n * Expose `Min`.\n */\n\nexports = module.exports = Min;\n\n/**\n * Initialize a new `Min` minimal test reporter (best used with --watch).\n *\n * @api public\n * @param {Runner} runner\n */\nfunction Min(runner) {\n  Base.call(this, runner);\n\n  runner.on('start', function() {\n    // clear screen\n    process.stdout.write('\\u001b[2J');\n    // set cursor position\n    process.stdout.write('\\u001b[1;3H');\n  });\n\n  runner.on('end', this.epilogue.bind(this));\n}\n\n/**\n * Inherit from `Base.prototype`.\n */\ninherits(Min, Base);\n\n}).call(this,require('_process'))\n},{\"../utils\":39,\"./base\":17,\"_process\":51}],30:[function(require,module,exports){\n(function (process){\n/**\n * Module dependencies.\n */\n\nvar Base = require('./base');\nvar inherits = require('../utils').inherits;\n\n/**\n * Expose `Dot`.\n */\n\nexports = module.exports = NyanCat;\n\n/**\n * Initialize a new `Dot` matrix test reporter.\n *\n * @param {Runner} runner\n * @api public\n */\n\nfunction NyanCat(runner) {\n  Base.call(this, runner);\n\n  var self = this;\n  var width = Base.window.width * .75 | 0;\n  var nyanCatWidth = this.nyanCatWidth = 11;\n\n  this.colorIndex = 0;\n  this.numberOfLines = 4;\n  this.rainbowColors = self.generateColors();\n  this.scoreboardWidth = 5;\n  this.tick = 0;\n  this.trajectories = [[], [], [], []];\n  this.trajectoryWidthMax = (width - nyanCatWidth);\n\n  runner.on('start', function() {\n    Base.cursor.hide();\n    self.draw();\n  });\n\n  runner.on('pending', function() {\n    self.draw();\n  });\n\n  runner.on('pass', function() {\n    self.draw();\n  });\n\n  runner.on('fail', function() {\n    self.draw();\n  });\n\n  runner.on('end', function() {\n    Base.cursor.show();\n    for (var i = 0; i < self.numberOfLines; i++) {\n      write('\\n');\n    }\n    self.epilogue();\n  });\n}\n\n/**\n * Inherit from `Base.prototype`.\n */\ninherits(NyanCat, Base);\n\n/**\n * Draw the nyan cat\n *\n * @api private\n */\n\nNyanCat.prototype.draw = function() {\n  this.appendRainbow();\n  this.drawScoreboard();\n  this.drawRainbow();\n  this.drawNyanCat();\n  this.tick = !this.tick;\n};\n\n/**\n * Draw the \"scoreboard\" showing the number\n * of passes, failures and pending tests.\n *\n * @api private\n */\n\nNyanCat.prototype.drawScoreboard = function() {\n  var stats = this.stats;\n\n  function draw(type, n) {\n    write(' ');\n    write(Base.color(type, n));\n    write('\\n');\n  }\n\n  draw('green', stats.passes);\n  draw('fail', stats.failures);\n  draw('pending', stats.pending);\n  write('\\n');\n\n  this.cursorUp(this.numberOfLines);\n};\n\n/**\n * Append the rainbow.\n *\n * @api private\n */\n\nNyanCat.prototype.appendRainbow = function() {\n  var segment = this.tick ? '_' : '-';\n  var rainbowified = this.rainbowify(segment);\n\n  for (var index = 0; index < this.numberOfLines; index++) {\n    var trajectory = this.trajectories[index];\n    if (trajectory.length >= this.trajectoryWidthMax) {\n      trajectory.shift();\n    }\n    trajectory.push(rainbowified);\n  }\n};\n\n/**\n * Draw the rainbow.\n *\n * @api private\n */\n\nNyanCat.prototype.drawRainbow = function() {\n  var self = this;\n\n  this.trajectories.forEach(function(line) {\n    write('\\u001b[' + self.scoreboardWidth + 'C');\n    write(line.join(''));\n    write('\\n');\n  });\n\n  this.cursorUp(this.numberOfLines);\n};\n\n/**\n * Draw the nyan cat\n *\n * @api private\n */\nNyanCat.prototype.drawNyanCat = function() {\n  var self = this;\n  var startWidth = this.scoreboardWidth + this.trajectories[0].length;\n  var dist = '\\u001b[' + startWidth + 'C';\n  var padding = '';\n\n  write(dist);\n  write('_,------,');\n  write('\\n');\n\n  write(dist);\n  padding = self.tick ? '  ' : '   ';\n  write('_|' + padding + '/\\\\_/\\\\ ');\n  write('\\n');\n\n  write(dist);\n  padding = self.tick ? '_' : '__';\n  var tail = self.tick ? '~' : '^';\n  write(tail + '|' + padding + this.face() + ' ');\n  write('\\n');\n\n  write(dist);\n  padding = self.tick ? ' ' : '  ';\n  write(padding + '\"\"  \"\" ');\n  write('\\n');\n\n  this.cursorUp(this.numberOfLines);\n};\n\n/**\n * Draw nyan cat face.\n *\n * @api private\n * @return {string}\n */\n\nNyanCat.prototype.face = function() {\n  var stats = this.stats;\n  if (stats.failures) {\n    return '( x .x)';\n  } else if (stats.pending) {\n    return '( o .o)';\n  } else if (stats.passes) {\n    return '( ^ .^)';\n  }\n  return '( - .-)';\n};\n\n/**\n * Move cursor up `n`.\n *\n * @api private\n * @param {number} n\n */\n\nNyanCat.prototype.cursorUp = function(n) {\n  write('\\u001b[' + n + 'A');\n};\n\n/**\n * Move cursor down `n`.\n *\n * @api private\n * @param {number} n\n */\n\nNyanCat.prototype.cursorDown = function(n) {\n  write('\\u001b[' + n + 'B');\n};\n\n/**\n * Generate rainbow colors.\n *\n * @api private\n * @return {Array}\n */\nNyanCat.prototype.generateColors = function() {\n  var colors = [];\n\n  for (var i = 0; i < (6 * 7); i++) {\n    var pi3 = Math.floor(Math.PI / 3);\n    var n = (i * (1.0 / 6));\n    var r = Math.floor(3 * Math.sin(n) + 3);\n    var g = Math.floor(3 * Math.sin(n + 2 * pi3) + 3);\n    var b = Math.floor(3 * Math.sin(n + 4 * pi3) + 3);\n    colors.push(36 * r + 6 * g + b + 16);\n  }\n\n  return colors;\n};\n\n/**\n * Apply rainbow to the given `str`.\n *\n * @api private\n * @param {string} str\n * @return {string}\n */\nNyanCat.prototype.rainbowify = function(str) {\n  if (!Base.useColors) {\n    return str;\n  }\n  var color = this.rainbowColors[this.colorIndex % this.rainbowColors.length];\n  this.colorIndex += 1;\n  return '\\u001b[38;5;' + color + 'm' + str + '\\u001b[0m';\n};\n\n/**\n * Stdout helper.\n *\n * @param {string} string A message to write to stdout.\n */\nfunction write(string) {\n  process.stdout.write(string);\n}\n\n}).call(this,require('_process'))\n},{\"../utils\":39,\"./base\":17,\"_process\":51}],31:[function(require,module,exports){\n(function (process){\n/**\n * Module dependencies.\n */\n\nvar Base = require('./base');\nvar inherits = require('../utils').inherits;\nvar color = Base.color;\nvar cursor = Base.cursor;\n\n/**\n * Expose `Progress`.\n */\n\nexports = module.exports = Progress;\n\n/**\n * General progress bar color.\n */\n\nBase.colors.progress = 90;\n\n/**\n * Initialize a new `Progress` bar test reporter.\n *\n * @api public\n * @param {Runner} runner\n * @param {Object} options\n */\nfunction Progress(runner, options) {\n  Base.call(this, runner);\n\n  var self = this;\n  var width = Base.window.width * .50 | 0;\n  var total = runner.total;\n  var complete = 0;\n  var lastN = -1;\n\n  // default chars\n  options = options || {};\n  options.open = options.open || '[';\n  options.complete = options.complete || '▬';\n  options.incomplete = options.incomplete || Base.symbols.dot;\n  options.close = options.close || ']';\n  options.verbose = false;\n\n  // tests started\n  runner.on('start', function() {\n    console.log();\n    cursor.hide();\n  });\n\n  // tests complete\n  runner.on('test end', function() {\n    complete++;\n\n    var percent = complete / total;\n    var n = width * percent | 0;\n    var i = width - n;\n\n    if (n === lastN && !options.verbose) {\n      // Don't re-render the line if it hasn't changed\n      return;\n    }\n    lastN = n;\n\n    cursor.CR();\n    process.stdout.write('\\u001b[J');\n    process.stdout.write(color('progress', '  ' + options.open));\n    process.stdout.write(Array(n).join(options.complete));\n    process.stdout.write(Array(i).join(options.incomplete));\n    process.stdout.write(color('progress', options.close));\n    if (options.verbose) {\n      process.stdout.write(color('progress', ' ' + complete + ' of ' + total));\n    }\n  });\n\n  // tests are complete, output some stats\n  // and the failures if any\n  runner.on('end', function() {\n    cursor.show();\n    console.log();\n    self.epilogue();\n  });\n}\n\n/**\n * Inherit from `Base.prototype`.\n */\ninherits(Progress, Base);\n\n}).call(this,require('_process'))\n},{\"../utils\":39,\"./base\":17,\"_process\":51}],32:[function(require,module,exports){\n/**\n * Module dependencies.\n */\n\nvar Base = require('./base');\nvar inherits = require('../utils').inherits;\nvar color = Base.color;\nvar cursor = Base.cursor;\n\n/**\n * Expose `Spec`.\n */\n\nexports = module.exports = Spec;\n\n/**\n * Initialize a new `Spec` test reporter.\n *\n * @api public\n * @param {Runner} runner\n */\nfunction Spec(runner) {\n  Base.call(this, runner);\n\n  var self = this;\n  var indents = 0;\n  var n = 0;\n\n  function indent() {\n    return Array(indents).join('  ');\n  }\n\n  runner.on('start', function() {\n    console.log();\n  });\n\n  runner.on('suite', function(suite) {\n    ++indents;\n    console.log(color('suite', '%s%s'), indent(), suite.title);\n  });\n\n  runner.on('suite end', function() {\n    --indents;\n    if (indents === 1) {\n      console.log();\n    }\n  });\n\n  runner.on('pending', function(test) {\n    var fmt = indent() + color('pending', '  - %s');\n    console.log(fmt, test.title);\n  });\n\n  runner.on('pass', function(test) {\n    var fmt;\n    if (test.speed === 'fast') {\n      fmt = indent()\n        + color('checkmark', '  ' + Base.symbols.ok)\n        + color('pass', ' %s');\n      cursor.CR();\n      console.log(fmt, test.title);\n    } else {\n      fmt = indent()\n        + color('checkmark', '  ' + Base.symbols.ok)\n        + color('pass', ' %s')\n        + color(test.speed, ' (%dms)');\n      cursor.CR();\n      console.log(fmt, test.title, test.duration);\n    }\n  });\n\n  runner.on('fail', function(test) {\n    cursor.CR();\n    console.log(indent() + color('fail', '  %d) %s'), ++n, test.title);\n  });\n\n  runner.on('end', self.epilogue.bind(self));\n}\n\n/**\n * Inherit from `Base.prototype`.\n */\ninherits(Spec, Base);\n\n},{\"../utils\":39,\"./base\":17}],33:[function(require,module,exports){\n/**\n * Module dependencies.\n */\n\nvar Base = require('./base');\n\n/**\n * Expose `TAP`.\n */\n\nexports = module.exports = TAP;\n\n/**\n * Initialize a new `TAP` reporter.\n *\n * @api public\n * @param {Runner} runner\n */\nfunction TAP(runner) {\n  Base.call(this, runner);\n\n  var n = 1;\n  var passes = 0;\n  var failures = 0;\n\n  runner.on('start', function() {\n    var total = runner.grepTotal(runner.suite);\n    console.log('%d..%d', 1, total);\n  });\n\n  runner.on('test end', function() {\n    ++n;\n  });\n\n  runner.on('pending', function(test) {\n    console.log('ok %d %s # SKIP -', n, title(test));\n  });\n\n  runner.on('pass', function(test) {\n    passes++;\n    console.log('ok %d %s', n, title(test));\n  });\n\n  runner.on('fail', function(test, err) {\n    failures++;\n    console.log('not ok %d %s', n, title(test));\n    if (err.stack) {\n      console.log(err.stack.replace(/^/gm, '  '));\n    }\n  });\n\n  runner.on('end', function() {\n    console.log('# tests ' + (passes + failures));\n    console.log('# pass ' + passes);\n    console.log('# fail ' + failures);\n  });\n}\n\n/**\n * Return a TAP-safe title of `test`\n *\n * @api private\n * @param {Object} test\n * @return {String}\n */\nfunction title(test) {\n  return test.fullTitle().replace(/#/g, '');\n}\n\n},{\"./base\":17}],34:[function(require,module,exports){\n(function (global){\n/**\n * Module dependencies.\n */\n\nvar Base = require('./base');\nvar utils = require('../utils');\nvar inherits = utils.inherits;\nvar fs = require('fs');\nvar escape = utils.escape;\n\n/**\n * Save timer references to avoid Sinon interfering (see GH-237).\n */\n\n/* eslint-disable no-unused-vars, no-native-reassign */\nvar Date = global.Date;\nvar setTimeout = global.setTimeout;\nvar setInterval = global.setInterval;\nvar clearTimeout = global.clearTimeout;\nvar clearInterval = global.clearInterval;\n/* eslint-enable no-unused-vars, no-native-reassign */\n\n/**\n * Expose `XUnit`.\n */\n\nexports = module.exports = XUnit;\n\n/**\n * Initialize a new `XUnit` reporter.\n *\n * @api public\n * @param {Runner} runner\n */\nfunction XUnit(runner, options) {\n  Base.call(this, runner);\n\n  var stats = this.stats;\n  var tests = [];\n  var self = this;\n\n  if (options.reporterOptions && options.reporterOptions.output) {\n    if (!fs.createWriteStream) {\n      throw new Error('file output not supported in browser');\n    }\n    self.fileStream = fs.createWriteStream(options.reporterOptions.output);\n  }\n\n  runner.on('pending', function(test) {\n    tests.push(test);\n  });\n\n  runner.on('pass', function(test) {\n    tests.push(test);\n  });\n\n  runner.on('fail', function(test) {\n    tests.push(test);\n  });\n\n  runner.on('end', function() {\n    self.write(tag('testsuite', {\n      name: 'Mocha Tests',\n      tests: stats.tests,\n      failures: stats.failures,\n      errors: stats.failures,\n      skipped: stats.tests - stats.failures - stats.passes,\n      timestamp: (new Date()).toUTCString(),\n      time: (stats.duration / 1000) || 0\n    }, false));\n\n    tests.forEach(function(t) {\n      self.test(t);\n    });\n\n    self.write('</testsuite>');\n  });\n}\n\n/**\n * Inherit from `Base.prototype`.\n */\ninherits(XUnit, Base);\n\n/**\n * Override done to close the stream (if it's a file).\n *\n * @param failures\n * @param {Function} fn\n */\nXUnit.prototype.done = function(failures, fn) {\n  if (this.fileStream) {\n    this.fileStream.end(function() {\n      fn(failures);\n    });\n  } else {\n    fn(failures);\n  }\n};\n\n/**\n * Write out the given line.\n *\n * @param {string} line\n */\nXUnit.prototype.write = function(line) {\n  if (this.fileStream) {\n    this.fileStream.write(line + '\\n');\n  } else {\n    console.log(line);\n  }\n};\n\n/**\n * Output tag for the given `test.`\n *\n * @param {Test} test\n */\nXUnit.prototype.test = function(test) {\n  var attrs = {\n    classname: test.parent.fullTitle(),\n    name: test.title,\n    time: (test.duration / 1000) || 0\n  };\n\n  if (test.state === 'failed') {\n    var err = test.err;\n    this.write(tag('testcase', attrs, false, tag('failure', {}, false, cdata(escape(err.message) + '\\n' + err.stack))));\n  } else if (test.pending) {\n    this.write(tag('testcase', attrs, false, tag('skipped', {}, true)));\n  } else {\n    this.write(tag('testcase', attrs, true));\n  }\n};\n\n/**\n * HTML tag helper.\n *\n * @param name\n * @param attrs\n * @param close\n * @param content\n * @return {string}\n */\nfunction tag(name, attrs, close, content) {\n  var end = close ? '/>' : '>';\n  var pairs = [];\n  var tag;\n\n  for (var key in attrs) {\n    if (Object.prototype.hasOwnProperty.call(attrs, key)) {\n      pairs.push(key + '=\"' + escape(attrs[key]) + '\"');\n    }\n  }\n\n  tag = '<' + name + (pairs.length ? ' ' + pairs.join(' ') : '') + end;\n  if (content) {\n    tag += content + '</' + name + end;\n  }\n  return tag;\n}\n\n/**\n * Return cdata escaped CDATA `str`.\n */\n\nfunction cdata(str) {\n  return '<![CDATA[' + escape(str) + ']]>';\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"../utils\":39,\"./base\":17,\"fs\":41}],35:[function(require,module,exports){\n(function (global){\n/**\n * Module dependencies.\n */\n\nvar EventEmitter = require('events').EventEmitter;\nvar Pending = require('./pending');\nvar debug = require('debug')('mocha:runnable');\nvar milliseconds = require('./ms');\nvar utils = require('./utils');\nvar inherits = utils.inherits;\n\n/**\n * Save timer references to avoid Sinon interfering (see GH-237).\n */\n\n/* eslint-disable no-unused-vars, no-native-reassign */\nvar Date = global.Date;\nvar setTimeout = global.setTimeout;\nvar setInterval = global.setInterval;\nvar clearTimeout = global.clearTimeout;\nvar clearInterval = global.clearInterval;\n/* eslint-enable no-unused-vars, no-native-reassign */\n\n/**\n * Object#toString().\n */\n\nvar toString = Object.prototype.toString;\n\n/**\n * Expose `Runnable`.\n */\n\nmodule.exports = Runnable;\n\n/**\n * Initialize a new `Runnable` with the given `title` and callback `fn`.\n *\n * @param {String} title\n * @param {Function} fn\n * @api private\n * @param {string} title\n * @param {Function} fn\n */\nfunction Runnable(title, fn) {\n  this.title = title;\n  this.fn = fn;\n  this.async = fn && fn.length;\n  this.sync = !this.async;\n  this._timeout = 2000;\n  this._slow = 75;\n  this._enableTimeouts = true;\n  this.timedOut = false;\n  this._trace = new Error('done() called multiple times');\n}\n\n/**\n * Inherit from `EventEmitter.prototype`.\n */\ninherits(Runnable, EventEmitter);\n\n/**\n * Set & get timeout `ms`.\n *\n * @api private\n * @param {number|string} ms\n * @return {Runnable|number} ms or Runnable instance.\n */\nRunnable.prototype.timeout = function(ms) {\n  if (!arguments.length) {\n    return this._timeout;\n  }\n  if (ms === 0) {\n    this._enableTimeouts = false;\n  }\n  if (typeof ms === 'string') {\n    ms = milliseconds(ms);\n  }\n  debug('timeout %d', ms);\n  this._timeout = ms;\n  if (this.timer) {\n    this.resetTimeout();\n  }\n  return this;\n};\n\n/**\n * Set & get slow `ms`.\n *\n * @api private\n * @param {number|string} ms\n * @return {Runnable|number} ms or Runnable instance.\n */\nRunnable.prototype.slow = function(ms) {\n  if (!arguments.length) {\n    return this._slow;\n  }\n  if (typeof ms === 'string') {\n    ms = milliseconds(ms);\n  }\n  debug('timeout %d', ms);\n  this._slow = ms;\n  return this;\n};\n\n/**\n * Set and get whether timeout is `enabled`.\n *\n * @api private\n * @param {boolean} enabled\n * @return {Runnable|boolean} enabled or Runnable instance.\n */\nRunnable.prototype.enableTimeouts = function(enabled) {\n  if (!arguments.length) {\n    return this._enableTimeouts;\n  }\n  debug('enableTimeouts %s', enabled);\n  this._enableTimeouts = enabled;\n  return this;\n};\n\n/**\n * Halt and mark as pending.\n *\n * @api private\n */\nRunnable.prototype.skip = function() {\n  throw new Pending();\n};\n\n/**\n * Return the full title generated by recursively concatenating the parent's\n * full title.\n *\n * @api public\n * @return {string}\n */\nRunnable.prototype.fullTitle = function() {\n  return this.parent.fullTitle() + ' ' + this.title;\n};\n\n/**\n * Clear the timeout.\n *\n * @api private\n */\nRunnable.prototype.clearTimeout = function() {\n  clearTimeout(this.timer);\n};\n\n/**\n * Inspect the runnable void of private properties.\n *\n * @api private\n * @return {string}\n */\nRunnable.prototype.inspect = function() {\n  return JSON.stringify(this, function(key, val) {\n    if (key[0] === '_') {\n      return;\n    }\n    if (key === 'parent') {\n      return '#<Suite>';\n    }\n    if (key === 'ctx') {\n      return '#<Context>';\n    }\n    return val;\n  }, 2);\n};\n\n/**\n * Reset the timeout.\n *\n * @api private\n */\nRunnable.prototype.resetTimeout = function() {\n  var self = this;\n  var ms = this.timeout() || 1e9;\n\n  if (!this._enableTimeouts) {\n    return;\n  }\n  this.clearTimeout();\n  this.timer = setTimeout(function() {\n    if (!self._enableTimeouts) {\n      return;\n    }\n    self.callback(new Error('timeout of ' + ms + 'ms exceeded. Ensure the done() callback is being called in this test.'));\n    self.timedOut = true;\n  }, ms);\n};\n\n/**\n * Whitelist a list of globals for this test run.\n *\n * @api private\n * @param {string[]} globals\n */\nRunnable.prototype.globals = function(globals) {\n  this._allowedGlobals = globals;\n};\n\n/**\n * Run the test and invoke `fn(err)`.\n *\n * @param {Function} fn\n * @api private\n */\nRunnable.prototype.run = function(fn) {\n  var self = this;\n  var start = new Date();\n  var ctx = this.ctx;\n  var finished;\n  var emitted;\n\n  // Sometimes the ctx exists, but it is not runnable\n  if (ctx && ctx.runnable) {\n    ctx.runnable(this);\n  }\n\n  // called multiple times\n  function multiple(err) {\n    if (emitted) {\n      return;\n    }\n    emitted = true;\n    self.emit('error', err || new Error('done() called multiple times; stacktrace may be inaccurate'));\n  }\n\n  // finished\n  function done(err) {\n    var ms = self.timeout();\n    if (self.timedOut) {\n      return;\n    }\n    if (finished) {\n      return multiple(err || self._trace);\n    }\n\n    self.clearTimeout();\n    self.duration = new Date() - start;\n    finished = true;\n    if (!err && self.duration > ms && self._enableTimeouts) {\n      err = new Error('timeout of ' + ms + 'ms exceeded. Ensure the done() callback is being called in this test.');\n    }\n    fn(err);\n  }\n\n  // for .resetTimeout()\n  this.callback = done;\n\n  // explicit async with `done` argument\n  if (this.async) {\n    this.resetTimeout();\n\n    if (this.allowUncaught) {\n      return callFnAsync(this.fn);\n    }\n    try {\n      callFnAsync(this.fn);\n    } catch (err) {\n      done(utils.getError(err));\n    }\n    return;\n  }\n\n  if (this.allowUncaught) {\n    callFn(this.fn);\n    done();\n    return;\n  }\n\n  // sync or promise-returning\n  try {\n    if (this.pending) {\n      done();\n    } else {\n      callFn(this.fn);\n    }\n  } catch (err) {\n    done(utils.getError(err));\n  }\n\n  function callFn(fn) {\n    var result = fn.call(ctx);\n    if (result && typeof result.then === 'function') {\n      self.resetTimeout();\n      result\n        .then(function() {\n          done();\n        },\n        function(reason) {\n          done(reason || new Error('Promise rejected with no or falsy reason'));\n        });\n    } else {\n      if (self.asyncOnly) {\n        return done(new Error('--async-only option in use without declaring `done()` or returning a promise'));\n      }\n\n      done();\n    }\n  }\n\n  function callFnAsync(fn) {\n    fn.call(ctx, function(err) {\n      if (err instanceof Error || toString.call(err) === '[object Error]') {\n        return done(err);\n      }\n      if (err) {\n        if (Object.prototype.toString.call(err) === '[object Object]') {\n          return done(new Error('done() invoked with non-Error: '\n            + JSON.stringify(err)));\n        }\n        return done(new Error('done() invoked with non-Error: ' + err));\n      }\n      done();\n    });\n  }\n};\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./ms\":15,\"./pending\":16,\"./utils\":39,\"debug\":2,\"events\":3}],36:[function(require,module,exports){\n(function (process,global){\n/**\n * Module dependencies.\n */\n\nvar EventEmitter = require('events').EventEmitter;\nvar Pending = require('./pending');\nvar utils = require('./utils');\nvar inherits = utils.inherits;\nvar debug = require('debug')('mocha:runner');\nvar Runnable = require('./runnable');\nvar filter = utils.filter;\nvar indexOf = utils.indexOf;\nvar keys = utils.keys;\nvar stackFilter = utils.stackTraceFilter();\nvar stringify = utils.stringify;\nvar type = utils.type;\nvar undefinedError = utils.undefinedError;\n\n/**\n * Non-enumerable globals.\n */\n\nvar globals = [\n  'setTimeout',\n  'clearTimeout',\n  'setInterval',\n  'clearInterval',\n  'XMLHttpRequest',\n  'Date',\n  'setImmediate',\n  'clearImmediate'\n];\n\n/**\n * Expose `Runner`.\n */\n\nmodule.exports = Runner;\n\n/**\n * Initialize a `Runner` for the given `suite`.\n *\n * Events:\n *\n *   - `start`  execution started\n *   - `end`  execution complete\n *   - `suite`  (suite) test suite execution started\n *   - `suite end`  (suite) all tests (and sub-suites) have finished\n *   - `test`  (test) test execution started\n *   - `test end`  (test) test completed\n *   - `hook`  (hook) hook execution started\n *   - `hook end`  (hook) hook complete\n *   - `pass`  (test) test passed\n *   - `fail`  (test, err) test failed\n *   - `pending`  (test) test pending\n *\n * @api public\n * @param {Suite} suite Root suite\n * @param {boolean} [delay] Whether or not to delay execution of root suite\n * until ready.\n */\nfunction Runner(suite, delay) {\n  var self = this;\n  this._globals = [];\n  this._abort = false;\n  this._delay = delay;\n  this.suite = suite;\n  this.started = false;\n  this.total = suite.total();\n  this.failures = 0;\n  this.on('test end', function(test) {\n    self.checkGlobals(test);\n  });\n  this.on('hook end', function(hook) {\n    self.checkGlobals(hook);\n  });\n  this._defaultGrep = /.*/;\n  this.grep(this._defaultGrep);\n  this.globals(this.globalProps().concat(extraGlobals()));\n}\n\n/**\n * Wrapper for setImmediate, process.nextTick, or browser polyfill.\n *\n * @param {Function} fn\n * @api private\n */\nRunner.immediately = global.setImmediate || process.nextTick;\n\n/**\n * Inherit from `EventEmitter.prototype`.\n */\ninherits(Runner, EventEmitter);\n\n/**\n * Run tests with full titles matching `re`. Updates runner.total\n * with number of tests matched.\n *\n * @param {RegExp} re\n * @param {Boolean} invert\n * @return {Runner} for chaining\n * @api public\n * @param {RegExp} re\n * @param {boolean} invert\n * @return {Runner} Runner instance.\n */\nRunner.prototype.grep = function(re, invert) {\n  debug('grep %s', re);\n  this._grep = re;\n  this._invert = invert;\n  this.total = this.grepTotal(this.suite);\n  return this;\n};\n\n/**\n * Returns the number of tests matching the grep search for the\n * given suite.\n *\n * @param {Suite} suite\n * @return {Number}\n * @api public\n * @param {Suite} suite\n * @return {number}\n */\nRunner.prototype.grepTotal = function(suite) {\n  var self = this;\n  var total = 0;\n\n  suite.eachTest(function(test) {\n    var match = self._grep.test(test.fullTitle());\n    if (self._invert) {\n      match = !match;\n    }\n    if (match) {\n      total++;\n    }\n  });\n\n  return total;\n};\n\n/**\n * Return a list of global properties.\n *\n * @return {Array}\n * @api private\n */\nRunner.prototype.globalProps = function() {\n  var props = keys(global);\n\n  // non-enumerables\n  for (var i = 0; i < globals.length; ++i) {\n    if (~indexOf(props, globals[i])) {\n      continue;\n    }\n    props.push(globals[i]);\n  }\n\n  return props;\n};\n\n/**\n * Allow the given `arr` of globals.\n *\n * @param {Array} arr\n * @return {Runner} for chaining\n * @api public\n * @param {Array} arr\n * @return {Runner} Runner instance.\n */\nRunner.prototype.globals = function(arr) {\n  if (!arguments.length) {\n    return this._globals;\n  }\n  debug('globals %j', arr);\n  this._globals = this._globals.concat(arr);\n  return this;\n};\n\n/**\n * Check for global variable leaks.\n *\n * @api private\n */\nRunner.prototype.checkGlobals = function(test) {\n  if (this.ignoreLeaks) {\n    return;\n  }\n  var ok = this._globals;\n\n  var globals = this.globalProps();\n  var leaks;\n\n  if (test) {\n    ok = ok.concat(test._allowedGlobals || []);\n  }\n\n  if (this.prevGlobalsLength === globals.length) {\n    return;\n  }\n  this.prevGlobalsLength = globals.length;\n\n  leaks = filterLeaks(ok, globals);\n  this._globals = this._globals.concat(leaks);\n\n  if (leaks.length > 1) {\n    this.fail(test, new Error('global leaks detected: ' + leaks.join(', ') + ''));\n  } else if (leaks.length) {\n    this.fail(test, new Error('global leak detected: ' + leaks[0]));\n  }\n};\n\n/**\n * Fail the given `test`.\n *\n * @api private\n * @param {Test} test\n * @param {Error} err\n */\nRunner.prototype.fail = function(test, err) {\n  ++this.failures;\n  test.state = 'failed';\n\n  if (!(err instanceof Error || err && typeof err.message === 'string')) {\n    err = new Error('the ' + type(err) + ' ' + stringify(err) + ' was thrown, throw an Error :)');\n  }\n\n  err.stack = (this.fullStackTrace || !err.stack)\n    ? err.stack\n    : stackFilter(err.stack);\n\n  this.emit('fail', test, err);\n};\n\n/**\n * Fail the given `hook` with `err`.\n *\n * Hook failures work in the following pattern:\n * - If bail, then exit\n * - Failed `before` hook skips all tests in a suite and subsuites,\n *   but jumps to corresponding `after` hook\n * - Failed `before each` hook skips remaining tests in a\n *   suite and jumps to corresponding `after each` hook,\n *   which is run only once\n * - Failed `after` hook does not alter\n *   execution order\n * - Failed `after each` hook skips remaining tests in a\n *   suite and subsuites, but executes other `after each`\n *   hooks\n *\n * @api private\n * @param {Hook} hook\n * @param {Error} err\n */\nRunner.prototype.failHook = function(hook, err) {\n  if (hook.ctx && hook.ctx.currentTest) {\n    hook.originalTitle = hook.originalTitle || hook.title;\n    hook.title = hook.originalTitle + ' for \"' + hook.ctx.currentTest.title + '\"';\n  }\n\n  this.fail(hook, err);\n  if (this.suite.bail()) {\n    this.emit('end');\n  }\n};\n\n/**\n * Run hook `name` callbacks and then invoke `fn()`.\n *\n * @api private\n * @param {string} name\n * @param {Function} fn\n */\n\nRunner.prototype.hook = function(name, fn) {\n  var suite = this.suite;\n  var hooks = suite['_' + name];\n  var self = this;\n\n  function next(i) {\n    var hook = hooks[i];\n    if (!hook) {\n      return fn();\n    }\n    self.currentRunnable = hook;\n\n    hook.ctx.currentTest = self.test;\n\n    self.emit('hook', hook);\n\n    if (!hook.listeners('error').length) {\n      hook.on('error', function(err) {\n        self.failHook(hook, err);\n      });\n    }\n\n    hook.run(function(err) {\n      var testError = hook.error();\n      if (testError) {\n        self.fail(self.test, testError);\n      }\n      if (err) {\n        if (err instanceof Pending) {\n          suite.pending = true;\n        } else {\n          self.failHook(hook, err);\n\n          // stop executing hooks, notify callee of hook err\n          return fn(err);\n        }\n      }\n      self.emit('hook end', hook);\n      delete hook.ctx.currentTest;\n      next(++i);\n    });\n  }\n\n  Runner.immediately(function() {\n    next(0);\n  });\n};\n\n/**\n * Run hook `name` for the given array of `suites`\n * in order, and callback `fn(err, errSuite)`.\n *\n * @api private\n * @param {string} name\n * @param {Array} suites\n * @param {Function} fn\n */\nRunner.prototype.hooks = function(name, suites, fn) {\n  var self = this;\n  var orig = this.suite;\n\n  function next(suite) {\n    self.suite = suite;\n\n    if (!suite) {\n      self.suite = orig;\n      return fn();\n    }\n\n    self.hook(name, function(err) {\n      if (err) {\n        var errSuite = self.suite;\n        self.suite = orig;\n        return fn(err, errSuite);\n      }\n\n      next(suites.pop());\n    });\n  }\n\n  next(suites.pop());\n};\n\n/**\n * Run hooks from the top level down.\n *\n * @param {String} name\n * @param {Function} fn\n * @api private\n */\nRunner.prototype.hookUp = function(name, fn) {\n  var suites = [this.suite].concat(this.parents()).reverse();\n  this.hooks(name, suites, fn);\n};\n\n/**\n * Run hooks from the bottom up.\n *\n * @param {String} name\n * @param {Function} fn\n * @api private\n */\nRunner.prototype.hookDown = function(name, fn) {\n  var suites = [this.suite].concat(this.parents());\n  this.hooks(name, suites, fn);\n};\n\n/**\n * Return an array of parent Suites from\n * closest to furthest.\n *\n * @return {Array}\n * @api private\n */\nRunner.prototype.parents = function() {\n  var suite = this.suite;\n  var suites = [];\n  while (suite.parent) {\n    suite = suite.parent;\n    suites.push(suite);\n  }\n  return suites;\n};\n\n/**\n * Run the current test and callback `fn(err)`.\n *\n * @param {Function} fn\n * @api private\n */\nRunner.prototype.runTest = function(fn) {\n  var self = this;\n  var test = this.test;\n\n  if (this.asyncOnly) {\n    test.asyncOnly = true;\n  }\n\n  if (this.allowUncaught) {\n    test.allowUncaught = true;\n    return test.run(fn);\n  }\n  try {\n    test.on('error', function(err) {\n      self.fail(test, err);\n    });\n    test.run(fn);\n  } catch (err) {\n    fn(err);\n  }\n};\n\n/**\n * Run tests in the given `suite` and invoke the callback `fn()` when complete.\n *\n * @api private\n * @param {Suite} suite\n * @param {Function} fn\n */\nRunner.prototype.runTests = function(suite, fn) {\n  var self = this;\n  var tests = suite.tests.slice();\n  var test;\n\n  function hookErr(_, errSuite, after) {\n    // before/after Each hook for errSuite failed:\n    var orig = self.suite;\n\n    // for failed 'after each' hook start from errSuite parent,\n    // otherwise start from errSuite itself\n    self.suite = after ? errSuite.parent : errSuite;\n\n    if (self.suite) {\n      // call hookUp afterEach\n      self.hookUp('afterEach', function(err2, errSuite2) {\n        self.suite = orig;\n        // some hooks may fail even now\n        if (err2) {\n          return hookErr(err2, errSuite2, true);\n        }\n        // report error suite\n        fn(errSuite);\n      });\n    } else {\n      // there is no need calling other 'after each' hooks\n      self.suite = orig;\n      fn(errSuite);\n    }\n  }\n\n  function next(err, errSuite) {\n    // if we bail after first err\n    if (self.failures && suite._bail) {\n      return fn();\n    }\n\n    if (self._abort) {\n      return fn();\n    }\n\n    if (err) {\n      return hookErr(err, errSuite, true);\n    }\n\n    // next test\n    test = tests.shift();\n\n    // all done\n    if (!test) {\n      return fn();\n    }\n\n    // grep\n    var match = self._grep.test(test.fullTitle());\n    if (self._invert) {\n      match = !match;\n    }\n    if (!match) {\n      // Run immediately only if we have defined a grep. When we\n      // define a grep — It can cause maximum callstack error if\n      // the grep is doing a large recursive loop by neglecting\n      // all tests. The run immediately function also comes with\n      // a performance cost. So we don't want to run immediately\n      // if we run the whole test suite, because running the whole\n      // test suite don't do any immediate recursive loops. Thus,\n      // allowing a JS runtime to breathe.\n      if (self._grep !== self._defaultGrep) {\n        Runner.immediately(next);\n      } else {\n        next();\n      }\n      return;\n    }\n\n    // pending\n    if (test.pending) {\n      self.emit('pending', test);\n      self.emit('test end', test);\n      return next();\n    }\n\n    // execute test and hook(s)\n    self.emit('test', self.test = test);\n    self.hookDown('beforeEach', function(err, errSuite) {\n      if (suite.pending) {\n        self.emit('pending', test);\n        self.emit('test end', test);\n        return next();\n      }\n      if (err) {\n        return hookErr(err, errSuite, false);\n      }\n      self.currentRunnable = self.test;\n      self.runTest(function(err) {\n        test = self.test;\n\n        if (err) {\n          if (err instanceof Pending) {\n            self.emit('pending', test);\n          } else {\n            self.fail(test, err);\n          }\n          self.emit('test end', test);\n\n          if (err instanceof Pending) {\n            return next();\n          }\n\n          return self.hookUp('afterEach', next);\n        }\n\n        test.state = 'passed';\n        self.emit('pass', test);\n        self.emit('test end', test);\n        self.hookUp('afterEach', next);\n      });\n    });\n  }\n\n  this.next = next;\n  this.hookErr = hookErr;\n  next();\n};\n\n/**\n * Run the given `suite` and invoke the callback `fn()` when complete.\n *\n * @api private\n * @param {Suite} suite\n * @param {Function} fn\n */\nRunner.prototype.runSuite = function(suite, fn) {\n  var i = 0;\n  var self = this;\n  var total = this.grepTotal(suite);\n  var afterAllHookCalled = false;\n\n  debug('run suite %s', suite.fullTitle());\n\n  if (!total || (self.failures && suite._bail)) {\n    return fn();\n  }\n\n  this.emit('suite', this.suite = suite);\n\n  function next(errSuite) {\n    if (errSuite) {\n      // current suite failed on a hook from errSuite\n      if (errSuite === suite) {\n        // if errSuite is current suite\n        // continue to the next sibling suite\n        return done();\n      }\n      // errSuite is among the parents of current suite\n      // stop execution of errSuite and all sub-suites\n      return done(errSuite);\n    }\n\n    if (self._abort) {\n      return done();\n    }\n\n    var curr = suite.suites[i++];\n    if (!curr) {\n      return done();\n    }\n\n    // Avoid grep neglecting large number of tests causing a\n    // huge recursive loop and thus a maximum call stack error.\n    // See comment in `this.runTests()` for more information.\n    if (self._grep !== self._defaultGrep) {\n      Runner.immediately(function() {\n        self.runSuite(curr, next);\n      });\n    } else {\n      self.runSuite(curr, next);\n    }\n  }\n\n  function done(errSuite) {\n    self.suite = suite;\n    self.nextSuite = next;\n\n    if (afterAllHookCalled) {\n      fn(errSuite);\n    } else {\n      // mark that the afterAll block has been called once\n      // and so can be skipped if there is an error in it.\n      afterAllHookCalled = true;\n      self.hook('afterAll', function() {\n        self.emit('suite end', suite);\n        fn(errSuite);\n      });\n    }\n  }\n\n  this.nextSuite = next;\n\n  this.hook('beforeAll', function(err) {\n    if (err) {\n      return done();\n    }\n    self.runTests(suite, next);\n  });\n};\n\n/**\n * Handle uncaught exceptions.\n *\n * @param {Error} err\n * @api private\n */\nRunner.prototype.uncaught = function(err) {\n  if (err) {\n    debug('uncaught exception %s', err !== function() {\n      return this;\n    }.call(err) ? err : (err.message || err));\n  } else {\n    debug('uncaught undefined exception');\n    err = undefinedError();\n  }\n  err.uncaught = true;\n\n  var runnable = this.currentRunnable;\n\n  if (!runnable) {\n    runnable = new Runnable('Uncaught error outside test suite');\n    runnable.parent = this.suite;\n\n    if (this.started) {\n      this.fail(runnable, err);\n    } else {\n      // Can't recover from this failure\n      this.emit('start');\n      this.fail(runnable, err);\n      this.emit('end');\n    }\n\n    return;\n  }\n\n  runnable.clearTimeout();\n\n  // Ignore errors if complete\n  if (runnable.state) {\n    return;\n  }\n  this.fail(runnable, err);\n\n  // recover from test\n  if (runnable.type === 'test') {\n    this.emit('test end', runnable);\n    this.hookUp('afterEach', this.next);\n    return;\n  }\n\n // recover from hooks\n  if (runnable.type === 'hook') {\n    var errSuite = this.suite;\n    // if hook failure is in afterEach block\n    if (runnable.fullTitle().indexOf('after each') > -1) {\n      return this.hookErr(err, errSuite, true);\n    }\n    // if hook failure is in beforeEach block\n    if (runnable.fullTitle().indexOf('before each') > -1) {\n      return this.hookErr(err, errSuite, false);\n    }\n    // if hook failure is in after or before blocks\n    return this.nextSuite(errSuite);\n  }\n\n  // bail\n  this.emit('end');\n};\n\n/**\n * Run the root suite and invoke `fn(failures)`\n * on completion.\n *\n * @param {Function} fn\n * @return {Runner} for chaining\n * @api public\n * @param {Function} fn\n * @return {Runner} Runner instance.\n */\nRunner.prototype.run = function(fn) {\n  var self = this;\n  var rootSuite = this.suite;\n\n  fn = fn || function() {};\n\n  function uncaught(err) {\n    self.uncaught(err);\n  }\n\n  function start() {\n    self.started = true;\n    self.emit('start');\n    self.runSuite(rootSuite, function() {\n      debug('finished running');\n      self.emit('end');\n    });\n  }\n\n  debug('start');\n\n  // callback\n  this.on('end', function() {\n    debug('end');\n    process.removeListener('uncaughtException', uncaught);\n    fn(self.failures);\n  });\n\n  // uncaught exception\n  process.on('uncaughtException', uncaught);\n\n  if (this._delay) {\n    // for reporters, I guess.\n    // might be nice to debounce some dots while we wait.\n    this.emit('waiting', rootSuite);\n    rootSuite.once('run', start);\n  } else {\n    start();\n  }\n\n  return this;\n};\n\n/**\n * Cleanly abort execution.\n *\n * @api public\n * @return {Runner} Runner instance.\n */\nRunner.prototype.abort = function() {\n  debug('aborting');\n  this._abort = true;\n\n  return this;\n};\n\n/**\n * Filter leaks with the given globals flagged as `ok`.\n *\n * @api private\n * @param {Array} ok\n * @param {Array} globals\n * @return {Array}\n */\nfunction filterLeaks(ok, globals) {\n  return filter(globals, function(key) {\n    // Firefox and Chrome exposes iframes as index inside the window object\n    if (/^d+/.test(key)) {\n      return false;\n    }\n\n    // in firefox\n    // if runner runs in an iframe, this iframe's window.getInterface method not init at first\n    // it is assigned in some seconds\n    if (global.navigator && (/^getInterface/).test(key)) {\n      return false;\n    }\n\n    // an iframe could be approached by window[iframeIndex]\n    // in ie6,7,8 and opera, iframeIndex is enumerable, this could cause leak\n    if (global.navigator && (/^\\d+/).test(key)) {\n      return false;\n    }\n\n    // Opera and IE expose global variables for HTML element IDs (issue #243)\n    if (/^mocha-/.test(key)) {\n      return false;\n    }\n\n    var matched = filter(ok, function(ok) {\n      if (~ok.indexOf('*')) {\n        return key.indexOf(ok.split('*')[0]) === 0;\n      }\n      return key === ok;\n    });\n    return !matched.length && (!global.navigator || key !== 'onerror');\n  });\n}\n\n/**\n * Array of globals dependent on the environment.\n *\n * @return {Array}\n * @api private\n */\nfunction extraGlobals() {\n  if (typeof process === 'object' && typeof process.version === 'string') {\n    var parts = process.version.split('.');\n    var nodeVersion = utils.reduce(parts, function(a, v) {\n      return a << 8 | v;\n    });\n\n    // 'errno' was renamed to process._errno in v0.9.11.\n\n    if (nodeVersion < 0x00090B) {\n      return ['errno'];\n    }\n  }\n\n  return [];\n}\n\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./pending\":16,\"./runnable\":35,\"./utils\":39,\"_process\":51,\"debug\":2,\"events\":3}],37:[function(require,module,exports){\n/**\n * Module dependencies.\n */\n\nvar EventEmitter = require('events').EventEmitter;\nvar Hook = require('./hook');\nvar utils = require('./utils');\nvar inherits = utils.inherits;\nvar debug = require('debug')('mocha:suite');\nvar milliseconds = require('./ms');\n\n/**\n * Expose `Suite`.\n */\n\nexports = module.exports = Suite;\n\n/**\n * Create a new `Suite` with the given `title` and parent `Suite`. When a suite\n * with the same title is already present, that suite is returned to provide\n * nicer reporter and more flexible meta-testing.\n *\n * @api public\n * @param {Suite} parent\n * @param {string} title\n * @return {Suite}\n */\nexports.create = function(parent, title) {\n  var suite = new Suite(title, parent.ctx);\n  suite.parent = parent;\n  if (parent.pending) {\n    suite.pending = true;\n  }\n  title = suite.fullTitle();\n  parent.addSuite(suite);\n  return suite;\n};\n\n/**\n * Initialize a new `Suite` with the given `title` and `ctx`.\n *\n * @api private\n * @param {string} title\n * @param {Context} parentContext\n */\nfunction Suite(title, parentContext) {\n  this.title = title;\n  function Context() {}\n  Context.prototype = parentContext;\n  this.ctx = new Context();\n  this.suites = [];\n  this.tests = [];\n  this.pending = false;\n  this._beforeEach = [];\n  this._beforeAll = [];\n  this._afterEach = [];\n  this._afterAll = [];\n  this.root = !title;\n  this._timeout = 2000;\n  this._enableTimeouts = true;\n  this._slow = 75;\n  this._bail = false;\n  this.delayed = false;\n}\n\n/**\n * Inherit from `EventEmitter.prototype`.\n */\ninherits(Suite, EventEmitter);\n\n/**\n * Return a clone of this `Suite`.\n *\n * @api private\n * @return {Suite}\n */\nSuite.prototype.clone = function() {\n  var suite = new Suite(this.title);\n  debug('clone');\n  suite.ctx = this.ctx;\n  suite.timeout(this.timeout());\n  suite.enableTimeouts(this.enableTimeouts());\n  suite.slow(this.slow());\n  suite.bail(this.bail());\n  return suite;\n};\n\n/**\n * Set timeout `ms` or short-hand such as \"2s\".\n *\n * @api private\n * @param {number|string} ms\n * @return {Suite|number} for chaining\n */\nSuite.prototype.timeout = function(ms) {\n  if (!arguments.length) {\n    return this._timeout;\n  }\n  if (ms.toString() === '0') {\n    this._enableTimeouts = false;\n  }\n  if (typeof ms === 'string') {\n    ms = milliseconds(ms);\n  }\n  debug('timeout %d', ms);\n  this._timeout = parseInt(ms, 10);\n  return this;\n};\n\n/**\n  * Set timeout to `enabled`.\n  *\n  * @api private\n  * @param {boolean} enabled\n  * @return {Suite|boolean} self or enabled\n  */\nSuite.prototype.enableTimeouts = function(enabled) {\n  if (!arguments.length) {\n    return this._enableTimeouts;\n  }\n  debug('enableTimeouts %s', enabled);\n  this._enableTimeouts = enabled;\n  return this;\n};\n\n/**\n * Set slow `ms` or short-hand such as \"2s\".\n *\n * @api private\n * @param {number|string} ms\n * @return {Suite|number} for chaining\n */\nSuite.prototype.slow = function(ms) {\n  if (!arguments.length) {\n    return this._slow;\n  }\n  if (typeof ms === 'string') {\n    ms = milliseconds(ms);\n  }\n  debug('slow %d', ms);\n  this._slow = ms;\n  return this;\n};\n\n/**\n * Sets whether to bail after first error.\n *\n * @api private\n * @param {boolean} bail\n * @return {Suite|number} for chaining\n */\nSuite.prototype.bail = function(bail) {\n  if (!arguments.length) {\n    return this._bail;\n  }\n  debug('bail %s', bail);\n  this._bail = bail;\n  return this;\n};\n\n/**\n * Run `fn(test[, done])` before running tests.\n *\n * @api private\n * @param {string} title\n * @param {Function} fn\n * @return {Suite} for chaining\n */\nSuite.prototype.beforeAll = function(title, fn) {\n  if (this.pending) {\n    return this;\n  }\n  if (typeof title === 'function') {\n    fn = title;\n    title = fn.name;\n  }\n  title = '\"before all\" hook' + (title ? ': ' + title : '');\n\n  var hook = new Hook(title, fn);\n  hook.parent = this;\n  hook.timeout(this.timeout());\n  hook.enableTimeouts(this.enableTimeouts());\n  hook.slow(this.slow());\n  hook.ctx = this.ctx;\n  this._beforeAll.push(hook);\n  this.emit('beforeAll', hook);\n  return this;\n};\n\n/**\n * Run `fn(test[, done])` after running tests.\n *\n * @api private\n * @param {string} title\n * @param {Function} fn\n * @return {Suite} for chaining\n */\nSuite.prototype.afterAll = function(title, fn) {\n  if (this.pending) {\n    return this;\n  }\n  if (typeof title === 'function') {\n    fn = title;\n    title = fn.name;\n  }\n  title = '\"after all\" hook' + (title ? ': ' + title : '');\n\n  var hook = new Hook(title, fn);\n  hook.parent = this;\n  hook.timeout(this.timeout());\n  hook.enableTimeouts(this.enableTimeouts());\n  hook.slow(this.slow());\n  hook.ctx = this.ctx;\n  this._afterAll.push(hook);\n  this.emit('afterAll', hook);\n  return this;\n};\n\n/**\n * Run `fn(test[, done])` before each test case.\n *\n * @api private\n * @param {string} title\n * @param {Function} fn\n * @return {Suite} for chaining\n */\nSuite.prototype.beforeEach = function(title, fn) {\n  if (this.pending) {\n    return this;\n  }\n  if (typeof title === 'function') {\n    fn = title;\n    title = fn.name;\n  }\n  title = '\"before each\" hook' + (title ? ': ' + title : '');\n\n  var hook = new Hook(title, fn);\n  hook.parent = this;\n  hook.timeout(this.timeout());\n  hook.enableTimeouts(this.enableTimeouts());\n  hook.slow(this.slow());\n  hook.ctx = this.ctx;\n  this._beforeEach.push(hook);\n  this.emit('beforeEach', hook);\n  return this;\n};\n\n/**\n * Run `fn(test[, done])` after each test case.\n *\n * @api private\n * @param {string} title\n * @param {Function} fn\n * @return {Suite} for chaining\n */\nSuite.prototype.afterEach = function(title, fn) {\n  if (this.pending) {\n    return this;\n  }\n  if (typeof title === 'function') {\n    fn = title;\n    title = fn.name;\n  }\n  title = '\"after each\" hook' + (title ? ': ' + title : '');\n\n  var hook = new Hook(title, fn);\n  hook.parent = this;\n  hook.timeout(this.timeout());\n  hook.enableTimeouts(this.enableTimeouts());\n  hook.slow(this.slow());\n  hook.ctx = this.ctx;\n  this._afterEach.push(hook);\n  this.emit('afterEach', hook);\n  return this;\n};\n\n/**\n * Add a test `suite`.\n *\n * @api private\n * @param {Suite} suite\n * @return {Suite} for chaining\n */\nSuite.prototype.addSuite = function(suite) {\n  suite.parent = this;\n  suite.timeout(this.timeout());\n  suite.enableTimeouts(this.enableTimeouts());\n  suite.slow(this.slow());\n  suite.bail(this.bail());\n  this.suites.push(suite);\n  this.emit('suite', suite);\n  return this;\n};\n\n/**\n * Add a `test` to this suite.\n *\n * @api private\n * @param {Test} test\n * @return {Suite} for chaining\n */\nSuite.prototype.addTest = function(test) {\n  test.parent = this;\n  test.timeout(this.timeout());\n  test.enableTimeouts(this.enableTimeouts());\n  test.slow(this.slow());\n  test.ctx = this.ctx;\n  this.tests.push(test);\n  this.emit('test', test);\n  return this;\n};\n\n/**\n * Return the full title generated by recursively concatenating the parent's\n * full title.\n *\n * @api public\n * @return {string}\n */\nSuite.prototype.fullTitle = function() {\n  if (this.parent) {\n    var full = this.parent.fullTitle();\n    if (full) {\n      return full + ' ' + this.title;\n    }\n  }\n  return this.title;\n};\n\n/**\n * Return the total number of tests.\n *\n * @api public\n * @return {number}\n */\nSuite.prototype.total = function() {\n  return utils.reduce(this.suites, function(sum, suite) {\n    return sum + suite.total();\n  }, 0) + this.tests.length;\n};\n\n/**\n * Iterates through each suite recursively to find all tests. Applies a\n * function in the format `fn(test)`.\n *\n * @api private\n * @param {Function} fn\n * @return {Suite}\n */\nSuite.prototype.eachTest = function(fn) {\n  utils.forEach(this.tests, fn);\n  utils.forEach(this.suites, function(suite) {\n    suite.eachTest(fn);\n  });\n  return this;\n};\n\n/**\n * This will run the root suite if we happen to be running in delayed mode.\n */\nSuite.prototype.run = function run() {\n  if (this.root) {\n    this.emit('run');\n  }\n};\n\n},{\"./hook\":7,\"./ms\":15,\"./utils\":39,\"debug\":2,\"events\":3}],38:[function(require,module,exports){\n/**\n * Module dependencies.\n */\n\nvar Runnable = require('./runnable');\nvar inherits = require('./utils').inherits;\n\n/**\n * Expose `Test`.\n */\n\nmodule.exports = Test;\n\n/**\n * Initialize a new `Test` with the given `title` and callback `fn`.\n *\n * @api private\n * @param {String} title\n * @param {Function} fn\n */\nfunction Test(title, fn) {\n  Runnable.call(this, title, fn);\n  this.pending = !fn;\n  this.type = 'test';\n}\n\n/**\n * Inherit from `Runnable.prototype`.\n */\ninherits(Test, Runnable);\n\n},{\"./runnable\":35,\"./utils\":39}],39:[function(require,module,exports){\n(function (process,Buffer){\n/* eslint-env browser */\n\n/**\n * Module dependencies.\n */\n\nvar basename = require('path').basename;\nvar debug = require('debug')('mocha:watch');\nvar exists = require('fs').existsSync || require('path').existsSync;\nvar glob = require('glob');\nvar join = require('path').join;\nvar readdirSync = require('fs').readdirSync;\nvar statSync = require('fs').statSync;\nvar watchFile = require('fs').watchFile;\n\n/**\n * Ignored directories.\n */\n\nvar ignore = ['node_modules', '.git'];\n\nexports.inherits = require('util').inherits;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @api private\n * @param  {string} html\n * @return {string}\n */\nexports.escape = function(html) {\n  return String(html)\n    .replace(/&/g, '&amp;')\n    .replace(/\"/g, '&quot;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;');\n};\n\n/**\n * Array#forEach (<=IE8)\n *\n * @api private\n * @param {Array} arr\n * @param {Function} fn\n * @param {Object} scope\n */\nexports.forEach = function(arr, fn, scope) {\n  for (var i = 0, l = arr.length; i < l; i++) {\n    fn.call(scope, arr[i], i);\n  }\n};\n\n/**\n * Test if the given obj is type of string.\n *\n * @api private\n * @param {Object} obj\n * @return {boolean}\n */\nexports.isString = function(obj) {\n  return typeof obj === 'string';\n};\n\n/**\n * Array#map (<=IE8)\n *\n * @api private\n * @param {Array} arr\n * @param {Function} fn\n * @param {Object} scope\n * @return {Array}\n */\nexports.map = function(arr, fn, scope) {\n  var result = [];\n  for (var i = 0, l = arr.length; i < l; i++) {\n    result.push(fn.call(scope, arr[i], i, arr));\n  }\n  return result;\n};\n\n/**\n * Array#indexOf (<=IE8)\n *\n * @api private\n * @param {Array} arr\n * @param {Object} obj to find index of\n * @param {number} start\n * @return {number}\n */\nexports.indexOf = function(arr, obj, start) {\n  for (var i = start || 0, l = arr.length; i < l; i++) {\n    if (arr[i] === obj) {\n      return i;\n    }\n  }\n  return -1;\n};\n\n/**\n * Array#reduce (<=IE8)\n *\n * @api private\n * @param {Array} arr\n * @param {Function} fn\n * @param {Object} val Initial value.\n * @return {*}\n */\nexports.reduce = function(arr, fn, val) {\n  var rval = val;\n\n  for (var i = 0, l = arr.length; i < l; i++) {\n    rval = fn(rval, arr[i], i, arr);\n  }\n\n  return rval;\n};\n\n/**\n * Array#filter (<=IE8)\n *\n * @api private\n * @param {Array} arr\n * @param {Function} fn\n * @return {Array}\n */\nexports.filter = function(arr, fn) {\n  var ret = [];\n\n  for (var i = 0, l = arr.length; i < l; i++) {\n    var val = arr[i];\n    if (fn(val, i, arr)) {\n      ret.push(val);\n    }\n  }\n\n  return ret;\n};\n\n/**\n * Object.keys (<=IE8)\n *\n * @api private\n * @param {Object} obj\n * @return {Array} keys\n */\nexports.keys = typeof Object.keys === 'function' ? Object.keys : function(obj) {\n  var keys = [];\n  var has = Object.prototype.hasOwnProperty; // for `window` on <=IE8\n\n  for (var key in obj) {\n    if (has.call(obj, key)) {\n      keys.push(key);\n    }\n  }\n\n  return keys;\n};\n\n/**\n * Watch the given `files` for changes\n * and invoke `fn(file)` on modification.\n *\n * @api private\n * @param {Array} files\n * @param {Function} fn\n */\nexports.watch = function(files, fn) {\n  var options = { interval: 100 };\n  files.forEach(function(file) {\n    debug('file %s', file);\n    watchFile(file, options, function(curr, prev) {\n      if (prev.mtime < curr.mtime) {\n        fn(file);\n      }\n    });\n  });\n};\n\n/**\n * Array.isArray (<=IE8)\n *\n * @api private\n * @param {Object} obj\n * @return {Boolean}\n */\nvar isArray = typeof Array.isArray === 'function' ? Array.isArray : function(obj) {\n  return Object.prototype.toString.call(obj) === '[object Array]';\n};\n\n/**\n * Buffer.prototype.toJSON polyfill.\n *\n * @type {Function}\n */\nif (typeof Buffer !== 'undefined' && Buffer.prototype) {\n  Buffer.prototype.toJSON = Buffer.prototype.toJSON || function() {\n    return Array.prototype.slice.call(this, 0);\n  };\n}\n\n/**\n * Ignored files.\n *\n * @api private\n * @param {string} path\n * @return {boolean}\n */\nfunction ignored(path) {\n  return !~ignore.indexOf(path);\n}\n\n/**\n * Lookup files in the given `dir`.\n *\n * @api private\n * @param {string} dir\n * @param {string[]} [ext=['.js']]\n * @param {Array} [ret=[]]\n * @return {Array}\n */\nexports.files = function(dir, ext, ret) {\n  ret = ret || [];\n  ext = ext || ['js'];\n\n  var re = new RegExp('\\\\.(' + ext.join('|') + ')$');\n\n  readdirSync(dir)\n    .filter(ignored)\n    .forEach(function(path) {\n      path = join(dir, path);\n      if (statSync(path).isDirectory()) {\n        exports.files(path, ext, ret);\n      } else if (path.match(re)) {\n        ret.push(path);\n      }\n    });\n\n  return ret;\n};\n\n/**\n * Compute a slug from the given `str`.\n *\n * @api private\n * @param {string} str\n * @return {string}\n */\nexports.slug = function(str) {\n  return str\n    .toLowerCase()\n    .replace(/ +/g, '-')\n    .replace(/[^-\\w]/g, '');\n};\n\n/**\n * Strip the function definition from `str`, and re-indent for pre whitespace.\n *\n * @param {string} str\n * @return {string}\n */\nexports.clean = function(str) {\n  str = str\n    .replace(/\\r\\n?|[\\n\\u2028\\u2029]/g, '\\n').replace(/^\\uFEFF/, '')\n    .replace(/^function *\\(.*\\)\\s*{|\\(.*\\) *=> *{?/, '')\n    .replace(/\\s+\\}$/, '');\n\n  var spaces = str.match(/^\\n?( *)/)[1].length;\n  var tabs = str.match(/^\\n?(\\t*)/)[1].length;\n  var re = new RegExp('^\\n?' + (tabs ? '\\t' : ' ') + '{' + (tabs ? tabs : spaces) + '}', 'gm');\n\n  str = str.replace(re, '');\n\n  return exports.trim(str);\n};\n\n/**\n * Trim the given `str`.\n *\n * @api private\n * @param {string} str\n * @return {string}\n */\nexports.trim = function(str) {\n  return str.replace(/^\\s+|\\s+$/g, '');\n};\n\n/**\n * Parse the given `qs`.\n *\n * @api private\n * @param {string} qs\n * @return {Object}\n */\nexports.parseQuery = function(qs) {\n  return exports.reduce(qs.replace('?', '').split('&'), function(obj, pair) {\n    var i = pair.indexOf('=');\n    var key = pair.slice(0, i);\n    var val = pair.slice(++i);\n\n    obj[key] = decodeURIComponent(val);\n    return obj;\n  }, {});\n};\n\n/**\n * Highlight the given string of `js`.\n *\n * @api private\n * @param {string} js\n * @return {string}\n */\nfunction highlight(js) {\n  return js\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n    .replace(/\\/\\/(.*)/gm, '<span class=\"comment\">//$1</span>')\n    .replace(/('.*?')/gm, '<span class=\"string\">$1</span>')\n    .replace(/(\\d+\\.\\d+)/gm, '<span class=\"number\">$1</span>')\n    .replace(/(\\d+)/gm, '<span class=\"number\">$1</span>')\n    .replace(/\\bnew[ \\t]+(\\w+)/gm, '<span class=\"keyword\">new</span> <span class=\"init\">$1</span>')\n    .replace(/\\b(function|new|throw|return|var|if|else)\\b/gm, '<span class=\"keyword\">$1</span>');\n}\n\n/**\n * Highlight the contents of tag `name`.\n *\n * @api private\n * @param {string} name\n */\nexports.highlightTags = function(name) {\n  var code = document.getElementById('mocha').getElementsByTagName(name);\n  for (var i = 0, len = code.length; i < len; ++i) {\n    code[i].innerHTML = highlight(code[i].innerHTML);\n  }\n};\n\n/**\n * If a value could have properties, and has none, this function is called,\n * which returns a string representation of the empty value.\n *\n * Functions w/ no properties return `'[Function]'`\n * Arrays w/ length === 0 return `'[]'`\n * Objects w/ no properties return `'{}'`\n * All else: return result of `value.toString()`\n *\n * @api private\n * @param {*} value The value to inspect.\n * @param {string} [type] The type of the value, if known.\n * @returns {string}\n */\nfunction emptyRepresentation(value, type) {\n  type = type || exports.type(value);\n\n  switch (type) {\n    case 'function':\n      return '[Function]';\n    case 'object':\n      return '{}';\n    case 'array':\n      return '[]';\n    default:\n      return value.toString();\n  }\n}\n\n/**\n * Takes some variable and asks `Object.prototype.toString()` what it thinks it\n * is.\n *\n * @api private\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString\n * @param {*} value The value to test.\n * @returns {string}\n * @example\n * type({}) // 'object'\n * type([]) // 'array'\n * type(1) // 'number'\n * type(false) // 'boolean'\n * type(Infinity) // 'number'\n * type(null) // 'null'\n * type(new Date()) // 'date'\n * type(/foo/) // 'regexp'\n * type('type') // 'string'\n * type(global) // 'global'\n */\nexports.type = function type(value) {\n  if (value === undefined) {\n    return 'undefined';\n  } else if (value === null) {\n    return 'null';\n  } else if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) {\n    return 'buffer';\n  }\n  return Object.prototype.toString.call(value)\n    .replace(/^\\[.+\\s(.+?)\\]$/, '$1')\n    .toLowerCase();\n};\n\n/**\n * Stringify `value`. Different behavior depending on type of value:\n *\n * - If `value` is undefined or null, return `'[undefined]'` or `'[null]'`, respectively.\n * - If `value` is not an object, function or array, return result of `value.toString()` wrapped in double-quotes.\n * - If `value` is an *empty* object, function, or array, return result of function\n *   {@link emptyRepresentation}.\n * - If `value` has properties, call {@link exports.canonicalize} on it, then return result of\n *   JSON.stringify().\n *\n * @api private\n * @see exports.type\n * @param {*} value\n * @return {string}\n */\nexports.stringify = function(value) {\n  var type = exports.type(value);\n\n  if (!~exports.indexOf(['object', 'array', 'function'], type)) {\n    if (type !== 'buffer') {\n      return jsonStringify(value);\n    }\n    var json = value.toJSON();\n    // Based on the toJSON result\n    return jsonStringify(json.data && json.type ? json.data : json, 2)\n      .replace(/,(\\n|$)/g, '$1');\n  }\n\n  for (var prop in value) {\n    if (Object.prototype.hasOwnProperty.call(value, prop)) {\n      return jsonStringify(exports.canonicalize(value), 2).replace(/,(\\n|$)/g, '$1');\n    }\n  }\n\n  return emptyRepresentation(value, type);\n};\n\n/**\n * like JSON.stringify but more sense.\n *\n * @api private\n * @param {Object}  object\n * @param {number=} spaces\n * @param {number=} depth\n * @returns {*}\n */\nfunction jsonStringify(object, spaces, depth) {\n  if (typeof spaces === 'undefined') {\n    // primitive types\n    return _stringify(object);\n  }\n\n  depth = depth || 1;\n  var space = spaces * depth;\n  var str = isArray(object) ? '[' : '{';\n  var end = isArray(object) ? ']' : '}';\n  var length = object.length || exports.keys(object).length;\n  // `.repeat()` polyfill\n  function repeat(s, n) {\n    return new Array(n).join(s);\n  }\n\n  function _stringify(val) {\n    switch (exports.type(val)) {\n      case 'null':\n      case 'undefined':\n        val = '[' + val + ']';\n        break;\n      case 'array':\n      case 'object':\n        val = jsonStringify(val, spaces, depth + 1);\n        break;\n      case 'boolean':\n      case 'regexp':\n      case 'number':\n        val = val === 0 && (1 / val) === -Infinity // `-0`\n          ? '-0'\n          : val.toString();\n        break;\n      case 'date':\n        var sDate = isNaN(val.getTime())        // Invalid date\n          ? val.toString()\n          : val.toISOString();\n        val = '[Date: ' + sDate + ']';\n        break;\n      case 'buffer':\n        var json = val.toJSON();\n        // Based on the toJSON result\n        json = json.data && json.type ? json.data : json;\n        val = '[Buffer: ' + jsonStringify(json, 2, depth + 1) + ']';\n        break;\n      default:\n        val = (val === '[Function]' || val === '[Circular]')\n          ? val\n          : JSON.stringify(val); // string\n    }\n    return val;\n  }\n\n  for (var i in object) {\n    if (!object.hasOwnProperty(i)) {\n      continue; // not my business\n    }\n    --length;\n    str += '\\n ' + repeat(' ', space)\n      + (isArray(object) ? '' : '\"' + i + '\": ') // key\n      + _stringify(object[i])                     // value\n      + (length ? ',' : '');                     // comma\n  }\n\n  return str\n    // [], {}\n    + (str.length !== 1 ? '\\n' + repeat(' ', --space) + end : end);\n}\n\n/**\n * Test if a value is a buffer.\n *\n * @api private\n * @param {*} value The value to test.\n * @return {boolean} True if `value` is a buffer, otherwise false\n */\nexports.isBuffer = function(value) {\n  return typeof Buffer !== 'undefined' && Buffer.isBuffer(value);\n};\n\n/**\n * Return a new Thing that has the keys in sorted order. Recursive.\n *\n * If the Thing...\n * - has already been seen, return string `'[Circular]'`\n * - is `undefined`, return string `'[undefined]'`\n * - is `null`, return value `null`\n * - is some other primitive, return the value\n * - is not a primitive or an `Array`, `Object`, or `Function`, return the value of the Thing's `toString()` method\n * - is a non-empty `Array`, `Object`, or `Function`, return the result of calling this function again.\n * - is an empty `Array`, `Object`, or `Function`, return the result of calling `emptyRepresentation()`\n *\n * @api private\n * @see {@link exports.stringify}\n * @param {*} value Thing to inspect.  May or may not have properties.\n * @param {Array} [stack=[]] Stack of seen values\n * @return {(Object|Array|Function|string|undefined)}\n */\nexports.canonicalize = function(value, stack) {\n  var canonicalizedObj;\n  /* eslint-disable no-unused-vars */\n  var prop;\n  /* eslint-enable no-unused-vars */\n  var type = exports.type(value);\n  function withStack(value, fn) {\n    stack.push(value);\n    fn();\n    stack.pop();\n  }\n\n  stack = stack || [];\n\n  if (exports.indexOf(stack, value) !== -1) {\n    return '[Circular]';\n  }\n\n  switch (type) {\n    case 'undefined':\n    case 'buffer':\n    case 'null':\n      canonicalizedObj = value;\n      break;\n    case 'array':\n      withStack(value, function() {\n        canonicalizedObj = exports.map(value, function(item) {\n          return exports.canonicalize(item, stack);\n        });\n      });\n      break;\n    case 'function':\n      /* eslint-disable guard-for-in */\n      for (prop in value) {\n        canonicalizedObj = {};\n        break;\n      }\n      /* eslint-enable guard-for-in */\n      if (!canonicalizedObj) {\n        canonicalizedObj = emptyRepresentation(value, type);\n        break;\n      }\n    /* falls through */\n    case 'object':\n      canonicalizedObj = canonicalizedObj || {};\n      withStack(value, function() {\n        exports.forEach(exports.keys(value).sort(), function(key) {\n          canonicalizedObj[key] = exports.canonicalize(value[key], stack);\n        });\n      });\n      break;\n    case 'date':\n    case 'number':\n    case 'regexp':\n    case 'boolean':\n      canonicalizedObj = value;\n      break;\n    default:\n      canonicalizedObj = value.toString();\n  }\n\n  return canonicalizedObj;\n};\n\n/**\n * Lookup file names at the given `path`.\n *\n * @api public\n * @param {string} path Base path to start searching from.\n * @param {string[]} extensions File extensions to look for.\n * @param {boolean} recursive Whether or not to recurse into subdirectories.\n * @return {string[]} An array of paths.\n */\nexports.lookupFiles = function lookupFiles(path, extensions, recursive) {\n  var files = [];\n  var re = new RegExp('\\\\.(' + extensions.join('|') + ')$');\n\n  if (!exists(path)) {\n    if (exists(path + '.js')) {\n      path += '.js';\n    } else {\n      files = glob.sync(path);\n      if (!files.length) {\n        throw new Error(\"cannot resolve path (or pattern) '\" + path + \"'\");\n      }\n      return files;\n    }\n  }\n\n  try {\n    var stat = statSync(path);\n    if (stat.isFile()) {\n      return path;\n    }\n  } catch (err) {\n    // ignore error\n    return;\n  }\n\n  readdirSync(path).forEach(function(file) {\n    file = join(path, file);\n    try {\n      var stat = statSync(file);\n      if (stat.isDirectory()) {\n        if (recursive) {\n          files = files.concat(lookupFiles(file, extensions, recursive));\n        }\n        return;\n      }\n    } catch (err) {\n      // ignore error\n      return;\n    }\n    if (!stat.isFile() || !re.test(file) || basename(file)[0] === '.') {\n      return;\n    }\n    files.push(file);\n  });\n\n  return files;\n};\n\n/**\n * Generate an undefined error with a message warning the user.\n *\n * @return {Error}\n */\n\nexports.undefinedError = function() {\n  return new Error('Caught undefined error, did you throw without specifying what?');\n};\n\n/**\n * Generate an undefined error if `err` is not defined.\n *\n * @param {Error} err\n * @return {Error}\n */\n\nexports.getError = function(err) {\n  return err || exports.undefinedError();\n};\n\n/**\n * @summary\n * This Filter based on `mocha-clean` module.(see: `github.com/rstacruz/mocha-clean`)\n * @description\n * When invoking this function you get a filter function that get the Error.stack as an input,\n * and return a prettify output.\n * (i.e: strip Mocha and internal node functions from stack trace).\n * @returns {Function}\n */\nexports.stackTraceFilter = function() {\n  // TODO: Replace with `process.browser`\n  var slash = '/';\n  var is = typeof document === 'undefined' ? { node: true } : { browser: true };\n  var cwd = is.node\n      ? process.cwd() + slash\n      : (typeof location === 'undefined' ? window.location : location).href.replace(/\\/[^\\/]*$/, '/');\n\n  function isMochaInternal(line) {\n    return (~line.indexOf('node_modules' + slash + 'mocha' + slash))\n      || (~line.indexOf('components' + slash + 'mochajs' + slash))\n      || (~line.indexOf('components' + slash + 'mocha' + slash))\n      || (~line.indexOf(slash + 'mocha.js'));\n  }\n\n  function isNodeInternal(line) {\n    return (~line.indexOf('(timers.js:'))\n      || (~line.indexOf('(events.js:'))\n      || (~line.indexOf('(node.js:'))\n      || (~line.indexOf('(module.js:'))\n      || (~line.indexOf('GeneratorFunctionPrototype.next (native)'))\n      || false;\n  }\n\n  return function(stack) {\n    stack = stack.split('\\n');\n\n    stack = exports.reduce(stack, function(list, line) {\n      if (isMochaInternal(line)) {\n        return list;\n      }\n\n      if (is.node && isNodeInternal(line)) {\n        return list;\n      }\n\n      // Clean up cwd(absolute)\n      list.push(line.replace(cwd, ''));\n      return list;\n    }, []);\n\n    return stack.join('\\n');\n  };\n};\n\n}).call(this,require('_process'),require(\"buffer\").Buffer)\n},{\"_process\":51,\"buffer\":43,\"debug\":2,\"fs\":41,\"glob\":41,\"path\":41,\"util\":66}],40:[function(require,module,exports){\n(function (process){\nvar WritableStream = require('stream').Writable\nvar inherits = require('util').inherits\n\nmodule.exports = BrowserStdout\n\n\ninherits(BrowserStdout, WritableStream)\n\nfunction BrowserStdout(opts) {\n  if (!(this instanceof BrowserStdout)) return new BrowserStdout(opts)\n\n  opts = opts || {}\n  WritableStream.call(this, opts)\n  this.label = (opts.label !== undefined) ? opts.label : 'stdout'\n}\n\nBrowserStdout.prototype._write = function(chunks, encoding, cb) {\n  var output = chunks.toString ? chunks.toString() : chunks\n  if (this.label === false) {\n    console.log(output)\n  } else {\n    console.log(this.label+':', output)\n  }\n  process.nextTick(cb)\n}\n\n}).call(this,require('_process'))\n},{\"_process\":51,\"stream\":63,\"util\":66}],41:[function(require,module,exports){\n\n},{}],42:[function(require,module,exports){\narguments[4][41][0].apply(exports,arguments)\n},{\"dup\":41}],43:[function(require,module,exports){\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>\n * @license  MIT\n */\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\nvar isArray = require('is-array')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\nBuffer.poolSize = 8192 // not used by this implementation\n\nvar rootParent = {}\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n *   - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n *     See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n *   - Safari 5-7 lacks support for changing the `Object.prototype.constructor` property\n *     on objects.\n *\n *   - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n *   - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n *     incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = (function () {\n  function Bar () {}\n  try {\n    var arr = new Uint8Array(1)\n    arr.foo = function () { return 42 }\n    arr.constructor = Bar\n    return arr.foo() === 42 && // typed array instances can be augmented\n        arr.constructor === Bar && // constructor can be set\n        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n        arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n  } catch (e) {\n    return false\n  }\n})()\n\nfunction kMaxLength () {\n  return Buffer.TYPED_ARRAY_SUPPORT\n    ? 0x7fffffff\n    : 0x3fffffff\n}\n\n/**\n * Class: Buffer\n * =============\n *\n * The Buffer constructor returns instances of `Uint8Array` that are augmented\n * with function properties for all the node `Buffer` API functions. We use\n * `Uint8Array` so that square bracket notation works as expected -- it returns\n * a single octet.\n *\n * By augmenting the instances, we can avoid modifying the `Uint8Array`\n * prototype.\n */\nfunction Buffer (arg) {\n  if (!(this instanceof Buffer)) {\n    // Avoid going through an ArgumentsAdaptorTrampoline in the common case.\n    if (arguments.length > 1) return new Buffer(arg, arguments[1])\n    return new Buffer(arg)\n  }\n\n  this.length = 0\n  this.parent = undefined\n\n  // Common case.\n  if (typeof arg === 'number') {\n    return fromNumber(this, arg)\n  }\n\n  // Slightly less common case.\n  if (typeof arg === 'string') {\n    return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8')\n  }\n\n  // Unusual.\n  return fromObject(this, arg)\n}\n\nfunction fromNumber (that, length) {\n  that = allocate(that, length < 0 ? 0 : checked(length) | 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) {\n    for (var i = 0; i < length; i++) {\n      that[i] = 0\n    }\n  }\n  return that\n}\n\nfunction fromString (that, string, encoding) {\n  if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8'\n\n  // Assumption: byteLength() return value is always < kMaxLength.\n  var length = byteLength(string, encoding) | 0\n  that = allocate(that, length)\n\n  that.write(string, encoding)\n  return that\n}\n\nfunction fromObject (that, object) {\n  if (Buffer.isBuffer(object)) return fromBuffer(that, object)\n\n  if (isArray(object)) return fromArray(that, object)\n\n  if (object == null) {\n    throw new TypeError('must start with number, buffer, array or string')\n  }\n\n  if (typeof ArrayBuffer !== 'undefined') {\n    if (object.buffer instanceof ArrayBuffer) {\n      return fromTypedArray(that, object)\n    }\n    if (object instanceof ArrayBuffer) {\n      return fromArrayBuffer(that, object)\n    }\n  }\n\n  if (object.length) return fromArrayLike(that, object)\n\n  return fromJsonObject(that, object)\n}\n\nfunction fromBuffer (that, buffer) {\n  var length = checked(buffer.length) | 0\n  that = allocate(that, length)\n  buffer.copy(that, 0, 0, length)\n  return that\n}\n\nfunction fromArray (that, array) {\n  var length = checked(array.length) | 0\n  that = allocate(that, length)\n  for (var i = 0; i < length; i += 1) {\n    that[i] = array[i] & 255\n  }\n  return that\n}\n\n// Duplicate of fromArray() to keep fromArray() monomorphic.\nfunction fromTypedArray (that, array) {\n  var length = checked(array.length) | 0\n  that = allocate(that, length)\n  // Truncating the elements is probably not what people expect from typed\n  // arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior\n  // of the old Buffer constructor.\n  for (var i = 0; i < length; i += 1) {\n    that[i] = array[i] & 255\n  }\n  return that\n}\n\nfunction fromArrayBuffer (that, array) {\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    array.byteLength\n    that = Buffer._augment(new Uint8Array(array))\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    that = fromTypedArray(that, new Uint8Array(array))\n  }\n  return that\n}\n\nfunction fromArrayLike (that, array) {\n  var length = checked(array.length) | 0\n  that = allocate(that, length)\n  for (var i = 0; i < length; i += 1) {\n    that[i] = array[i] & 255\n  }\n  return that\n}\n\n// Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object.\n// Returns a zero-length buffer for inputs that don't conform to the spec.\nfunction fromJsonObject (that, object) {\n  var array\n  var length = 0\n\n  if (object.type === 'Buffer' && isArray(object.data)) {\n    array = object.data\n    length = checked(array.length) | 0\n  }\n  that = allocate(that, length)\n\n  for (var i = 0; i < length; i += 1) {\n    that[i] = array[i] & 255\n  }\n  return that\n}\n\nfunction allocate (that, length) {\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = Buffer._augment(new Uint8Array(length))\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    that.length = length\n    that._isBuffer = true\n  }\n\n  var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1\n  if (fromPool) that.parent = rootParent\n\n  return that\n}\n\nfunction checked (length) {\n  // Note: cannot use `length < kMaxLength` here because that fails when\n  // length is NaN (which is otherwise coerced to zero.)\n  if (length >= kMaxLength()) {\n    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n                         'size: 0x' + kMaxLength().toString(16) + ' bytes')\n  }\n  return length | 0\n}\n\nfunction SlowBuffer (subject, encoding) {\n  if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding)\n\n  var buf = new Buffer(subject, encoding)\n  delete buf.parent\n  return buf\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n  return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n    throw new TypeError('Arguments must be Buffers')\n  }\n\n  if (a === b) return 0\n\n  var x = a.length\n  var y = b.length\n\n  var i = 0\n  var len = Math.min(x, y)\n  while (i < len) {\n    if (a[i] !== b[i]) break\n\n    ++i\n  }\n\n  if (i !== len) {\n    x = a[i]\n    y = b[i]\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n  switch (String(encoding).toLowerCase()) {\n    case 'hex':\n    case 'utf8':\n    case 'utf-8':\n    case 'ascii':\n    case 'binary':\n    case 'base64':\n    case 'raw':\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      return true\n    default:\n      return false\n  }\n}\n\nBuffer.concat = function concat (list, length) {\n  if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.')\n\n  if (list.length === 0) {\n    return new Buffer(0)\n  }\n\n  var i\n  if (length === undefined) {\n    length = 0\n    for (i = 0; i < list.length; i++) {\n      length += list[i].length\n    }\n  }\n\n  var buf = new Buffer(length)\n  var pos = 0\n  for (i = 0; i < list.length; i++) {\n    var item = list[i]\n    item.copy(buf, pos)\n    pos += item.length\n  }\n  return buf\n}\n\nfunction byteLength (string, encoding) {\n  if (typeof string !== 'string') string = '' + string\n\n  var len = string.length\n  if (len === 0) return 0\n\n  // Use a for loop to avoid recursion\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'ascii':\n      case 'binary':\n      // Deprecated\n      case 'raw':\n      case 'raws':\n        return len\n      case 'utf8':\n      case 'utf-8':\n        return utf8ToBytes(string).length\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return len * 2\n      case 'hex':\n        return len >>> 1\n      case 'base64':\n        return base64ToBytes(string).length\n      default:\n        if (loweredCase) return utf8ToBytes(string).length // assume utf8\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\nBuffer.byteLength = byteLength\n\n// pre-set for values that may exist in the future\nBuffer.prototype.length = undefined\nBuffer.prototype.parent = undefined\n\nfunction slowToString (encoding, start, end) {\n  var loweredCase = false\n\n  start = start | 0\n  end = end === undefined || end === Infinity ? this.length : end | 0\n\n  if (!encoding) encoding = 'utf8'\n  if (start < 0) start = 0\n  if (end > this.length) end = this.length\n  if (end <= start) return ''\n\n  while (true) {\n    switch (encoding) {\n      case 'hex':\n        return hexSlice(this, start, end)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Slice(this, start, end)\n\n      case 'ascii':\n        return asciiSlice(this, start, end)\n\n      case 'binary':\n        return binarySlice(this, start, end)\n\n      case 'base64':\n        return base64Slice(this, start, end)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return utf16leSlice(this, start, end)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = (encoding + '').toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\nBuffer.prototype.toString = function toString () {\n  var length = this.length | 0\n  if (length === 0) return ''\n  if (arguments.length === 0) return utf8Slice(this, 0, length)\n  return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n  if (this === b) return true\n  return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n  var str = ''\n  var max = exports.INSPECT_MAX_BYTES\n  if (this.length > 0) {\n    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n    if (this.length > max) str += ' ... '\n  }\n  return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (b) {\n  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n  if (this === b) return 0\n  return Buffer.compare(this, b)\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset) {\n  if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff\n  else if (byteOffset < -0x80000000) byteOffset = -0x80000000\n  byteOffset >>= 0\n\n  if (this.length === 0) return -1\n  if (byteOffset >= this.length) return -1\n\n  // Negative offsets start from the end of the buffer\n  if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0)\n\n  if (typeof val === 'string') {\n    if (val.length === 0) return -1 // special case: looking for empty string always fails\n    return String.prototype.indexOf.call(this, val, byteOffset)\n  }\n  if (Buffer.isBuffer(val)) {\n    return arrayIndexOf(this, val, byteOffset)\n  }\n  if (typeof val === 'number') {\n    if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') {\n      return Uint8Array.prototype.indexOf.call(this, val, byteOffset)\n    }\n    return arrayIndexOf(this, [ val ], byteOffset)\n  }\n\n  function arrayIndexOf (arr, val, byteOffset) {\n    var foundIndex = -1\n    for (var i = 0; byteOffset + i < arr.length; i++) {\n      if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) {\n        if (foundIndex === -1) foundIndex = i\n        if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex\n      } else {\n        foundIndex = -1\n      }\n    }\n    return -1\n  }\n\n  throw new TypeError('val must be string, number or Buffer')\n}\n\n// `get` is deprecated\nBuffer.prototype.get = function get (offset) {\n  console.log('.get() is deprecated. Access using array indexes instead.')\n  return this.readUInt8(offset)\n}\n\n// `set` is deprecated\nBuffer.prototype.set = function set (v, offset) {\n  console.log('.set() is deprecated. Access using array indexes instead.')\n  return this.writeUInt8(v, offset)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n  offset = Number(offset) || 0\n  var remaining = buf.length - offset\n  if (!length) {\n    length = remaining\n  } else {\n    length = Number(length)\n    if (length > remaining) {\n      length = remaining\n    }\n  }\n\n  // must be an even number of digits\n  var strLen = string.length\n  if (strLen % 2 !== 0) throw new Error('Invalid hex string')\n\n  if (length > strLen / 2) {\n    length = strLen / 2\n  }\n  for (var i = 0; i < length; i++) {\n    var parsed = parseInt(string.substr(i * 2, 2), 16)\n    if (isNaN(parsed)) throw new Error('Invalid hex string')\n    buf[offset + i] = parsed\n  }\n  return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n  return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction binaryWrite (buf, string, offset, length) {\n  return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n  return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n  // Buffer#write(string)\n  if (offset === undefined) {\n    encoding = 'utf8'\n    length = this.length\n    offset = 0\n  // Buffer#write(string, encoding)\n  } else if (length === undefined && typeof offset === 'string') {\n    encoding = offset\n    length = this.length\n    offset = 0\n  // Buffer#write(string, offset[, length][, encoding])\n  } else if (isFinite(offset)) {\n    offset = offset | 0\n    if (isFinite(length)) {\n      length = length | 0\n      if (encoding === undefined) encoding = 'utf8'\n    } else {\n      encoding = length\n      length = undefined\n    }\n  // legacy write(string, encoding, offset, length) - remove in v0.13\n  } else {\n    var swap = encoding\n    encoding = offset\n    offset = length | 0\n    length = swap\n  }\n\n  var remaining = this.length - offset\n  if (length === undefined || length > remaining) length = remaining\n\n  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n    throw new RangeError('attempt to write outside buffer bounds')\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'hex':\n        return hexWrite(this, string, offset, length)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Write(this, string, offset, length)\n\n      case 'ascii':\n        return asciiWrite(this, string, offset, length)\n\n      case 'binary':\n        return binaryWrite(this, string, offset, length)\n\n      case 'base64':\n        // Warning: maxLength not taken into account in base64Write\n        return base64Write(this, string, offset, length)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return ucs2Write(this, string, offset, length)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n  return {\n    type: 'Buffer',\n    data: Array.prototype.slice.call(this._arr || this, 0)\n  }\n}\n\nfunction base64Slice (buf, start, end) {\n  if (start === 0 && end === buf.length) {\n    return base64.fromByteArray(buf)\n  } else {\n    return base64.fromByteArray(buf.slice(start, end))\n  }\n}\n\nfunction utf8Slice (buf, start, end) {\n  end = Math.min(buf.length, end)\n  var res = []\n\n  var i = start\n  while (i < end) {\n    var firstByte = buf[i]\n    var codePoint = null\n    var bytesPerSequence = (firstByte > 0xEF) ? 4\n      : (firstByte > 0xDF) ? 3\n      : (firstByte > 0xBF) ? 2\n      : 1\n\n    if (i + bytesPerSequence <= end) {\n      var secondByte, thirdByte, fourthByte, tempCodePoint\n\n      switch (bytesPerSequence) {\n        case 1:\n          if (firstByte < 0x80) {\n            codePoint = firstByte\n          }\n          break\n        case 2:\n          secondByte = buf[i + 1]\n          if ((secondByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n            if (tempCodePoint > 0x7F) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 3:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 4:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          fourthByte = buf[i + 3]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n              codePoint = tempCodePoint\n            }\n          }\n      }\n    }\n\n    if (codePoint === null) {\n      // we did not generate a valid codePoint so insert a\n      // replacement char (U+FFFD) and advance only 1 byte\n      codePoint = 0xFFFD\n      bytesPerSequence = 1\n    } else if (codePoint > 0xFFFF) {\n      // encode to utf16 (surrogate pair dance)\n      codePoint -= 0x10000\n      res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n      codePoint = 0xDC00 | codePoint & 0x3FF\n    }\n\n    res.push(codePoint)\n    i += bytesPerSequence\n  }\n\n  return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n  var len = codePoints.length\n  if (len <= MAX_ARGUMENTS_LENGTH) {\n    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n  }\n\n  // Decode in chunks to avoid \"call stack size exceeded\".\n  var res = ''\n  var i = 0\n  while (i < len) {\n    res += String.fromCharCode.apply(\n      String,\n      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n    )\n  }\n  return res\n}\n\nfunction asciiSlice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; i++) {\n    ret += String.fromCharCode(buf[i] & 0x7F)\n  }\n  return ret\n}\n\nfunction binarySlice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; i++) {\n    ret += String.fromCharCode(buf[i])\n  }\n  return ret\n}\n\nfunction hexSlice (buf, start, end) {\n  var len = buf.length\n\n  if (!start || start < 0) start = 0\n  if (!end || end < 0 || end > len) end = len\n\n  var out = ''\n  for (var i = start; i < end; i++) {\n    out += toHex(buf[i])\n  }\n  return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n  var bytes = buf.slice(start, end)\n  var res = ''\n  for (var i = 0; i < bytes.length; i += 2) {\n    res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n  }\n  return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n  var len = this.length\n  start = ~~start\n  end = end === undefined ? len : ~~end\n\n  if (start < 0) {\n    start += len\n    if (start < 0) start = 0\n  } else if (start > len) {\n    start = len\n  }\n\n  if (end < 0) {\n    end += len\n    if (end < 0) end = 0\n  } else if (end > len) {\n    end = len\n  }\n\n  if (end < start) end = start\n\n  var newBuf\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    newBuf = Buffer._augment(this.subarray(start, end))\n  } else {\n    var sliceLen = end - start\n    newBuf = new Buffer(sliceLen, undefined)\n    for (var i = 0; i < sliceLen; i++) {\n      newBuf[i] = this[i + start]\n    }\n  }\n\n  if (newBuf.length) newBuf.parent = this.parent || this\n\n  return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    checkOffset(offset, byteLength, this.length)\n  }\n\n  var val = this[offset + --byteLength]\n  var mul = 1\n  while (byteLength > 0 && (mul *= 0x100)) {\n    val += this[offset + --byteLength] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return ((this[offset]) |\n      (this[offset + 1] << 8) |\n      (this[offset + 2] << 16)) +\n      (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] * 0x1000000) +\n    ((this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var i = byteLength\n  var mul = 1\n  var val = this[offset + --i]\n  while (i > 0 && (mul *= 0x100)) {\n    val += this[offset + --i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  if (!(this[offset] & 0x80)) return (this[offset])\n  return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset] | (this[offset + 1] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset + 1] | (this[offset] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset]) |\n    (this[offset + 1] << 8) |\n    (this[offset + 2] << 16) |\n    (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] << 24) |\n    (this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n  if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance')\n  if (value > max || value < min) throw new RangeError('value is out of bounds')\n  if (offset + ext > buf.length) throw new RangeError('index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)\n\n  var mul = 1\n  var i = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)\n\n  var i = byteLength - 1\n  var mul = 1\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  this[offset] = value\n  return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) {\n    buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n      (littleEndian ? i : 1 - i) * 8\n  }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = value\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = value\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffffffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) {\n    buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n  }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset + 3] = (value >>> 24)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 1] = (value >>> 8)\n    this[offset] = value\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = value\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = 0\n  var mul = 1\n  var sub = value < 0 ? 1 : 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  var sub = value < 0 ? 1 : 0\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  if (value < 0) value = 0xff + value + 1\n  this[offset] = value\n  return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = value\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = value\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = value\n    this[offset + 1] = (value >>> 8)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 3] = (value >>> 24)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (value < 0) value = 0xffffffff + value + 1\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = value\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n  if (value > max || value < min) throw new RangeError('value is out of bounds')\n  if (offset + ext > buf.length) throw new RangeError('index out of range')\n  if (offset < 0) throw new RangeError('index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 23, 4)\n  return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 52, 8)\n  return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n  if (!start) start = 0\n  if (!end && end !== 0) end = this.length\n  if (targetStart >= target.length) targetStart = target.length\n  if (!targetStart) targetStart = 0\n  if (end > 0 && end < start) end = start\n\n  // Copy 0 bytes; we're done\n  if (end === start) return 0\n  if (target.length === 0 || this.length === 0) return 0\n\n  // Fatal error conditions\n  if (targetStart < 0) {\n    throw new RangeError('targetStart out of bounds')\n  }\n  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n  if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n  // Are we oob?\n  if (end > this.length) end = this.length\n  if (target.length - targetStart < end - start) {\n    end = target.length - targetStart + start\n  }\n\n  var len = end - start\n  var i\n\n  if (this === target && start < targetStart && targetStart < end) {\n    // descending copy from end\n    for (i = len - 1; i >= 0; i--) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n    // ascending copy from start\n    for (i = 0; i < len; i++) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else {\n    target._set(this.subarray(start, start + len), targetStart)\n  }\n\n  return len\n}\n\n// fill(value, start=0, end=buffer.length)\nBuffer.prototype.fill = function fill (value, start, end) {\n  if (!value) value = 0\n  if (!start) start = 0\n  if (!end) end = this.length\n\n  if (end < start) throw new RangeError('end < start')\n\n  // Fill 0 bytes; we're done\n  if (end === start) return\n  if (this.length === 0) return\n\n  if (start < 0 || start >= this.length) throw new RangeError('start out of bounds')\n  if (end < 0 || end > this.length) throw new RangeError('end out of bounds')\n\n  var i\n  if (typeof value === 'number') {\n    for (i = start; i < end; i++) {\n      this[i] = value\n    }\n  } else {\n    var bytes = utf8ToBytes(value.toString())\n    var len = bytes.length\n    for (i = start; i < end; i++) {\n      this[i] = bytes[i % len]\n    }\n  }\n\n  return this\n}\n\n/**\n * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance.\n * Added in Node 0.12. Only available in browsers that support ArrayBuffer.\n */\nBuffer.prototype.toArrayBuffer = function toArrayBuffer () {\n  if (typeof Uint8Array !== 'undefined') {\n    if (Buffer.TYPED_ARRAY_SUPPORT) {\n      return (new Buffer(this)).buffer\n    } else {\n      var buf = new Uint8Array(this.length)\n      for (var i = 0, len = buf.length; i < len; i += 1) {\n        buf[i] = this[i]\n      }\n      return buf.buffer\n    }\n  } else {\n    throw new TypeError('Buffer.toArrayBuffer not supported in this browser')\n  }\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar BP = Buffer.prototype\n\n/**\n * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods\n */\nBuffer._augment = function _augment (arr) {\n  arr.constructor = Buffer\n  arr._isBuffer = true\n\n  // save reference to original Uint8Array set method before overwriting\n  arr._set = arr.set\n\n  // deprecated\n  arr.get = BP.get\n  arr.set = BP.set\n\n  arr.write = BP.write\n  arr.toString = BP.toString\n  arr.toLocaleString = BP.toString\n  arr.toJSON = BP.toJSON\n  arr.equals = BP.equals\n  arr.compare = BP.compare\n  arr.indexOf = BP.indexOf\n  arr.copy = BP.copy\n  arr.slice = BP.slice\n  arr.readUIntLE = BP.readUIntLE\n  arr.readUIntBE = BP.readUIntBE\n  arr.readUInt8 = BP.readUInt8\n  arr.readUInt16LE = BP.readUInt16LE\n  arr.readUInt16BE = BP.readUInt16BE\n  arr.readUInt32LE = BP.readUInt32LE\n  arr.readUInt32BE = BP.readUInt32BE\n  arr.readIntLE = BP.readIntLE\n  arr.readIntBE = BP.readIntBE\n  arr.readInt8 = BP.readInt8\n  arr.readInt16LE = BP.readInt16LE\n  arr.readInt16BE = BP.readInt16BE\n  arr.readInt32LE = BP.readInt32LE\n  arr.readInt32BE = BP.readInt32BE\n  arr.readFloatLE = BP.readFloatLE\n  arr.readFloatBE = BP.readFloatBE\n  arr.readDoubleLE = BP.readDoubleLE\n  arr.readDoubleBE = BP.readDoubleBE\n  arr.writeUInt8 = BP.writeUInt8\n  arr.writeUIntLE = BP.writeUIntLE\n  arr.writeUIntBE = BP.writeUIntBE\n  arr.writeUInt16LE = BP.writeUInt16LE\n  arr.writeUInt16BE = BP.writeUInt16BE\n  arr.writeUInt32LE = BP.writeUInt32LE\n  arr.writeUInt32BE = BP.writeUInt32BE\n  arr.writeIntLE = BP.writeIntLE\n  arr.writeIntBE = BP.writeIntBE\n  arr.writeInt8 = BP.writeInt8\n  arr.writeInt16LE = BP.writeInt16LE\n  arr.writeInt16BE = BP.writeInt16BE\n  arr.writeInt32LE = BP.writeInt32LE\n  arr.writeInt32BE = BP.writeInt32BE\n  arr.writeFloatLE = BP.writeFloatLE\n  arr.writeFloatBE = BP.writeFloatBE\n  arr.writeDoubleLE = BP.writeDoubleLE\n  arr.writeDoubleBE = BP.writeDoubleBE\n  arr.fill = BP.fill\n  arr.inspect = BP.inspect\n  arr.toArrayBuffer = BP.toArrayBuffer\n\n  return arr\n}\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n  // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n  str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n  // Node converts strings with length < 2 to ''\n  if (str.length < 2) return ''\n  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n  while (str.length % 4 !== 0) {\n    str = str + '='\n  }\n  return str\n}\n\nfunction stringtrim (str) {\n  if (str.trim) return str.trim()\n  return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n  if (n < 16) return '0' + n.toString(16)\n  return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n  units = units || Infinity\n  var codePoint\n  var length = string.length\n  var leadSurrogate = null\n  var bytes = []\n\n  for (var i = 0; i < length; i++) {\n    codePoint = string.charCodeAt(i)\n\n    // is surrogate component\n    if (codePoint > 0xD7FF && codePoint < 0xE000) {\n      // last char was a lead\n      if (!leadSurrogate) {\n        // no lead yet\n        if (codePoint > 0xDBFF) {\n          // unexpected trail\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        } else if (i + 1 === length) {\n          // unpaired lead\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        }\n\n        // valid lead\n        leadSurrogate = codePoint\n\n        continue\n      }\n\n      // 2 leads in a row\n      if (codePoint < 0xDC00) {\n        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n        leadSurrogate = codePoint\n        continue\n      }\n\n      // valid surrogate pair\n      codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000\n    } else if (leadSurrogate) {\n      // valid bmp char, but last char was a lead\n      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n    }\n\n    leadSurrogate = null\n\n    // encode utf8\n    if (codePoint < 0x80) {\n      if ((units -= 1) < 0) break\n      bytes.push(codePoint)\n    } else if (codePoint < 0x800) {\n      if ((units -= 2) < 0) break\n      bytes.push(\n        codePoint >> 0x6 | 0xC0,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x10000) {\n      if ((units -= 3) < 0) break\n      bytes.push(\n        codePoint >> 0xC | 0xE0,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x110000) {\n      if ((units -= 4) < 0) break\n      bytes.push(\n        codePoint >> 0x12 | 0xF0,\n        codePoint >> 0xC & 0x3F | 0x80,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else {\n      throw new Error('Invalid code point')\n    }\n  }\n\n  return bytes\n}\n\nfunction asciiToBytes (str) {\n  var byteArray = []\n  for (var i = 0; i < str.length; i++) {\n    // Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF)\n  }\n  return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n  var c, hi, lo\n  var byteArray = []\n  for (var i = 0; i < str.length; i++) {\n    if ((units -= 2) < 0) break\n\n    c = str.charCodeAt(i)\n    hi = c >> 8\n    lo = c % 256\n    byteArray.push(lo)\n    byteArray.push(hi)\n  }\n\n  return byteArray\n}\n\nfunction base64ToBytes (str) {\n  return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n  for (var i = 0; i < length; i++) {\n    if ((i + offset >= dst.length) || (i >= src.length)) break\n    dst[i + offset] = src[i]\n  }\n  return i\n}\n\n},{\"base64-js\":44,\"ieee754\":45,\"is-array\":46}],44:[function(require,module,exports){\nvar lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\n;(function (exports) {\n\t'use strict';\n\n  var Arr = (typeof Uint8Array !== 'undefined')\n    ? Uint8Array\n    : Array\n\n\tvar PLUS   = '+'.charCodeAt(0)\n\tvar SLASH  = '/'.charCodeAt(0)\n\tvar NUMBER = '0'.charCodeAt(0)\n\tvar LOWER  = 'a'.charCodeAt(0)\n\tvar UPPER  = 'A'.charCodeAt(0)\n\tvar PLUS_URL_SAFE = '-'.charCodeAt(0)\n\tvar SLASH_URL_SAFE = '_'.charCodeAt(0)\n\n\tfunction decode (elt) {\n\t\tvar code = elt.charCodeAt(0)\n\t\tif (code === PLUS ||\n\t\t    code === PLUS_URL_SAFE)\n\t\t\treturn 62 // '+'\n\t\tif (code === SLASH ||\n\t\t    code === SLASH_URL_SAFE)\n\t\t\treturn 63 // '/'\n\t\tif (code < NUMBER)\n\t\t\treturn -1 //no match\n\t\tif (code < NUMBER + 10)\n\t\t\treturn code - NUMBER + 26 + 26\n\t\tif (code < UPPER + 26)\n\t\t\treturn code - UPPER\n\t\tif (code < LOWER + 26)\n\t\t\treturn code - LOWER + 26\n\t}\n\n\tfunction b64ToByteArray (b64) {\n\t\tvar i, j, l, tmp, placeHolders, arr\n\n\t\tif (b64.length % 4 > 0) {\n\t\t\tthrow new Error('Invalid string. Length must be a multiple of 4')\n\t\t}\n\n\t\t// the number of equal signs (place holders)\n\t\t// if there are two placeholders, than the two characters before it\n\t\t// represent one byte\n\t\t// if there is only one, then the three characters before it represent 2 bytes\n\t\t// this is just a cheap hack to not do indexOf twice\n\t\tvar len = b64.length\n\t\tplaceHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0\n\n\t\t// base64 is 4/3 + up to two characters of the original data\n\t\tarr = new Arr(b64.length * 3 / 4 - placeHolders)\n\n\t\t// if there are placeholders, only get up to the last complete 4 chars\n\t\tl = placeHolders > 0 ? b64.length - 4 : b64.length\n\n\t\tvar L = 0\n\n\t\tfunction push (v) {\n\t\t\tarr[L++] = v\n\t\t}\n\n\t\tfor (i = 0, j = 0; i < l; i += 4, j += 3) {\n\t\t\ttmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))\n\t\t\tpush((tmp & 0xFF0000) >> 16)\n\t\t\tpush((tmp & 0xFF00) >> 8)\n\t\t\tpush(tmp & 0xFF)\n\t\t}\n\n\t\tif (placeHolders === 2) {\n\t\t\ttmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4)\n\t\t\tpush(tmp & 0xFF)\n\t\t} else if (placeHolders === 1) {\n\t\t\ttmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2)\n\t\t\tpush((tmp >> 8) & 0xFF)\n\t\t\tpush(tmp & 0xFF)\n\t\t}\n\n\t\treturn arr\n\t}\n\n\tfunction uint8ToBase64 (uint8) {\n\t\tvar i,\n\t\t\textraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes\n\t\t\toutput = \"\",\n\t\t\ttemp, length\n\n\t\tfunction encode (num) {\n\t\t\treturn lookup.charAt(num)\n\t\t}\n\n\t\tfunction tripletToBase64 (num) {\n\t\t\treturn encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)\n\t\t}\n\n\t\t// go through the array every three bytes, we'll deal with trailing stuff later\n\t\tfor (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {\n\t\t\ttemp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])\n\t\t\toutput += tripletToBase64(temp)\n\t\t}\n\n\t\t// pad the end with zeros, but make sure to not forget the extra bytes\n\t\tswitch (extraBytes) {\n\t\t\tcase 1:\n\t\t\t\ttemp = uint8[uint8.length - 1]\n\t\t\t\toutput += encode(temp >> 2)\n\t\t\t\toutput += encode((temp << 4) & 0x3F)\n\t\t\t\toutput += '=='\n\t\t\t\tbreak\n\t\t\tcase 2:\n\t\t\t\ttemp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])\n\t\t\t\toutput += encode(temp >> 10)\n\t\t\t\toutput += encode((temp >> 4) & 0x3F)\n\t\t\t\toutput += encode((temp << 2) & 0x3F)\n\t\t\t\toutput += '='\n\t\t\t\tbreak\n\t\t}\n\n\t\treturn output\n\t}\n\n\texports.toByteArray = b64ToByteArray\n\texports.fromByteArray = uint8ToBase64\n}(typeof exports === 'undefined' ? (this.base64js = {}) : exports))\n\n},{}],45:[function(require,module,exports){\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n  var e, m\n  var eLen = nBytes * 8 - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var nBits = -7\n  var i = isLE ? (nBytes - 1) : 0\n  var d = isLE ? -1 : 1\n  var s = buffer[offset + i]\n\n  i += d\n\n  e = s & ((1 << (-nBits)) - 1)\n  s >>= (-nBits)\n  nBits += eLen\n  for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n\n  m = e & ((1 << (-nBits)) - 1)\n  e >>= (-nBits)\n  nBits += mLen\n  for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}\n\n  if (e === 0) {\n    e = 1 - eBias\n  } else if (e === eMax) {\n    return m ? NaN : ((s ? -1 : 1) * Infinity)\n  } else {\n    m = m + Math.pow(2, mLen)\n    e = e - eBias\n  }\n  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n  var e, m, c\n  var eLen = nBytes * 8 - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n  var i = isLE ? 0 : (nBytes - 1)\n  var d = isLE ? 1 : -1\n  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n  value = Math.abs(value)\n\n  if (isNaN(value) || value === Infinity) {\n    m = isNaN(value) ? 1 : 0\n    e = eMax\n  } else {\n    e = Math.floor(Math.log(value) / Math.LN2)\n    if (value * (c = Math.pow(2, -e)) < 1) {\n      e--\n      c *= 2\n    }\n    if (e + eBias >= 1) {\n      value += rt / c\n    } else {\n      value += rt * Math.pow(2, 1 - eBias)\n    }\n    if (value * c >= 2) {\n      e++\n      c /= 2\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0\n      e = eMax\n    } else if (e + eBias >= 1) {\n      m = (value * c - 1) * Math.pow(2, mLen)\n      e = e + eBias\n    } else {\n      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n      e = 0\n    }\n  }\n\n  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n  e = (e << mLen) | m\n  eLen += mLen\n  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n  buffer[offset + i - d] |= s * 128\n}\n\n},{}],46:[function(require,module,exports){\n\n/**\n * isArray\n */\n\nvar isArray = Array.isArray;\n\n/**\n * toString\n */\n\nvar str = Object.prototype.toString;\n\n/**\n * Whether or not the given `val`\n * is an array.\n *\n * example:\n *\n *        isArray([]);\n *        // > true\n *        isArray(arguments);\n *        // > false\n *        isArray('');\n *        // > false\n *\n * @param {mixed} val\n * @return {bool}\n */\n\nmodule.exports = isArray || function (val) {\n  return !! val && '[object Array]' == str.call(val);\n};\n\n},{}],47:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n  this._events = this._events || {};\n  this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n  if (!isNumber(n) || n < 0 || isNaN(n))\n    throw TypeError('n must be a positive number');\n  this._maxListeners = n;\n  return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n  var er, handler, len, args, i, listeners;\n\n  if (!this._events)\n    this._events = {};\n\n  // If there is no 'error' event listener then throw.\n  if (type === 'error') {\n    if (!this._events.error ||\n        (isObject(this._events.error) && !this._events.error.length)) {\n      er = arguments[1];\n      if (er instanceof Error) {\n        throw er; // Unhandled 'error' event\n      }\n      throw TypeError('Uncaught, unspecified \"error\" event.');\n    }\n  }\n\n  handler = this._events[type];\n\n  if (isUndefined(handler))\n    return false;\n\n  if (isFunction(handler)) {\n    switch (arguments.length) {\n      // fast cases\n      case 1:\n        handler.call(this);\n        break;\n      case 2:\n        handler.call(this, arguments[1]);\n        break;\n      case 3:\n        handler.call(this, arguments[1], arguments[2]);\n        break;\n      // slower\n      default:\n        len = arguments.length;\n        args = new Array(len - 1);\n        for (i = 1; i < len; i++)\n          args[i - 1] = arguments[i];\n        handler.apply(this, args);\n    }\n  } else if (isObject(handler)) {\n    len = arguments.length;\n    args = new Array(len - 1);\n    for (i = 1; i < len; i++)\n      args[i - 1] = arguments[i];\n\n    listeners = handler.slice();\n    len = listeners.length;\n    for (i = 0; i < len; i++)\n      listeners[i].apply(this, args);\n  }\n\n  return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n  var m;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events)\n    this._events = {};\n\n  // To avoid recursion in the case that type === \"newListener\"! Before\n  // adding it to the listeners, first emit \"newListener\".\n  if (this._events.newListener)\n    this.emit('newListener', type,\n              isFunction(listener.listener) ?\n              listener.listener : listener);\n\n  if (!this._events[type])\n    // Optimize the case of one listener. Don't need the extra array object.\n    this._events[type] = listener;\n  else if (isObject(this._events[type]))\n    // If we've already got an array, just append.\n    this._events[type].push(listener);\n  else\n    // Adding the second element, need to change to array.\n    this._events[type] = [this._events[type], listener];\n\n  // Check for listener leak\n  if (isObject(this._events[type]) && !this._events[type].warned) {\n    var m;\n    if (!isUndefined(this._maxListeners)) {\n      m = this._maxListeners;\n    } else {\n      m = EventEmitter.defaultMaxListeners;\n    }\n\n    if (m && m > 0 && this._events[type].length > m) {\n      this._events[type].warned = true;\n      console.error('(node) warning: possible EventEmitter memory ' +\n                    'leak detected. %d listeners added. ' +\n                    'Use emitter.setMaxListeners() to increase limit.',\n                    this._events[type].length);\n      if (typeof console.trace === 'function') {\n        // not supported in IE 10\n        console.trace();\n      }\n    }\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  var fired = false;\n\n  function g() {\n    this.removeListener(type, g);\n\n    if (!fired) {\n      fired = true;\n      listener.apply(this, arguments);\n    }\n  }\n\n  g.listener = listener;\n  this.on(type, g);\n\n  return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n  var list, position, length, i;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events || !this._events[type])\n    return this;\n\n  list = this._events[type];\n  length = list.length;\n  position = -1;\n\n  if (list === listener ||\n      (isFunction(list.listener) && list.listener === listener)) {\n    delete this._events[type];\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n\n  } else if (isObject(list)) {\n    for (i = length; i-- > 0;) {\n      if (list[i] === listener ||\n          (list[i].listener && list[i].listener === listener)) {\n        position = i;\n        break;\n      }\n    }\n\n    if (position < 0)\n      return this;\n\n    if (list.length === 1) {\n      list.length = 0;\n      delete this._events[type];\n    } else {\n      list.splice(position, 1);\n    }\n\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n  var key, listeners;\n\n  if (!this._events)\n    return this;\n\n  // not listening for removeListener, no need to emit\n  if (!this._events.removeListener) {\n    if (arguments.length === 0)\n      this._events = {};\n    else if (this._events[type])\n      delete this._events[type];\n    return this;\n  }\n\n  // emit removeListener for all listeners on all events\n  if (arguments.length === 0) {\n    for (key in this._events) {\n      if (key === 'removeListener') continue;\n      this.removeAllListeners(key);\n    }\n    this.removeAllListeners('removeListener');\n    this._events = {};\n    return this;\n  }\n\n  listeners = this._events[type];\n\n  if (isFunction(listeners)) {\n    this.removeListener(type, listeners);\n  } else {\n    // LIFO order\n    while (listeners.length)\n      this.removeListener(type, listeners[listeners.length - 1]);\n  }\n  delete this._events[type];\n\n  return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n  var ret;\n  if (!this._events || !this._events[type])\n    ret = [];\n  else if (isFunction(this._events[type]))\n    ret = [this._events[type]];\n  else\n    ret = this._events[type].slice();\n  return ret;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  var ret;\n  if (!emitter._events || !emitter._events[type])\n    ret = 0;\n  else if (isFunction(emitter._events[type]))\n    ret = 1;\n  else\n    ret = emitter._events[type].length;\n  return ret;\n};\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\n\n},{}],48:[function(require,module,exports){\nif (typeof Object.create === 'function') {\n  // implementation from standard node.js 'util' module\n  module.exports = function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor\n    ctor.prototype = Object.create(superCtor.prototype, {\n      constructor: {\n        value: ctor,\n        enumerable: false,\n        writable: true,\n        configurable: true\n      }\n    });\n  };\n} else {\n  // old school shim for old browsers\n  module.exports = function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor\n    var TempCtor = function () {}\n    TempCtor.prototype = superCtor.prototype\n    ctor.prototype = new TempCtor()\n    ctor.prototype.constructor = ctor\n  }\n}\n\n},{}],49:[function(require,module,exports){\nmodule.exports = Array.isArray || function (arr) {\n  return Object.prototype.toString.call(arr) == '[object Array]';\n};\n\n},{}],50:[function(require,module,exports){\nexports.endianness = function () { return 'LE' };\n\nexports.hostname = function () {\n    if (typeof location !== 'undefined') {\n        return location.hostname\n    }\n    else return '';\n};\n\nexports.loadavg = function () { return [] };\n\nexports.uptime = function () { return 0 };\n\nexports.freemem = function () {\n    return Number.MAX_VALUE;\n};\n\nexports.totalmem = function () {\n    return Number.MAX_VALUE;\n};\n\nexports.cpus = function () { return [] };\n\nexports.type = function () { return 'Browser' };\n\nexports.release = function () {\n    if (typeof navigator !== 'undefined') {\n        return navigator.appVersion;\n    }\n    return '';\n};\n\nexports.networkInterfaces\n= exports.getNetworkInterfaces\n= function () { return {} };\n\nexports.arch = function () { return 'javascript' };\n\nexports.platform = function () { return 'browser' };\n\nexports.tmpdir = exports.tmpDir = function () {\n    return '/tmp';\n};\n\nexports.EOL = '\\n';\n\n},{}],51:[function(require,module,exports){\n// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = setTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    clearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        setTimeout(drainQueue, 0);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n},{}],52:[function(require,module,exports){\nmodule.exports = require(\"./lib/_stream_duplex.js\")\n\n},{\"./lib/_stream_duplex.js\":53}],53:[function(require,module,exports){\n(function (process){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a duplex stream is just a stream that is both readable and writable.\n// Since JS doesn't have multiple prototypal inheritance, this class\n// prototypally inherits from Readable, and then parasitically from\n// Writable.\n\nmodule.exports = Duplex;\n\n/*<replacement>*/\nvar objectKeys = Object.keys || function (obj) {\n  var keys = [];\n  for (var key in obj) keys.push(key);\n  return keys;\n}\n/*</replacement>*/\n\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\nvar Readable = require('./_stream_readable');\nvar Writable = require('./_stream_writable');\n\nutil.inherits(Duplex, Readable);\n\nforEach(objectKeys(Writable.prototype), function(method) {\n  if (!Duplex.prototype[method])\n    Duplex.prototype[method] = Writable.prototype[method];\n});\n\nfunction Duplex(options) {\n  if (!(this instanceof Duplex))\n    return new Duplex(options);\n\n  Readable.call(this, options);\n  Writable.call(this, options);\n\n  if (options && options.readable === false)\n    this.readable = false;\n\n  if (options && options.writable === false)\n    this.writable = false;\n\n  this.allowHalfOpen = true;\n  if (options && options.allowHalfOpen === false)\n    this.allowHalfOpen = false;\n\n  this.once('end', onend);\n}\n\n// the no-half-open enforcer\nfunction onend() {\n  // if we allow half-open state, or if the writable side ended,\n  // then we're ok.\n  if (this.allowHalfOpen || this._writableState.ended)\n    return;\n\n  // no more data can be written.\n  // But allow more writes to happen in this tick.\n  process.nextTick(this.end.bind(this));\n}\n\nfunction forEach (xs, f) {\n  for (var i = 0, l = xs.length; i < l; i++) {\n    f(xs[i], i);\n  }\n}\n\n}).call(this,require('_process'))\n},{\"./_stream_readable\":55,\"./_stream_writable\":57,\"_process\":51,\"core-util-is\":58,\"inherits\":48}],54:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a passthrough stream.\n// basically just the most minimal sort of Transform stream.\n// Every written chunk gets output as-is.\n\nmodule.exports = PassThrough;\n\nvar Transform = require('./_stream_transform');\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\nutil.inherits(PassThrough, Transform);\n\nfunction PassThrough(options) {\n  if (!(this instanceof PassThrough))\n    return new PassThrough(options);\n\n  Transform.call(this, options);\n}\n\nPassThrough.prototype._transform = function(chunk, encoding, cb) {\n  cb(null, chunk);\n};\n\n},{\"./_stream_transform\":56,\"core-util-is\":58,\"inherits\":48}],55:[function(require,module,exports){\n(function (process){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nmodule.exports = Readable;\n\n/*<replacement>*/\nvar isArray = require('isarray');\n/*</replacement>*/\n\n\n/*<replacement>*/\nvar Buffer = require('buffer').Buffer;\n/*</replacement>*/\n\nReadable.ReadableState = ReadableState;\n\nvar EE = require('events').EventEmitter;\n\n/*<replacement>*/\nif (!EE.listenerCount) EE.listenerCount = function(emitter, type) {\n  return emitter.listeners(type).length;\n};\n/*</replacement>*/\n\nvar Stream = require('stream');\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\nvar StringDecoder;\n\n\n/*<replacement>*/\nvar debug = require('util');\nif (debug && debug.debuglog) {\n  debug = debug.debuglog('stream');\n} else {\n  debug = function () {};\n}\n/*</replacement>*/\n\n\nutil.inherits(Readable, Stream);\n\nfunction ReadableState(options, stream) {\n  var Duplex = require('./_stream_duplex');\n\n  options = options || {};\n\n  // the point at which it stops calling _read() to fill the buffer\n  // Note: 0 is a valid value, means \"don't call _read preemptively ever\"\n  var hwm = options.highWaterMark;\n  var defaultHwm = options.objectMode ? 16 : 16 * 1024;\n  this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm;\n\n  // cast to ints.\n  this.highWaterMark = ~~this.highWaterMark;\n\n  this.buffer = [];\n  this.length = 0;\n  this.pipes = null;\n  this.pipesCount = 0;\n  this.flowing = null;\n  this.ended = false;\n  this.endEmitted = false;\n  this.reading = false;\n\n  // a flag to be able to tell if the onwrite cb is called immediately,\n  // or on a later tick.  We set this to true at first, because any\n  // actions that shouldn't happen until \"later\" should generally also\n  // not happen before the first write call.\n  this.sync = true;\n\n  // whenever we return null, then we set a flag to say\n  // that we're awaiting a 'readable' event emission.\n  this.needReadable = false;\n  this.emittedReadable = false;\n  this.readableListening = false;\n\n\n  // object stream flag. Used to make read(n) ignore n and to\n  // make all the buffer merging and length checks go away\n  this.objectMode = !!options.objectMode;\n\n  if (stream instanceof Duplex)\n    this.objectMode = this.objectMode || !!options.readableObjectMode;\n\n  // Crypto is kind of old and crusty.  Historically, its default string\n  // encoding is 'binary' so we have to make this configurable.\n  // Everything else in the universe uses 'utf8', though.\n  this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n  // when piping, we only care about 'readable' events that happen\n  // after read()ing all the bytes and not getting any pushback.\n  this.ranOut = false;\n\n  // the number of writers that are awaiting a drain event in .pipe()s\n  this.awaitDrain = 0;\n\n  // if true, a maybeReadMore has been scheduled\n  this.readingMore = false;\n\n  this.decoder = null;\n  this.encoding = null;\n  if (options.encoding) {\n    if (!StringDecoder)\n      StringDecoder = require('string_decoder/').StringDecoder;\n    this.decoder = new StringDecoder(options.encoding);\n    this.encoding = options.encoding;\n  }\n}\n\nfunction Readable(options) {\n  var Duplex = require('./_stream_duplex');\n\n  if (!(this instanceof Readable))\n    return new Readable(options);\n\n  this._readableState = new ReadableState(options, this);\n\n  // legacy\n  this.readable = true;\n\n  Stream.call(this);\n}\n\n// Manually shove something into the read() buffer.\n// This returns true if the highWaterMark has not been hit yet,\n// similar to how Writable.write() returns true if you should\n// write() some more.\nReadable.prototype.push = function(chunk, encoding) {\n  var state = this._readableState;\n\n  if (util.isString(chunk) && !state.objectMode) {\n    encoding = encoding || state.defaultEncoding;\n    if (encoding !== state.encoding) {\n      chunk = new Buffer(chunk, encoding);\n      encoding = '';\n    }\n  }\n\n  return readableAddChunk(this, state, chunk, encoding, false);\n};\n\n// Unshift should *always* be something directly out of read()\nReadable.prototype.unshift = function(chunk) {\n  var state = this._readableState;\n  return readableAddChunk(this, state, chunk, '', true);\n};\n\nfunction readableAddChunk(stream, state, chunk, encoding, addToFront) {\n  var er = chunkInvalid(state, chunk);\n  if (er) {\n    stream.emit('error', er);\n  } else if (util.isNullOrUndefined(chunk)) {\n    state.reading = false;\n    if (!state.ended)\n      onEofChunk(stream, state);\n  } else if (state.objectMode || chunk && chunk.length > 0) {\n    if (state.ended && !addToFront) {\n      var e = new Error('stream.push() after EOF');\n      stream.emit('error', e);\n    } else if (state.endEmitted && addToFront) {\n      var e = new Error('stream.unshift() after end event');\n      stream.emit('error', e);\n    } else {\n      if (state.decoder && !addToFront && !encoding)\n        chunk = state.decoder.write(chunk);\n\n      if (!addToFront)\n        state.reading = false;\n\n      // if we want the data now, just emit it.\n      if (state.flowing && state.length === 0 && !state.sync) {\n        stream.emit('data', chunk);\n        stream.read(0);\n      } else {\n        // update the buffer info.\n        state.length += state.objectMode ? 1 : chunk.length;\n        if (addToFront)\n          state.buffer.unshift(chunk);\n        else\n          state.buffer.push(chunk);\n\n        if (state.needReadable)\n          emitReadable(stream);\n      }\n\n      maybeReadMore(stream, state);\n    }\n  } else if (!addToFront) {\n    state.reading = false;\n  }\n\n  return needMoreData(state);\n}\n\n\n\n// if it's past the high water mark, we can push in some more.\n// Also, if we have no data yet, we can stand some\n// more bytes.  This is to work around cases where hwm=0,\n// such as the repl.  Also, if the push() triggered a\n// readable event, and the user called read(largeNumber) such that\n// needReadable was set, then we ought to push more, so that another\n// 'readable' event will be triggered.\nfunction needMoreData(state) {\n  return !state.ended &&\n         (state.needReadable ||\n          state.length < state.highWaterMark ||\n          state.length === 0);\n}\n\n// backwards compatibility.\nReadable.prototype.setEncoding = function(enc) {\n  if (!StringDecoder)\n    StringDecoder = require('string_decoder/').StringDecoder;\n  this._readableState.decoder = new StringDecoder(enc);\n  this._readableState.encoding = enc;\n  return this;\n};\n\n// Don't raise the hwm > 128MB\nvar MAX_HWM = 0x800000;\nfunction roundUpToNextPowerOf2(n) {\n  if (n >= MAX_HWM) {\n    n = MAX_HWM;\n  } else {\n    // Get the next highest power of 2\n    n--;\n    for (var p = 1; p < 32; p <<= 1) n |= n >> p;\n    n++;\n  }\n  return n;\n}\n\nfunction howMuchToRead(n, state) {\n  if (state.length === 0 && state.ended)\n    return 0;\n\n  if (state.objectMode)\n    return n === 0 ? 0 : 1;\n\n  if (isNaN(n) || util.isNull(n)) {\n    // only flow one buffer at a time\n    if (state.flowing && state.buffer.length)\n      return state.buffer[0].length;\n    else\n      return state.length;\n  }\n\n  if (n <= 0)\n    return 0;\n\n  // If we're asking for more than the target buffer level,\n  // then raise the water mark.  Bump up to the next highest\n  // power of 2, to prevent increasing it excessively in tiny\n  // amounts.\n  if (n > state.highWaterMark)\n    state.highWaterMark = roundUpToNextPowerOf2(n);\n\n  // don't have that much.  return null, unless we've ended.\n  if (n > state.length) {\n    if (!state.ended) {\n      state.needReadable = true;\n      return 0;\n    } else\n      return state.length;\n  }\n\n  return n;\n}\n\n// you can override either this method, or the async _read(n) below.\nReadable.prototype.read = function(n) {\n  debug('read', n);\n  var state = this._readableState;\n  var nOrig = n;\n\n  if (!util.isNumber(n) || n > 0)\n    state.emittedReadable = false;\n\n  // if we're doing read(0) to trigger a readable event, but we\n  // already have a bunch of data in the buffer, then just trigger\n  // the 'readable' event and move on.\n  if (n === 0 &&\n      state.needReadable &&\n      (state.length >= state.highWaterMark || state.ended)) {\n    debug('read: emitReadable', state.length, state.ended);\n    if (state.length === 0 && state.ended)\n      endReadable(this);\n    else\n      emitReadable(this);\n    return null;\n  }\n\n  n = howMuchToRead(n, state);\n\n  // if we've ended, and we're now clear, then finish it up.\n  if (n === 0 && state.ended) {\n    if (state.length === 0)\n      endReadable(this);\n    return null;\n  }\n\n  // All the actual chunk generation logic needs to be\n  // *below* the call to _read.  The reason is that in certain\n  // synthetic stream cases, such as passthrough streams, _read\n  // may be a completely synchronous operation which may change\n  // the state of the read buffer, providing enough data when\n  // before there was *not* enough.\n  //\n  // So, the steps are:\n  // 1. Figure out what the state of things will be after we do\n  // a read from the buffer.\n  //\n  // 2. If that resulting state will trigger a _read, then call _read.\n  // Note that this may be asynchronous, or synchronous.  Yes, it is\n  // deeply ugly to write APIs this way, but that still doesn't mean\n  // that the Readable class should behave improperly, as streams are\n  // designed to be sync/async agnostic.\n  // Take note if the _read call is sync or async (ie, if the read call\n  // has returned yet), so that we know whether or not it's safe to emit\n  // 'readable' etc.\n  //\n  // 3. Actually pull the requested chunks out of the buffer and return.\n\n  // if we need a readable event, then we need to do some reading.\n  var doRead = state.needReadable;\n  debug('need readable', doRead);\n\n  // if we currently have less than the highWaterMark, then also read some\n  if (state.length === 0 || state.length - n < state.highWaterMark) {\n    doRead = true;\n    debug('length less than watermark', doRead);\n  }\n\n  // however, if we've ended, then there's no point, and if we're already\n  // reading, then it's unnecessary.\n  if (state.ended || state.reading) {\n    doRead = false;\n    debug('reading or ended', doRead);\n  }\n\n  if (doRead) {\n    debug('do read');\n    state.reading = true;\n    state.sync = true;\n    // if the length is currently zero, then we *need* a readable event.\n    if (state.length === 0)\n      state.needReadable = true;\n    // call internal read method\n    this._read(state.highWaterMark);\n    state.sync = false;\n  }\n\n  // If _read pushed data synchronously, then `reading` will be false,\n  // and we need to re-evaluate how much data we can return to the user.\n  if (doRead && !state.reading)\n    n = howMuchToRead(nOrig, state);\n\n  var ret;\n  if (n > 0)\n    ret = fromList(n, state);\n  else\n    ret = null;\n\n  if (util.isNull(ret)) {\n    state.needReadable = true;\n    n = 0;\n  }\n\n  state.length -= n;\n\n  // If we have nothing in the buffer, then we want to know\n  // as soon as we *do* get something into the buffer.\n  if (state.length === 0 && !state.ended)\n    state.needReadable = true;\n\n  // If we tried to read() past the EOF, then emit end on the next tick.\n  if (nOrig !== n && state.ended && state.length === 0)\n    endReadable(this);\n\n  if (!util.isNull(ret))\n    this.emit('data', ret);\n\n  return ret;\n};\n\nfunction chunkInvalid(state, chunk) {\n  var er = null;\n  if (!util.isBuffer(chunk) &&\n      !util.isString(chunk) &&\n      !util.isNullOrUndefined(chunk) &&\n      !state.objectMode) {\n    er = new TypeError('Invalid non-string/buffer chunk');\n  }\n  return er;\n}\n\n\nfunction onEofChunk(stream, state) {\n  if (state.decoder && !state.ended) {\n    var chunk = state.decoder.end();\n    if (chunk && chunk.length) {\n      state.buffer.push(chunk);\n      state.length += state.objectMode ? 1 : chunk.length;\n    }\n  }\n  state.ended = true;\n\n  // emit 'readable' now to make sure it gets picked up.\n  emitReadable(stream);\n}\n\n// Don't emit readable right away in sync mode, because this can trigger\n// another read() call => stack overflow.  This way, it might trigger\n// a nextTick recursion warning, but that's not so bad.\nfunction emitReadable(stream) {\n  var state = stream._readableState;\n  state.needReadable = false;\n  if (!state.emittedReadable) {\n    debug('emitReadable', state.flowing);\n    state.emittedReadable = true;\n    if (state.sync)\n      process.nextTick(function() {\n        emitReadable_(stream);\n      });\n    else\n      emitReadable_(stream);\n  }\n}\n\nfunction emitReadable_(stream) {\n  debug('emit readable');\n  stream.emit('readable');\n  flow(stream);\n}\n\n\n// at this point, the user has presumably seen the 'readable' event,\n// and called read() to consume some data.  that may have triggered\n// in turn another _read(n) call, in which case reading = true if\n// it's in progress.\n// However, if we're not ended, or reading, and the length < hwm,\n// then go ahead and try to read some more preemptively.\nfunction maybeReadMore(stream, state) {\n  if (!state.readingMore) {\n    state.readingMore = true;\n    process.nextTick(function() {\n      maybeReadMore_(stream, state);\n    });\n  }\n}\n\nfunction maybeReadMore_(stream, state) {\n  var len = state.length;\n  while (!state.reading && !state.flowing && !state.ended &&\n         state.length < state.highWaterMark) {\n    debug('maybeReadMore read 0');\n    stream.read(0);\n    if (len === state.length)\n      // didn't get any data, stop spinning.\n      break;\n    else\n      len = state.length;\n  }\n  state.readingMore = false;\n}\n\n// abstract method.  to be overridden in specific implementation classes.\n// call cb(er, data) where data is <= n in length.\n// for virtual (non-string, non-buffer) streams, \"length\" is somewhat\n// arbitrary, and perhaps not very meaningful.\nReadable.prototype._read = function(n) {\n  this.emit('error', new Error('not implemented'));\n};\n\nReadable.prototype.pipe = function(dest, pipeOpts) {\n  var src = this;\n  var state = this._readableState;\n\n  switch (state.pipesCount) {\n    case 0:\n      state.pipes = dest;\n      break;\n    case 1:\n      state.pipes = [state.pipes, dest];\n      break;\n    default:\n      state.pipes.push(dest);\n      break;\n  }\n  state.pipesCount += 1;\n  debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);\n\n  var doEnd = (!pipeOpts || pipeOpts.end !== false) &&\n              dest !== process.stdout &&\n              dest !== process.stderr;\n\n  var endFn = doEnd ? onend : cleanup;\n  if (state.endEmitted)\n    process.nextTick(endFn);\n  else\n    src.once('end', endFn);\n\n  dest.on('unpipe', onunpipe);\n  function onunpipe(readable) {\n    debug('onunpipe');\n    if (readable === src) {\n      cleanup();\n    }\n  }\n\n  function onend() {\n    debug('onend');\n    dest.end();\n  }\n\n  // when the dest drains, it reduces the awaitDrain counter\n  // on the source.  This would be more elegant with a .once()\n  // handler in flow(), but adding and removing repeatedly is\n  // too slow.\n  var ondrain = pipeOnDrain(src);\n  dest.on('drain', ondrain);\n\n  function cleanup() {\n    debug('cleanup');\n    // cleanup event handlers once the pipe is broken\n    dest.removeListener('close', onclose);\n    dest.removeListener('finish', onfinish);\n    dest.removeListener('drain', ondrain);\n    dest.removeListener('error', onerror);\n    dest.removeListener('unpipe', onunpipe);\n    src.removeListener('end', onend);\n    src.removeListener('end', cleanup);\n    src.removeListener('data', ondata);\n\n    // if the reader is waiting for a drain event from this\n    // specific writer, then it would cause it to never start\n    // flowing again.\n    // So, if this is awaiting a drain, then we just call it now.\n    // If we don't know, then assume that we are waiting for one.\n    if (state.awaitDrain &&\n        (!dest._writableState || dest._writableState.needDrain))\n      ondrain();\n  }\n\n  src.on('data', ondata);\n  function ondata(chunk) {\n    debug('ondata');\n    var ret = dest.write(chunk);\n    if (false === ret) {\n      debug('false write response, pause',\n            src._readableState.awaitDrain);\n      src._readableState.awaitDrain++;\n      src.pause();\n    }\n  }\n\n  // if the dest has an error, then stop piping into it.\n  // however, don't suppress the throwing behavior for this.\n  function onerror(er) {\n    debug('onerror', er);\n    unpipe();\n    dest.removeListener('error', onerror);\n    if (EE.listenerCount(dest, 'error') === 0)\n      dest.emit('error', er);\n  }\n  // This is a brutally ugly hack to make sure that our error handler\n  // is attached before any userland ones.  NEVER DO THIS.\n  if (!dest._events || !dest._events.error)\n    dest.on('error', onerror);\n  else if (isArray(dest._events.error))\n    dest._events.error.unshift(onerror);\n  else\n    dest._events.error = [onerror, dest._events.error];\n\n\n\n  // Both close and finish should trigger unpipe, but only once.\n  function onclose() {\n    dest.removeListener('finish', onfinish);\n    unpipe();\n  }\n  dest.once('close', onclose);\n  function onfinish() {\n    debug('onfinish');\n    dest.removeListener('close', onclose);\n    unpipe();\n  }\n  dest.once('finish', onfinish);\n\n  function unpipe() {\n    debug('unpipe');\n    src.unpipe(dest);\n  }\n\n  // tell the dest that it's being piped to\n  dest.emit('pipe', src);\n\n  // start the flow if it hasn't been started already.\n  if (!state.flowing) {\n    debug('pipe resume');\n    src.resume();\n  }\n\n  return dest;\n};\n\nfunction pipeOnDrain(src) {\n  return function() {\n    var state = src._readableState;\n    debug('pipeOnDrain', state.awaitDrain);\n    if (state.awaitDrain)\n      state.awaitDrain--;\n    if (state.awaitDrain === 0 && EE.listenerCount(src, 'data')) {\n      state.flowing = true;\n      flow(src);\n    }\n  };\n}\n\n\nReadable.prototype.unpipe = function(dest) {\n  var state = this._readableState;\n\n  // if we're not piping anywhere, then do nothing.\n  if (state.pipesCount === 0)\n    return this;\n\n  // just one destination.  most common case.\n  if (state.pipesCount === 1) {\n    // passed in one, but it's not the right one.\n    if (dest && dest !== state.pipes)\n      return this;\n\n    if (!dest)\n      dest = state.pipes;\n\n    // got a match.\n    state.pipes = null;\n    state.pipesCount = 0;\n    state.flowing = false;\n    if (dest)\n      dest.emit('unpipe', this);\n    return this;\n  }\n\n  // slow case. multiple pipe destinations.\n\n  if (!dest) {\n    // remove all.\n    var dests = state.pipes;\n    var len = state.pipesCount;\n    state.pipes = null;\n    state.pipesCount = 0;\n    state.flowing = false;\n\n    for (var i = 0; i < len; i++)\n      dests[i].emit('unpipe', this);\n    return this;\n  }\n\n  // try to find the right one.\n  var i = indexOf(state.pipes, dest);\n  if (i === -1)\n    return this;\n\n  state.pipes.splice(i, 1);\n  state.pipesCount -= 1;\n  if (state.pipesCount === 1)\n    state.pipes = state.pipes[0];\n\n  dest.emit('unpipe', this);\n\n  return this;\n};\n\n// set up data events if they are asked for\n// Ensure readable listeners eventually get something\nReadable.prototype.on = function(ev, fn) {\n  var res = Stream.prototype.on.call(this, ev, fn);\n\n  // If listening to data, and it has not explicitly been paused,\n  // then call resume to start the flow of data on the next tick.\n  if (ev === 'data' && false !== this._readableState.flowing) {\n    this.resume();\n  }\n\n  if (ev === 'readable' && this.readable) {\n    var state = this._readableState;\n    if (!state.readableListening) {\n      state.readableListening = true;\n      state.emittedReadable = false;\n      state.needReadable = true;\n      if (!state.reading) {\n        var self = this;\n        process.nextTick(function() {\n          debug('readable nexttick read 0');\n          self.read(0);\n        });\n      } else if (state.length) {\n        emitReadable(this, state);\n      }\n    }\n  }\n\n  return res;\n};\nReadable.prototype.addListener = Readable.prototype.on;\n\n// pause() and resume() are remnants of the legacy readable stream API\n// If the user uses them, then switch into old mode.\nReadable.prototype.resume = function() {\n  var state = this._readableState;\n  if (!state.flowing) {\n    debug('resume');\n    state.flowing = true;\n    if (!state.reading) {\n      debug('resume read 0');\n      this.read(0);\n    }\n    resume(this, state);\n  }\n  return this;\n};\n\nfunction resume(stream, state) {\n  if (!state.resumeScheduled) {\n    state.resumeScheduled = true;\n    process.nextTick(function() {\n      resume_(stream, state);\n    });\n  }\n}\n\nfunction resume_(stream, state) {\n  state.resumeScheduled = false;\n  stream.emit('resume');\n  flow(stream);\n  if (state.flowing && !state.reading)\n    stream.read(0);\n}\n\nReadable.prototype.pause = function() {\n  debug('call pause flowing=%j', this._readableState.flowing);\n  if (false !== this._readableState.flowing) {\n    debug('pause');\n    this._readableState.flowing = false;\n    this.emit('pause');\n  }\n  return this;\n};\n\nfunction flow(stream) {\n  var state = stream._readableState;\n  debug('flow', state.flowing);\n  if (state.flowing) {\n    do {\n      var chunk = stream.read();\n    } while (null !== chunk && state.flowing);\n  }\n}\n\n// wrap an old-style stream as the async data source.\n// This is *not* part of the readable stream interface.\n// It is an ugly unfortunate mess of history.\nReadable.prototype.wrap = function(stream) {\n  var state = this._readableState;\n  var paused = false;\n\n  var self = this;\n  stream.on('end', function() {\n    debug('wrapped end');\n    if (state.decoder && !state.ended) {\n      var chunk = state.decoder.end();\n      if (chunk && chunk.length)\n        self.push(chunk);\n    }\n\n    self.push(null);\n  });\n\n  stream.on('data', function(chunk) {\n    debug('wrapped data');\n    if (state.decoder)\n      chunk = state.decoder.write(chunk);\n    if (!chunk || !state.objectMode && !chunk.length)\n      return;\n\n    var ret = self.push(chunk);\n    if (!ret) {\n      paused = true;\n      stream.pause();\n    }\n  });\n\n  // proxy all the other methods.\n  // important when wrapping filters and duplexes.\n  for (var i in stream) {\n    if (util.isFunction(stream[i]) && util.isUndefined(this[i])) {\n      this[i] = function(method) { return function() {\n        return stream[method].apply(stream, arguments);\n      }}(i);\n    }\n  }\n\n  // proxy certain important events.\n  var events = ['error', 'close', 'destroy', 'pause', 'resume'];\n  forEach(events, function(ev) {\n    stream.on(ev, self.emit.bind(self, ev));\n  });\n\n  // when we try to consume some more bytes, simply unpause the\n  // underlying stream.\n  self._read = function(n) {\n    debug('wrapped _read', n);\n    if (paused) {\n      paused = false;\n      stream.resume();\n    }\n  };\n\n  return self;\n};\n\n\n\n// exposed for testing purposes only.\nReadable._fromList = fromList;\n\n// Pluck off n bytes from an array of buffers.\n// Length is the combined lengths of all the buffers in the list.\nfunction fromList(n, state) {\n  var list = state.buffer;\n  var length = state.length;\n  var stringMode = !!state.decoder;\n  var objectMode = !!state.objectMode;\n  var ret;\n\n  // nothing in the list, definitely empty.\n  if (list.length === 0)\n    return null;\n\n  if (length === 0)\n    ret = null;\n  else if (objectMode)\n    ret = list.shift();\n  else if (!n || n >= length) {\n    // read it all, truncate the array.\n    if (stringMode)\n      ret = list.join('');\n    else\n      ret = Buffer.concat(list, length);\n    list.length = 0;\n  } else {\n    // read just some of it.\n    if (n < list[0].length) {\n      // just take a part of the first list item.\n      // slice is the same for buffers and strings.\n      var buf = list[0];\n      ret = buf.slice(0, n);\n      list[0] = buf.slice(n);\n    } else if (n === list[0].length) {\n      // first list is a perfect match\n      ret = list.shift();\n    } else {\n      // complex case.\n      // we have enough to cover it, but it spans past the first buffer.\n      if (stringMode)\n        ret = '';\n      else\n        ret = new Buffer(n);\n\n      var c = 0;\n      for (var i = 0, l = list.length; i < l && c < n; i++) {\n        var buf = list[0];\n        var cpy = Math.min(n - c, buf.length);\n\n        if (stringMode)\n          ret += buf.slice(0, cpy);\n        else\n          buf.copy(ret, c, 0, cpy);\n\n        if (cpy < buf.length)\n          list[0] = buf.slice(cpy);\n        else\n          list.shift();\n\n        c += cpy;\n      }\n    }\n  }\n\n  return ret;\n}\n\nfunction endReadable(stream) {\n  var state = stream._readableState;\n\n  // If we get here before consuming all the bytes, then that is a\n  // bug in node.  Should never happen.\n  if (state.length > 0)\n    throw new Error('endReadable called on non-empty stream');\n\n  if (!state.endEmitted) {\n    state.ended = true;\n    process.nextTick(function() {\n      // Check that we didn't get one last unshift.\n      if (!state.endEmitted && state.length === 0) {\n        state.endEmitted = true;\n        stream.readable = false;\n        stream.emit('end');\n      }\n    });\n  }\n}\n\nfunction forEach (xs, f) {\n  for (var i = 0, l = xs.length; i < l; i++) {\n    f(xs[i], i);\n  }\n}\n\nfunction indexOf (xs, x) {\n  for (var i = 0, l = xs.length; i < l; i++) {\n    if (xs[i] === x) return i;\n  }\n  return -1;\n}\n\n}).call(this,require('_process'))\n},{\"./_stream_duplex\":53,\"_process\":51,\"buffer\":43,\"core-util-is\":58,\"events\":47,\"inherits\":48,\"isarray\":49,\"stream\":63,\"string_decoder/\":64,\"util\":42}],56:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n// a transform stream is a readable/writable stream where you do\n// something with the data.  Sometimes it's called a \"filter\",\n// but that's not a great name for it, since that implies a thing where\n// some bits pass through, and others are simply ignored.  (That would\n// be a valid example of a transform, of course.)\n//\n// While the output is causally related to the input, it's not a\n// necessarily symmetric or synchronous transformation.  For example,\n// a zlib stream might take multiple plain-text writes(), and then\n// emit a single compressed chunk some time in the future.\n//\n// Here's how this works:\n//\n// The Transform stream has all the aspects of the readable and writable\n// stream classes.  When you write(chunk), that calls _write(chunk,cb)\n// internally, and returns false if there's a lot of pending writes\n// buffered up.  When you call read(), that calls _read(n) until\n// there's enough pending readable data buffered up.\n//\n// In a transform stream, the written data is placed in a buffer.  When\n// _read(n) is called, it transforms the queued up data, calling the\n// buffered _write cb's as it consumes chunks.  If consuming a single\n// written chunk would result in multiple output chunks, then the first\n// outputted bit calls the readcb, and subsequent chunks just go into\n// the read buffer, and will cause it to emit 'readable' if necessary.\n//\n// This way, back-pressure is actually determined by the reading side,\n// since _read has to be called to start processing a new chunk.  However,\n// a pathological inflate type of transform can cause excessive buffering\n// here.  For example, imagine a stream where every byte of input is\n// interpreted as an integer from 0-255, and then results in that many\n// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in\n// 1kb of data being output.  In this case, you could write a very small\n// amount of input, and end up with a very large amount of output.  In\n// such a pathological inflating mechanism, there'd be no way to tell\n// the system to stop doing the transform.  A single 4MB write could\n// cause the system to run out of memory.\n//\n// However, even in such a pathological case, only a single written chunk\n// would be consumed, and then the rest would wait (un-transformed) until\n// the results of the previous transformed chunk were consumed.\n\nmodule.exports = Transform;\n\nvar Duplex = require('./_stream_duplex');\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\nutil.inherits(Transform, Duplex);\n\n\nfunction TransformState(options, stream) {\n  this.afterTransform = function(er, data) {\n    return afterTransform(stream, er, data);\n  };\n\n  this.needTransform = false;\n  this.transforming = false;\n  this.writecb = null;\n  this.writechunk = null;\n}\n\nfunction afterTransform(stream, er, data) {\n  var ts = stream._transformState;\n  ts.transforming = false;\n\n  var cb = ts.writecb;\n\n  if (!cb)\n    return stream.emit('error', new Error('no writecb in Transform class'));\n\n  ts.writechunk = null;\n  ts.writecb = null;\n\n  if (!util.isNullOrUndefined(data))\n    stream.push(data);\n\n  if (cb)\n    cb(er);\n\n  var rs = stream._readableState;\n  rs.reading = false;\n  if (rs.needReadable || rs.length < rs.highWaterMark) {\n    stream._read(rs.highWaterMark);\n  }\n}\n\n\nfunction Transform(options) {\n  if (!(this instanceof Transform))\n    return new Transform(options);\n\n  Duplex.call(this, options);\n\n  this._transformState = new TransformState(options, this);\n\n  // when the writable side finishes, then flush out anything remaining.\n  var stream = this;\n\n  // start out asking for a readable event once data is transformed.\n  this._readableState.needReadable = true;\n\n  // we have implemented the _read method, and done the other things\n  // that Readable wants before the first _read call, so unset the\n  // sync guard flag.\n  this._readableState.sync = false;\n\n  this.once('prefinish', function() {\n    if (util.isFunction(this._flush))\n      this._flush(function(er) {\n        done(stream, er);\n      });\n    else\n      done(stream);\n  });\n}\n\nTransform.prototype.push = function(chunk, encoding) {\n  this._transformState.needTransform = false;\n  return Duplex.prototype.push.call(this, chunk, encoding);\n};\n\n// This is the part where you do stuff!\n// override this function in implementation classes.\n// 'chunk' is an input chunk.\n//\n// Call `push(newChunk)` to pass along transformed output\n// to the readable side.  You may call 'push' zero or more times.\n//\n// Call `cb(err)` when you are done with this chunk.  If you pass\n// an error, then that'll put the hurt on the whole operation.  If you\n// never call cb(), then you'll never get another chunk.\nTransform.prototype._transform = function(chunk, encoding, cb) {\n  throw new Error('not implemented');\n};\n\nTransform.prototype._write = function(chunk, encoding, cb) {\n  var ts = this._transformState;\n  ts.writecb = cb;\n  ts.writechunk = chunk;\n  ts.writeencoding = encoding;\n  if (!ts.transforming) {\n    var rs = this._readableState;\n    if (ts.needTransform ||\n        rs.needReadable ||\n        rs.length < rs.highWaterMark)\n      this._read(rs.highWaterMark);\n  }\n};\n\n// Doesn't matter what the args are here.\n// _transform does all the work.\n// That we got here means that the readable side wants more data.\nTransform.prototype._read = function(n) {\n  var ts = this._transformState;\n\n  if (!util.isNull(ts.writechunk) && ts.writecb && !ts.transforming) {\n    ts.transforming = true;\n    this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);\n  } else {\n    // mark that we need a transform, so that any data that comes in\n    // will get processed, now that we've asked for it.\n    ts.needTransform = true;\n  }\n};\n\n\nfunction done(stream, er) {\n  if (er)\n    return stream.emit('error', er);\n\n  // if there's nothing in the write buffer, then that means\n  // that nothing more will ever be provided\n  var ws = stream._writableState;\n  var ts = stream._transformState;\n\n  if (ws.length)\n    throw new Error('calling transform done when ws.length != 0');\n\n  if (ts.transforming)\n    throw new Error('calling transform done when still transforming');\n\n  return stream.push(null);\n}\n\n},{\"./_stream_duplex\":53,\"core-util-is\":58,\"inherits\":48}],57:[function(require,module,exports){\n(function (process){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// A bit simpler than readable streams.\n// Implement an async ._write(chunk, cb), and it'll handle all\n// the drain event emission and buffering.\n\nmodule.exports = Writable;\n\n/*<replacement>*/\nvar Buffer = require('buffer').Buffer;\n/*</replacement>*/\n\nWritable.WritableState = WritableState;\n\n\n/*<replacement>*/\nvar util = require('core-util-is');\nutil.inherits = require('inherits');\n/*</replacement>*/\n\nvar Stream = require('stream');\n\nutil.inherits(Writable, Stream);\n\nfunction WriteReq(chunk, encoding, cb) {\n  this.chunk = chunk;\n  this.encoding = encoding;\n  this.callback = cb;\n}\n\nfunction WritableState(options, stream) {\n  var Duplex = require('./_stream_duplex');\n\n  options = options || {};\n\n  // the point at which write() starts returning false\n  // Note: 0 is a valid value, means that we always return false if\n  // the entire buffer is not flushed immediately on write()\n  var hwm = options.highWaterMark;\n  var defaultHwm = options.objectMode ? 16 : 16 * 1024;\n  this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm;\n\n  // object stream flag to indicate whether or not this stream\n  // contains buffers or objects.\n  this.objectMode = !!options.objectMode;\n\n  if (stream instanceof Duplex)\n    this.objectMode = this.objectMode || !!options.writableObjectMode;\n\n  // cast to ints.\n  this.highWaterMark = ~~this.highWaterMark;\n\n  this.needDrain = false;\n  // at the start of calling end()\n  this.ending = false;\n  // when end() has been called, and returned\n  this.ended = false;\n  // when 'finish' is emitted\n  this.finished = false;\n\n  // should we decode strings into buffers before passing to _write?\n  // this is here so that some node-core streams can optimize string\n  // handling at a lower level.\n  var noDecode = options.decodeStrings === false;\n  this.decodeStrings = !noDecode;\n\n  // Crypto is kind of old and crusty.  Historically, its default string\n  // encoding is 'binary' so we have to make this configurable.\n  // Everything else in the universe uses 'utf8', though.\n  this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n  // not an actual buffer we keep track of, but a measurement\n  // of how much we're waiting to get pushed to some underlying\n  // socket or file.\n  this.length = 0;\n\n  // a flag to see when we're in the middle of a write.\n  this.writing = false;\n\n  // when true all writes will be buffered until .uncork() call\n  this.corked = 0;\n\n  // a flag to be able to tell if the onwrite cb is called immediately,\n  // or on a later tick.  We set this to true at first, because any\n  // actions that shouldn't happen until \"later\" should generally also\n  // not happen before the first write call.\n  this.sync = true;\n\n  // a flag to know if we're processing previously buffered items, which\n  // may call the _write() callback in the same tick, so that we don't\n  // end up in an overlapped onwrite situation.\n  this.bufferProcessing = false;\n\n  // the callback that's passed to _write(chunk,cb)\n  this.onwrite = function(er) {\n    onwrite(stream, er);\n  };\n\n  // the callback that the user supplies to write(chunk,encoding,cb)\n  this.writecb = null;\n\n  // the amount that is being written when _write is called.\n  this.writelen = 0;\n\n  this.buffer = [];\n\n  // number of pending user-supplied write callbacks\n  // this must be 0 before 'finish' can be emitted\n  this.pendingcb = 0;\n\n  // emit prefinish if the only thing we're waiting for is _write cbs\n  // This is relevant for synchronous Transform streams\n  this.prefinished = false;\n\n  // True if the error was already emitted and should not be thrown again\n  this.errorEmitted = false;\n}\n\nfunction Writable(options) {\n  var Duplex = require('./_stream_duplex');\n\n  // Writable ctor is applied to Duplexes, though they're not\n  // instanceof Writable, they're instanceof Readable.\n  if (!(this instanceof Writable) && !(this instanceof Duplex))\n    return new Writable(options);\n\n  this._writableState = new WritableState(options, this);\n\n  // legacy.\n  this.writable = true;\n\n  Stream.call(this);\n}\n\n// Otherwise people can pipe Writable streams, which is just wrong.\nWritable.prototype.pipe = function() {\n  this.emit('error', new Error('Cannot pipe. Not readable.'));\n};\n\n\nfunction writeAfterEnd(stream, state, cb) {\n  var er = new Error('write after end');\n  // TODO: defer error events consistently everywhere, not just the cb\n  stream.emit('error', er);\n  process.nextTick(function() {\n    cb(er);\n  });\n}\n\n// If we get something that is not a buffer, string, null, or undefined,\n// and we're not in objectMode, then that's an error.\n// Otherwise stream chunks are all considered to be of length=1, and the\n// watermarks determine how many objects to keep in the buffer, rather than\n// how many bytes or characters.\nfunction validChunk(stream, state, chunk, cb) {\n  var valid = true;\n  if (!util.isBuffer(chunk) &&\n      !util.isString(chunk) &&\n      !util.isNullOrUndefined(chunk) &&\n      !state.objectMode) {\n    var er = new TypeError('Invalid non-string/buffer chunk');\n    stream.emit('error', er);\n    process.nextTick(function() {\n      cb(er);\n    });\n    valid = false;\n  }\n  return valid;\n}\n\nWritable.prototype.write = function(chunk, encoding, cb) {\n  var state = this._writableState;\n  var ret = false;\n\n  if (util.isFunction(encoding)) {\n    cb = encoding;\n    encoding = null;\n  }\n\n  if (util.isBuffer(chunk))\n    encoding = 'buffer';\n  else if (!encoding)\n    encoding = state.defaultEncoding;\n\n  if (!util.isFunction(cb))\n    cb = function() {};\n\n  if (state.ended)\n    writeAfterEnd(this, state, cb);\n  else if (validChunk(this, state, chunk, cb)) {\n    state.pendingcb++;\n    ret = writeOrBuffer(this, state, chunk, encoding, cb);\n  }\n\n  return ret;\n};\n\nWritable.prototype.cork = function() {\n  var state = this._writableState;\n\n  state.corked++;\n};\n\nWritable.prototype.uncork = function() {\n  var state = this._writableState;\n\n  if (state.corked) {\n    state.corked--;\n\n    if (!state.writing &&\n        !state.corked &&\n        !state.finished &&\n        !state.bufferProcessing &&\n        state.buffer.length)\n      clearBuffer(this, state);\n  }\n};\n\nfunction decodeChunk(state, chunk, encoding) {\n  if (!state.objectMode &&\n      state.decodeStrings !== false &&\n      util.isString(chunk)) {\n    chunk = new Buffer(chunk, encoding);\n  }\n  return chunk;\n}\n\n// if we're already writing something, then just put this\n// in the queue, and wait our turn.  Otherwise, call _write\n// If we return false, then we need a drain event, so set that flag.\nfunction writeOrBuffer(stream, state, chunk, encoding, cb) {\n  chunk = decodeChunk(state, chunk, encoding);\n  if (util.isBuffer(chunk))\n    encoding = 'buffer';\n  var len = state.objectMode ? 1 : chunk.length;\n\n  state.length += len;\n\n  var ret = state.length < state.highWaterMark;\n  // we must ensure that previous needDrain will not be reset to false.\n  if (!ret)\n    state.needDrain = true;\n\n  if (state.writing || state.corked)\n    state.buffer.push(new WriteReq(chunk, encoding, cb));\n  else\n    doWrite(stream, state, false, len, chunk, encoding, cb);\n\n  return ret;\n}\n\nfunction doWrite(stream, state, writev, len, chunk, encoding, cb) {\n  state.writelen = len;\n  state.writecb = cb;\n  state.writing = true;\n  state.sync = true;\n  if (writev)\n    stream._writev(chunk, state.onwrite);\n  else\n    stream._write(chunk, encoding, state.onwrite);\n  state.sync = false;\n}\n\nfunction onwriteError(stream, state, sync, er, cb) {\n  if (sync)\n    process.nextTick(function() {\n      state.pendingcb--;\n      cb(er);\n    });\n  else {\n    state.pendingcb--;\n    cb(er);\n  }\n\n  stream._writableState.errorEmitted = true;\n  stream.emit('error', er);\n}\n\nfunction onwriteStateUpdate(state) {\n  state.writing = false;\n  state.writecb = null;\n  state.length -= state.writelen;\n  state.writelen = 0;\n}\n\nfunction onwrite(stream, er) {\n  var state = stream._writableState;\n  var sync = state.sync;\n  var cb = state.writecb;\n\n  onwriteStateUpdate(state);\n\n  if (er)\n    onwriteError(stream, state, sync, er, cb);\n  else {\n    // Check if we're actually ready to finish, but don't emit yet\n    var finished = needFinish(stream, state);\n\n    if (!finished &&\n        !state.corked &&\n        !state.bufferProcessing &&\n        state.buffer.length) {\n      clearBuffer(stream, state);\n    }\n\n    if (sync) {\n      process.nextTick(function() {\n        afterWrite(stream, state, finished, cb);\n      });\n    } else {\n      afterWrite(stream, state, finished, cb);\n    }\n  }\n}\n\nfunction afterWrite(stream, state, finished, cb) {\n  if (!finished)\n    onwriteDrain(stream, state);\n  state.pendingcb--;\n  cb();\n  finishMaybe(stream, state);\n}\n\n// Must force callback to be called on nextTick, so that we don't\n// emit 'drain' before the write() consumer gets the 'false' return\n// value, and has a chance to attach a 'drain' listener.\nfunction onwriteDrain(stream, state) {\n  if (state.length === 0 && state.needDrain) {\n    state.needDrain = false;\n    stream.emit('drain');\n  }\n}\n\n\n// if there's something in the buffer waiting, then process it\nfunction clearBuffer(stream, state) {\n  state.bufferProcessing = true;\n\n  if (stream._writev && state.buffer.length > 1) {\n    // Fast case, write everything using _writev()\n    var cbs = [];\n    for (var c = 0; c < state.buffer.length; c++)\n      cbs.push(state.buffer[c].callback);\n\n    // count the one we are adding, as well.\n    // TODO(isaacs) clean this up\n    state.pendingcb++;\n    doWrite(stream, state, true, state.length, state.buffer, '', function(err) {\n      for (var i = 0; i < cbs.length; i++) {\n        state.pendingcb--;\n        cbs[i](err);\n      }\n    });\n\n    // Clear buffer\n    state.buffer = [];\n  } else {\n    // Slow case, write chunks one-by-one\n    for (var c = 0; c < state.buffer.length; c++) {\n      var entry = state.buffer[c];\n      var chunk = entry.chunk;\n      var encoding = entry.encoding;\n      var cb = entry.callback;\n      var len = state.objectMode ? 1 : chunk.length;\n\n      doWrite(stream, state, false, len, chunk, encoding, cb);\n\n      // if we didn't call the onwrite immediately, then\n      // it means that we need to wait until it does.\n      // also, that means that the chunk and cb are currently\n      // being processed, so move the buffer counter past them.\n      if (state.writing) {\n        c++;\n        break;\n      }\n    }\n\n    if (c < state.buffer.length)\n      state.buffer = state.buffer.slice(c);\n    else\n      state.buffer.length = 0;\n  }\n\n  state.bufferProcessing = false;\n}\n\nWritable.prototype._write = function(chunk, encoding, cb) {\n  cb(new Error('not implemented'));\n\n};\n\nWritable.prototype._writev = null;\n\nWritable.prototype.end = function(chunk, encoding, cb) {\n  var state = this._writableState;\n\n  if (util.isFunction(chunk)) {\n    cb = chunk;\n    chunk = null;\n    encoding = null;\n  } else if (util.isFunction(encoding)) {\n    cb = encoding;\n    encoding = null;\n  }\n\n  if (!util.isNullOrUndefined(chunk))\n    this.write(chunk, encoding);\n\n  // .end() fully uncorks\n  if (state.corked) {\n    state.corked = 1;\n    this.uncork();\n  }\n\n  // ignore unnecessary end() calls.\n  if (!state.ending && !state.finished)\n    endWritable(this, state, cb);\n};\n\n\nfunction needFinish(stream, state) {\n  return (state.ending &&\n          state.length === 0 &&\n          !state.finished &&\n          !state.writing);\n}\n\nfunction prefinish(stream, state) {\n  if (!state.prefinished) {\n    state.prefinished = true;\n    stream.emit('prefinish');\n  }\n}\n\nfunction finishMaybe(stream, state) {\n  var need = needFinish(stream, state);\n  if (need) {\n    if (state.pendingcb === 0) {\n      prefinish(stream, state);\n      state.finished = true;\n      stream.emit('finish');\n    } else\n      prefinish(stream, state);\n  }\n  return need;\n}\n\nfunction endWritable(stream, state, cb) {\n  state.ending = true;\n  finishMaybe(stream, state);\n  if (cb) {\n    if (state.finished)\n      process.nextTick(cb);\n    else\n      stream.once('finish', cb);\n  }\n  state.ended = true;\n}\n\n}).call(this,require('_process'))\n},{\"./_stream_duplex\":53,\"_process\":51,\"buffer\":43,\"core-util-is\":58,\"inherits\":48,\"stream\":63}],58:[function(require,module,exports){\n(function (Buffer){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nfunction isArray(ar) {\n  return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n  return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n  return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n  return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n  return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n  return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n  return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n  return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n  return isObject(e) &&\n      (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n  return arg === null ||\n         typeof arg === 'boolean' ||\n         typeof arg === 'number' ||\n         typeof arg === 'string' ||\n         typeof arg === 'symbol' ||  // ES6 symbol\n         typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nfunction isBuffer(arg) {\n  return Buffer.isBuffer(arg);\n}\nexports.isBuffer = isBuffer;\n\nfunction objectToString(o) {\n  return Object.prototype.toString.call(o);\n}\n}).call(this,require(\"buffer\").Buffer)\n},{\"buffer\":43}],59:[function(require,module,exports){\nmodule.exports = require(\"./lib/_stream_passthrough.js\")\n\n},{\"./lib/_stream_passthrough.js\":54}],60:[function(require,module,exports){\nexports = module.exports = require('./lib/_stream_readable.js');\nexports.Stream = require('stream');\nexports.Readable = exports;\nexports.Writable = require('./lib/_stream_writable.js');\nexports.Duplex = require('./lib/_stream_duplex.js');\nexports.Transform = require('./lib/_stream_transform.js');\nexports.PassThrough = require('./lib/_stream_passthrough.js');\n\n},{\"./lib/_stream_duplex.js\":53,\"./lib/_stream_passthrough.js\":54,\"./lib/_stream_readable.js\":55,\"./lib/_stream_transform.js\":56,\"./lib/_stream_writable.js\":57,\"stream\":63}],61:[function(require,module,exports){\nmodule.exports = require(\"./lib/_stream_transform.js\")\n\n},{\"./lib/_stream_transform.js\":56}],62:[function(require,module,exports){\nmodule.exports = require(\"./lib/_stream_writable.js\")\n\n},{\"./lib/_stream_writable.js\":57}],63:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nmodule.exports = Stream;\n\nvar EE = require('events').EventEmitter;\nvar inherits = require('inherits');\n\ninherits(Stream, EE);\nStream.Readable = require('readable-stream/readable.js');\nStream.Writable = require('readable-stream/writable.js');\nStream.Duplex = require('readable-stream/duplex.js');\nStream.Transform = require('readable-stream/transform.js');\nStream.PassThrough = require('readable-stream/passthrough.js');\n\n// Backwards-compat with node 0.4.x\nStream.Stream = Stream;\n\n\n\n// old-style streams.  Note that the pipe method (the only relevant\n// part of this class) is overridden in the Readable class.\n\nfunction Stream() {\n  EE.call(this);\n}\n\nStream.prototype.pipe = function(dest, options) {\n  var source = this;\n\n  function ondata(chunk) {\n    if (dest.writable) {\n      if (false === dest.write(chunk) && source.pause) {\n        source.pause();\n      }\n    }\n  }\n\n  source.on('data', ondata);\n\n  function ondrain() {\n    if (source.readable && source.resume) {\n      source.resume();\n    }\n  }\n\n  dest.on('drain', ondrain);\n\n  // If the 'end' option is not supplied, dest.end() will be called when\n  // source gets the 'end' or 'close' events.  Only dest.end() once.\n  if (!dest._isStdio && (!options || options.end !== false)) {\n    source.on('end', onend);\n    source.on('close', onclose);\n  }\n\n  var didOnEnd = false;\n  function onend() {\n    if (didOnEnd) return;\n    didOnEnd = true;\n\n    dest.end();\n  }\n\n\n  function onclose() {\n    if (didOnEnd) return;\n    didOnEnd = true;\n\n    if (typeof dest.destroy === 'function') dest.destroy();\n  }\n\n  // don't leave dangling pipes when there are errors.\n  function onerror(er) {\n    cleanup();\n    if (EE.listenerCount(this, 'error') === 0) {\n      throw er; // Unhandled stream error in pipe.\n    }\n  }\n\n  source.on('error', onerror);\n  dest.on('error', onerror);\n\n  // remove all the event listeners that were added.\n  function cleanup() {\n    source.removeListener('data', ondata);\n    dest.removeListener('drain', ondrain);\n\n    source.removeListener('end', onend);\n    source.removeListener('close', onclose);\n\n    source.removeListener('error', onerror);\n    dest.removeListener('error', onerror);\n\n    source.removeListener('end', cleanup);\n    source.removeListener('close', cleanup);\n\n    dest.removeListener('close', cleanup);\n  }\n\n  source.on('end', cleanup);\n  source.on('close', cleanup);\n\n  dest.on('close', cleanup);\n\n  dest.emit('pipe', source);\n\n  // Allow for unix-like usage: A.pipe(B).pipe(C)\n  return dest;\n};\n\n},{\"events\":47,\"inherits\":48,\"readable-stream/duplex.js\":52,\"readable-stream/passthrough.js\":59,\"readable-stream/readable.js\":60,\"readable-stream/transform.js\":61,\"readable-stream/writable.js\":62}],64:[function(require,module,exports){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar Buffer = require('buffer').Buffer;\n\nvar isBufferEncoding = Buffer.isEncoding\n  || function(encoding) {\n       switch (encoding && encoding.toLowerCase()) {\n         case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true;\n         default: return false;\n       }\n     }\n\n\nfunction assertEncoding(encoding) {\n  if (encoding && !isBufferEncoding(encoding)) {\n    throw new Error('Unknown encoding: ' + encoding);\n  }\n}\n\n// StringDecoder provides an interface for efficiently splitting a series of\n// buffers into a series of JS strings without breaking apart multi-byte\n// characters. CESU-8 is handled as part of the UTF-8 encoding.\n//\n// @TODO Handling all encodings inside a single object makes it very difficult\n// to reason about this code, so it should be split up in the future.\n// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code\n// points as used by CESU-8.\nvar StringDecoder = exports.StringDecoder = function(encoding) {\n  this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, '');\n  assertEncoding(encoding);\n  switch (this.encoding) {\n    case 'utf8':\n      // CESU-8 represents each of Surrogate Pair by 3-bytes\n      this.surrogateSize = 3;\n      break;\n    case 'ucs2':\n    case 'utf16le':\n      // UTF-16 represents each of Surrogate Pair by 2-bytes\n      this.surrogateSize = 2;\n      this.detectIncompleteChar = utf16DetectIncompleteChar;\n      break;\n    case 'base64':\n      // Base-64 stores 3 bytes in 4 chars, and pads the remainder.\n      this.surrogateSize = 3;\n      this.detectIncompleteChar = base64DetectIncompleteChar;\n      break;\n    default:\n      this.write = passThroughWrite;\n      return;\n  }\n\n  // Enough space to store all bytes of a single character. UTF-8 needs 4\n  // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate).\n  this.charBuffer = new Buffer(6);\n  // Number of bytes received for the current incomplete multi-byte character.\n  this.charReceived = 0;\n  // Number of bytes expected for the current incomplete multi-byte character.\n  this.charLength = 0;\n};\n\n\n// write decodes the given buffer and returns it as JS string that is\n// guaranteed to not contain any partial multi-byte characters. Any partial\n// character found at the end of the buffer is buffered up, and will be\n// returned when calling write again with the remaining bytes.\n//\n// Note: Converting a Buffer containing an orphan surrogate to a String\n// currently works, but converting a String to a Buffer (via `new Buffer`, or\n// Buffer#write) will replace incomplete surrogates with the unicode\n// replacement character. See https://codereview.chromium.org/121173009/ .\nStringDecoder.prototype.write = function(buffer) {\n  var charStr = '';\n  // if our last write ended with an incomplete multibyte character\n  while (this.charLength) {\n    // determine how many remaining bytes this buffer has to offer for this char\n    var available = (buffer.length >= this.charLength - this.charReceived) ?\n        this.charLength - this.charReceived :\n        buffer.length;\n\n    // add the new bytes to the char buffer\n    buffer.copy(this.charBuffer, this.charReceived, 0, available);\n    this.charReceived += available;\n\n    if (this.charReceived < this.charLength) {\n      // still not enough chars in this buffer? wait for more ...\n      return '';\n    }\n\n    // remove bytes belonging to the current character from the buffer\n    buffer = buffer.slice(available, buffer.length);\n\n    // get the character that was split\n    charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding);\n\n    // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character\n    var charCode = charStr.charCodeAt(charStr.length - 1);\n    if (charCode >= 0xD800 && charCode <= 0xDBFF) {\n      this.charLength += this.surrogateSize;\n      charStr = '';\n      continue;\n    }\n    this.charReceived = this.charLength = 0;\n\n    // if there are no more bytes in this buffer, just emit our char\n    if (buffer.length === 0) {\n      return charStr;\n    }\n    break;\n  }\n\n  // determine and set charLength / charReceived\n  this.detectIncompleteChar(buffer);\n\n  var end = buffer.length;\n  if (this.charLength) {\n    // buffer the incomplete character bytes we got\n    buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end);\n    end -= this.charReceived;\n  }\n\n  charStr += buffer.toString(this.encoding, 0, end);\n\n  var end = charStr.length - 1;\n  var charCode = charStr.charCodeAt(end);\n  // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character\n  if (charCode >= 0xD800 && charCode <= 0xDBFF) {\n    var size = this.surrogateSize;\n    this.charLength += size;\n    this.charReceived += size;\n    this.charBuffer.copy(this.charBuffer, size, 0, size);\n    buffer.copy(this.charBuffer, 0, 0, size);\n    return charStr.substring(0, end);\n  }\n\n  // or just emit the charStr\n  return charStr;\n};\n\n// detectIncompleteChar determines if there is an incomplete UTF-8 character at\n// the end of the given buffer. If so, it sets this.charLength to the byte\n// length that character, and sets this.charReceived to the number of bytes\n// that are available for this character.\nStringDecoder.prototype.detectIncompleteChar = function(buffer) {\n  // determine how many bytes we have to check at the end of this buffer\n  var i = (buffer.length >= 3) ? 3 : buffer.length;\n\n  // Figure out if one of the last i bytes of our buffer announces an\n  // incomplete char.\n  for (; i > 0; i--) {\n    var c = buffer[buffer.length - i];\n\n    // See http://en.wikipedia.org/wiki/UTF-8#Description\n\n    // 110XXXXX\n    if (i == 1 && c >> 5 == 0x06) {\n      this.charLength = 2;\n      break;\n    }\n\n    // 1110XXXX\n    if (i <= 2 && c >> 4 == 0x0E) {\n      this.charLength = 3;\n      break;\n    }\n\n    // 11110XXX\n    if (i <= 3 && c >> 3 == 0x1E) {\n      this.charLength = 4;\n      break;\n    }\n  }\n  this.charReceived = i;\n};\n\nStringDecoder.prototype.end = function(buffer) {\n  var res = '';\n  if (buffer && buffer.length)\n    res = this.write(buffer);\n\n  if (this.charReceived) {\n    var cr = this.charReceived;\n    var buf = this.charBuffer;\n    var enc = this.encoding;\n    res += buf.slice(0, cr).toString(enc);\n  }\n\n  return res;\n};\n\nfunction passThroughWrite(buffer) {\n  return buffer.toString(this.encoding);\n}\n\nfunction utf16DetectIncompleteChar(buffer) {\n  this.charReceived = buffer.length % 2;\n  this.charLength = this.charReceived ? 2 : 0;\n}\n\nfunction base64DetectIncompleteChar(buffer) {\n  this.charReceived = buffer.length % 3;\n  this.charLength = this.charReceived ? 3 : 0;\n}\n\n},{\"buffer\":43}],65:[function(require,module,exports){\nmodule.exports = function isBuffer(arg) {\n  return arg && typeof arg === 'object'\n    && typeof arg.copy === 'function'\n    && typeof arg.fill === 'function'\n    && typeof arg.readUInt8 === 'function';\n}\n},{}],66:[function(require,module,exports){\n(function (process,global){\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n  if (!isString(f)) {\n    var objects = [];\n    for (var i = 0; i < arguments.length; i++) {\n      objects.push(inspect(arguments[i]));\n    }\n    return objects.join(' ');\n  }\n\n  var i = 1;\n  var args = arguments;\n  var len = args.length;\n  var str = String(f).replace(formatRegExp, function(x) {\n    if (x === '%%') return '%';\n    if (i >= len) return x;\n    switch (x) {\n      case '%s': return String(args[i++]);\n      case '%d': return Number(args[i++]);\n      case '%j':\n        try {\n          return JSON.stringify(args[i++]);\n        } catch (_) {\n          return '[Circular]';\n        }\n      default:\n        return x;\n    }\n  });\n  for (var x = args[i]; i < len; x = args[++i]) {\n    if (isNull(x) || !isObject(x)) {\n      str += ' ' + x;\n    } else {\n      str += ' ' + inspect(x);\n    }\n  }\n  return str;\n};\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nexports.deprecate = function(fn, msg) {\n  // Allow for deprecating things in the process of starting up.\n  if (isUndefined(global.process)) {\n    return function() {\n      return exports.deprecate(fn, msg).apply(this, arguments);\n    };\n  }\n\n  if (process.noDeprecation === true) {\n    return fn;\n  }\n\n  var warned = false;\n  function deprecated() {\n    if (!warned) {\n      if (process.throwDeprecation) {\n        throw new Error(msg);\n      } else if (process.traceDeprecation) {\n        console.trace(msg);\n      } else {\n        console.error(msg);\n      }\n      warned = true;\n    }\n    return fn.apply(this, arguments);\n  }\n\n  return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnviron;\nexports.debuglog = function(set) {\n  if (isUndefined(debugEnviron))\n    debugEnviron = process.env.NODE_DEBUG || '';\n  set = set.toUpperCase();\n  if (!debugs[set]) {\n    if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n      var pid = process.pid;\n      debugs[set] = function() {\n        var msg = exports.format.apply(exports, arguments);\n        console.error('%s %d: %s', set, pid, msg);\n      };\n    } else {\n      debugs[set] = function() {};\n    }\n  }\n  return debugs[set];\n};\n\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nfunction inspect(obj, opts) {\n  // default options\n  var ctx = {\n    seen: [],\n    stylize: stylizeNoColor\n  };\n  // legacy...\n  if (arguments.length >= 3) ctx.depth = arguments[2];\n  if (arguments.length >= 4) ctx.colors = arguments[3];\n  if (isBoolean(opts)) {\n    // legacy...\n    ctx.showHidden = opts;\n  } else if (opts) {\n    // got an \"options\" object\n    exports._extend(ctx, opts);\n  }\n  // set default options\n  if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n  if (isUndefined(ctx.depth)) ctx.depth = 2;\n  if (isUndefined(ctx.colors)) ctx.colors = false;\n  if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n  if (ctx.colors) ctx.stylize = stylizeWithColor;\n  return formatValue(ctx, obj, ctx.depth);\n}\nexports.inspect = inspect;\n\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect.colors = {\n  'bold' : [1, 22],\n  'italic' : [3, 23],\n  'underline' : [4, 24],\n  'inverse' : [7, 27],\n  'white' : [37, 39],\n  'grey' : [90, 39],\n  'black' : [30, 39],\n  'blue' : [34, 39],\n  'cyan' : [36, 39],\n  'green' : [32, 39],\n  'magenta' : [35, 39],\n  'red' : [31, 39],\n  'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect.styles = {\n  'special': 'cyan',\n  'number': 'yellow',\n  'boolean': 'yellow',\n  'undefined': 'grey',\n  'null': 'bold',\n  'string': 'green',\n  'date': 'magenta',\n  // \"name\": intentionally not styling\n  'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n  var style = inspect.styles[styleType];\n\n  if (style) {\n    return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n           '\\u001b[' + inspect.colors[style][1] + 'm';\n  } else {\n    return str;\n  }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n  return str;\n}\n\n\nfunction arrayToHash(array) {\n  var hash = {};\n\n  array.forEach(function(val, idx) {\n    hash[val] = true;\n  });\n\n  return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n  // Provide a hook for user-specified inspect functions.\n  // Check that value is an object with an inspect function on it\n  if (ctx.customInspect &&\n      value &&\n      isFunction(value.inspect) &&\n      // Filter out the util module, it's inspect function is special\n      value.inspect !== exports.inspect &&\n      // Also filter out any prototype objects using the circular check.\n      !(value.constructor && value.constructor.prototype === value)) {\n    var ret = value.inspect(recurseTimes, ctx);\n    if (!isString(ret)) {\n      ret = formatValue(ctx, ret, recurseTimes);\n    }\n    return ret;\n  }\n\n  // Primitive types cannot have properties\n  var primitive = formatPrimitive(ctx, value);\n  if (primitive) {\n    return primitive;\n  }\n\n  // Look up the keys of the object.\n  var keys = Object.keys(value);\n  var visibleKeys = arrayToHash(keys);\n\n  if (ctx.showHidden) {\n    keys = Object.getOwnPropertyNames(value);\n  }\n\n  // IE doesn't make error fields non-enumerable\n  // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n  if (isError(value)\n      && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n    return formatError(value);\n  }\n\n  // Some type of object without properties can be shortcutted.\n  if (keys.length === 0) {\n    if (isFunction(value)) {\n      var name = value.name ? ': ' + value.name : '';\n      return ctx.stylize('[Function' + name + ']', 'special');\n    }\n    if (isRegExp(value)) {\n      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n    }\n    if (isDate(value)) {\n      return ctx.stylize(Date.prototype.toString.call(value), 'date');\n    }\n    if (isError(value)) {\n      return formatError(value);\n    }\n  }\n\n  var base = '', array = false, braces = ['{', '}'];\n\n  // Make Array say that they are Array\n  if (isArray(value)) {\n    array = true;\n    braces = ['[', ']'];\n  }\n\n  // Make functions say that they are functions\n  if (isFunction(value)) {\n    var n = value.name ? ': ' + value.name : '';\n    base = ' [Function' + n + ']';\n  }\n\n  // Make RegExps say that they are RegExps\n  if (isRegExp(value)) {\n    base = ' ' + RegExp.prototype.toString.call(value);\n  }\n\n  // Make dates with properties first say the date\n  if (isDate(value)) {\n    base = ' ' + Date.prototype.toUTCString.call(value);\n  }\n\n  // Make error with message first say the error\n  if (isError(value)) {\n    base = ' ' + formatError(value);\n  }\n\n  if (keys.length === 0 && (!array || value.length == 0)) {\n    return braces[0] + base + braces[1];\n  }\n\n  if (recurseTimes < 0) {\n    if (isRegExp(value)) {\n      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n    } else {\n      return ctx.stylize('[Object]', 'special');\n    }\n  }\n\n  ctx.seen.push(value);\n\n  var output;\n  if (array) {\n    output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n  } else {\n    output = keys.map(function(key) {\n      return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n    });\n  }\n\n  ctx.seen.pop();\n\n  return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n  if (isUndefined(value))\n    return ctx.stylize('undefined', 'undefined');\n  if (isString(value)) {\n    var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n                                             .replace(/'/g, \"\\\\'\")\n                                             .replace(/\\\\\"/g, '\"') + '\\'';\n    return ctx.stylize(simple, 'string');\n  }\n  if (isNumber(value))\n    return ctx.stylize('' + value, 'number');\n  if (isBoolean(value))\n    return ctx.stylize('' + value, 'boolean');\n  // For some reason typeof null is \"object\", so special case here.\n  if (isNull(value))\n    return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n  return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n  var output = [];\n  for (var i = 0, l = value.length; i < l; ++i) {\n    if (hasOwnProperty(value, String(i))) {\n      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n          String(i), true));\n    } else {\n      output.push('');\n    }\n  }\n  keys.forEach(function(key) {\n    if (!key.match(/^\\d+$/)) {\n      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n          key, true));\n    }\n  });\n  return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n  var name, str, desc;\n  desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n  if (desc.get) {\n    if (desc.set) {\n      str = ctx.stylize('[Getter/Setter]', 'special');\n    } else {\n      str = ctx.stylize('[Getter]', 'special');\n    }\n  } else {\n    if (desc.set) {\n      str = ctx.stylize('[Setter]', 'special');\n    }\n  }\n  if (!hasOwnProperty(visibleKeys, key)) {\n    name = '[' + key + ']';\n  }\n  if (!str) {\n    if (ctx.seen.indexOf(desc.value) < 0) {\n      if (isNull(recurseTimes)) {\n        str = formatValue(ctx, desc.value, null);\n      } else {\n        str = formatValue(ctx, desc.value, recurseTimes - 1);\n      }\n      if (str.indexOf('\\n') > -1) {\n        if (array) {\n          str = str.split('\\n').map(function(line) {\n            return '  ' + line;\n          }).join('\\n').substr(2);\n        } else {\n          str = '\\n' + str.split('\\n').map(function(line) {\n            return '   ' + line;\n          }).join('\\n');\n        }\n      }\n    } else {\n      str = ctx.stylize('[Circular]', 'special');\n    }\n  }\n  if (isUndefined(name)) {\n    if (array && key.match(/^\\d+$/)) {\n      return str;\n    }\n    name = JSON.stringify('' + key);\n    if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n      name = name.substr(1, name.length - 2);\n      name = ctx.stylize(name, 'name');\n    } else {\n      name = name.replace(/'/g, \"\\\\'\")\n                 .replace(/\\\\\"/g, '\"')\n                 .replace(/(^\"|\"$)/g, \"'\");\n      name = ctx.stylize(name, 'string');\n    }\n  }\n\n  return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n  var numLinesEst = 0;\n  var length = output.reduce(function(prev, cur) {\n    numLinesEst++;\n    if (cur.indexOf('\\n') >= 0) numLinesEst++;\n    return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n  }, 0);\n\n  if (length > 60) {\n    return braces[0] +\n           (base === '' ? '' : base + '\\n ') +\n           ' ' +\n           output.join(',\\n  ') +\n           ' ' +\n           braces[1];\n  }\n\n  return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nfunction isArray(ar) {\n  return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n  return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n  return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n  return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n  return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n  return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n  return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n  return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n  return isObject(e) &&\n      (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n  return arg === null ||\n         typeof arg === 'boolean' ||\n         typeof arg === 'number' ||\n         typeof arg === 'string' ||\n         typeof arg === 'symbol' ||  // ES6 symbol\n         typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = require('./support/isBuffer');\n\nfunction objectToString(o) {\n  return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n  return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n              'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n  var d = new Date();\n  var time = [pad(d.getHours()),\n              pad(d.getMinutes()),\n              pad(d.getSeconds())].join(':');\n  return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nexports.log = function() {\n  console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n *     prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\nexports.inherits = require('inherits');\n\nexports._extend = function(origin, add) {\n  // Don't do anything if add isn't an object\n  if (!add || !isObject(add)) return origin;\n\n  var keys = Object.keys(add);\n  var i = keys.length;\n  while (i--) {\n    origin[keys[i]] = add[keys[i]];\n  }\n  return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n  return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./support/isBuffer\":65,\"_process\":51,\"inherits\":48}],67:[function(require,module,exports){\n/* See LICENSE file for terms of use */\n\n/*\n * Text diff implementation.\n *\n * This library supports the following APIS:\n * JsDiff.diffChars: Character by character diff\n * JsDiff.diffWords: Word (as defined by \\b regex) diff which ignores whitespace\n * JsDiff.diffLines: Line based diff\n *\n * JsDiff.diffCss: Diff targeted at CSS content\n *\n * These methods are based on the implementation proposed in\n * \"An O(ND) Difference Algorithm and its Variations\" (Myers, 1986).\n * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927\n */\n(function(global, undefined) {\n  var objectPrototypeToString = Object.prototype.toString;\n\n  /*istanbul ignore next*/\n  function map(arr, mapper, that) {\n    if (Array.prototype.map) {\n      return Array.prototype.map.call(arr, mapper, that);\n    }\n\n    var other = new Array(arr.length);\n\n    for (var i = 0, n = arr.length; i < n; i++) {\n      other[i] = mapper.call(that, arr[i], i, arr);\n    }\n    return other;\n  }\n  function clonePath(path) {\n    return { newPos: path.newPos, components: path.components.slice(0) };\n  }\n  function removeEmpty(array) {\n    var ret = [];\n    for (var i = 0; i < array.length; i++) {\n      if (array[i]) {\n        ret.push(array[i]);\n      }\n    }\n    return ret;\n  }\n  function escapeHTML(s) {\n    var n = s;\n    n = n.replace(/&/g, '&amp;');\n    n = n.replace(/</g, '&lt;');\n    n = n.replace(/>/g, '&gt;');\n    n = n.replace(/\"/g, '&quot;');\n\n    return n;\n  }\n\n  // This function handles the presence of circular references by bailing out when encountering an\n  // object that is already on the \"stack\" of items being processed.\n  function canonicalize(obj, stack, replacementStack) {\n    stack = stack || [];\n    replacementStack = replacementStack || [];\n\n    var i;\n\n    for (i = 0; i < stack.length; i += 1) {\n      if (stack[i] === obj) {\n        return replacementStack[i];\n      }\n    }\n\n    var canonicalizedObj;\n\n    if ('[object Array]' === objectPrototypeToString.call(obj)) {\n      stack.push(obj);\n      canonicalizedObj = new Array(obj.length);\n      replacementStack.push(canonicalizedObj);\n      for (i = 0; i < obj.length; i += 1) {\n        canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack);\n      }\n      stack.pop();\n      replacementStack.pop();\n    } else if (typeof obj === 'object' && obj !== null) {\n      stack.push(obj);\n      canonicalizedObj = {};\n      replacementStack.push(canonicalizedObj);\n      var sortedKeys = [],\n          key;\n      for (key in obj) {\n        sortedKeys.push(key);\n      }\n      sortedKeys.sort();\n      for (i = 0; i < sortedKeys.length; i += 1) {\n        key = sortedKeys[i];\n        canonicalizedObj[key] = canonicalize(obj[key], stack, replacementStack);\n      }\n      stack.pop();\n      replacementStack.pop();\n    } else {\n      canonicalizedObj = obj;\n    }\n    return canonicalizedObj;\n  }\n\n  function buildValues(components, newString, oldString, useLongestToken) {\n    var componentPos = 0,\n        componentLen = components.length,\n        newPos = 0,\n        oldPos = 0;\n\n    for (; componentPos < componentLen; componentPos++) {\n      var component = components[componentPos];\n      if (!component.removed) {\n        if (!component.added && useLongestToken) {\n          var value = newString.slice(newPos, newPos + component.count);\n          value = map(value, function(value, i) {\n            var oldValue = oldString[oldPos + i];\n            return oldValue.length > value.length ? oldValue : value;\n          });\n\n          component.value = value.join('');\n        } else {\n          component.value = newString.slice(newPos, newPos + component.count).join('');\n        }\n        newPos += component.count;\n\n        // Common case\n        if (!component.added) {\n          oldPos += component.count;\n        }\n      } else {\n        component.value = oldString.slice(oldPos, oldPos + component.count).join('');\n        oldPos += component.count;\n\n        // Reverse add and remove so removes are output first to match common convention\n        // The diffing algorithm is tied to add then remove output and this is the simplest\n        // route to get the desired output with minimal overhead.\n        if (componentPos && components[componentPos - 1].added) {\n          var tmp = components[componentPos - 1];\n          components[componentPos - 1] = components[componentPos];\n          components[componentPos] = tmp;\n        }\n      }\n    }\n\n    return components;\n  }\n\n  function Diff(ignoreWhitespace) {\n    this.ignoreWhitespace = ignoreWhitespace;\n  }\n  Diff.prototype = {\n    diff: function(oldString, newString, callback) {\n      var self = this;\n\n      function done(value) {\n        if (callback) {\n          setTimeout(function() { callback(undefined, value); }, 0);\n          return true;\n        } else {\n          return value;\n        }\n      }\n\n      // Handle the identity case (this is due to unrolling editLength == 0\n      if (newString === oldString) {\n        return done([{ value: newString }]);\n      }\n      if (!newString) {\n        return done([{ value: oldString, removed: true }]);\n      }\n      if (!oldString) {\n        return done([{ value: newString, added: true }]);\n      }\n\n      newString = this.tokenize(newString);\n      oldString = this.tokenize(oldString);\n\n      var newLen = newString.length, oldLen = oldString.length;\n      var editLength = 1;\n      var maxEditLength = newLen + oldLen;\n      var bestPath = [{ newPos: -1, components: [] }];\n\n      // Seed editLength = 0, i.e. the content starts with the same values\n      var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0);\n      if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) {\n        // Identity per the equality and tokenizer\n        return done([{value: newString.join('')}]);\n      }\n\n      // Main worker method. checks all permutations of a given edit length for acceptance.\n      function execEditLength() {\n        for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) {\n          var basePath;\n          var addPath = bestPath[diagonalPath - 1],\n              removePath = bestPath[diagonalPath + 1],\n              oldPos = (removePath ? removePath.newPos : 0) - diagonalPath;\n          if (addPath) {\n            // No one else is going to attempt to use this value, clear it\n            bestPath[diagonalPath - 1] = undefined;\n          }\n\n          var canAdd = addPath && addPath.newPos + 1 < newLen,\n              canRemove = removePath && 0 <= oldPos && oldPos < oldLen;\n          if (!canAdd && !canRemove) {\n            // If this path is a terminal then prune\n            bestPath[diagonalPath] = undefined;\n            continue;\n          }\n\n          // Select the diagonal that we want to branch from. We select the prior\n          // path whose position in the new string is the farthest from the origin\n          // and does not pass the bounds of the diff graph\n          if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) {\n            basePath = clonePath(removePath);\n            self.pushComponent(basePath.components, undefined, true);\n          } else {\n            basePath = addPath;   // No need to clone, we've pulled it from the list\n            basePath.newPos++;\n            self.pushComponent(basePath.components, true, undefined);\n          }\n\n          oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath);\n\n          // If we have hit the end of both strings, then we are done\n          if (basePath.newPos + 1 >= newLen && oldPos + 1 >= oldLen) {\n            return done(buildValues(basePath.components, newString, oldString, self.useLongestToken));\n          } else {\n            // Otherwise track this path as a potential candidate and continue.\n            bestPath[diagonalPath] = basePath;\n          }\n        }\n\n        editLength++;\n      }\n\n      // Performs the length of edit iteration. Is a bit fugly as this has to support the\n      // sync and async mode which is never fun. Loops over execEditLength until a value\n      // is produced.\n      if (callback) {\n        (function exec() {\n          setTimeout(function() {\n            // This should not happen, but we want to be safe.\n            /*istanbul ignore next */\n            if (editLength > maxEditLength) {\n              return callback();\n            }\n\n            if (!execEditLength()) {\n              exec();\n            }\n          }, 0);\n        }());\n      } else {\n        while (editLength <= maxEditLength) {\n          var ret = execEditLength();\n          if (ret) {\n            return ret;\n          }\n        }\n      }\n    },\n\n    pushComponent: function(components, added, removed) {\n      var last = components[components.length - 1];\n      if (last && last.added === added && last.removed === removed) {\n        // We need to clone here as the component clone operation is just\n        // as shallow array clone\n        components[components.length - 1] = {count: last.count + 1, added: added, removed: removed };\n      } else {\n        components.push({count: 1, added: added, removed: removed });\n      }\n    },\n    extractCommon: function(basePath, newString, oldString, diagonalPath) {\n      var newLen = newString.length,\n          oldLen = oldString.length,\n          newPos = basePath.newPos,\n          oldPos = newPos - diagonalPath,\n\n          commonCount = 0;\n      while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) {\n        newPos++;\n        oldPos++;\n        commonCount++;\n      }\n\n      if (commonCount) {\n        basePath.components.push({count: commonCount});\n      }\n\n      basePath.newPos = newPos;\n      return oldPos;\n    },\n\n    equals: function(left, right) {\n      var reWhitespace = /\\S/;\n      return left === right || (this.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right));\n    },\n    tokenize: function(value) {\n      return value.split('');\n    }\n  };\n\n  var CharDiff = new Diff();\n\n  var WordDiff = new Diff(true);\n  var WordWithSpaceDiff = new Diff();\n  WordDiff.tokenize = WordWithSpaceDiff.tokenize = function(value) {\n    return removeEmpty(value.split(/(\\s+|\\b)/));\n  };\n\n  var CssDiff = new Diff(true);\n  CssDiff.tokenize = function(value) {\n    return removeEmpty(value.split(/([{}:;,]|\\s+)/));\n  };\n\n  var LineDiff = new Diff();\n\n  var TrimmedLineDiff = new Diff();\n  TrimmedLineDiff.ignoreTrim = true;\n\n  LineDiff.tokenize = TrimmedLineDiff.tokenize = function(value) {\n    var retLines = [],\n        lines = value.split(/^/m);\n    for (var i = 0; i < lines.length; i++) {\n      var line = lines[i],\n          lastLine = lines[i - 1],\n          lastLineLastChar = lastLine && lastLine[lastLine.length - 1];\n\n      // Merge lines that may contain windows new lines\n      if (line === '\\n' && lastLineLastChar === '\\r') {\n          retLines[retLines.length - 1] = retLines[retLines.length - 1].slice(0, -1) + '\\r\\n';\n      } else {\n        if (this.ignoreTrim) {\n          line = line.trim();\n          // add a newline unless this is the last line.\n          if (i < lines.length - 1) {\n            line += '\\n';\n          }\n        }\n        retLines.push(line);\n      }\n    }\n\n    return retLines;\n  };\n\n  var PatchDiff = new Diff();\n  PatchDiff.tokenize = function(value) {\n    var ret = [],\n        linesAndNewlines = value.split(/(\\n|\\r\\n)/);\n\n    // Ignore the final empty token that occurs if the string ends with a new line\n    if (!linesAndNewlines[linesAndNewlines.length - 1]) {\n      linesAndNewlines.pop();\n    }\n\n    // Merge the content and line separators into single tokens\n    for (var i = 0; i < linesAndNewlines.length; i++) {\n      var line = linesAndNewlines[i];\n\n      if (i % 2) {\n        ret[ret.length - 1] += line;\n      } else {\n        ret.push(line);\n      }\n    }\n    return ret;\n  };\n\n  var SentenceDiff = new Diff();\n  SentenceDiff.tokenize = function(value) {\n    return removeEmpty(value.split(/(\\S.+?[.!?])(?=\\s+|$)/));\n  };\n\n  var JsonDiff = new Diff();\n  // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a\n  // dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output:\n  JsonDiff.useLongestToken = true;\n  JsonDiff.tokenize = LineDiff.tokenize;\n  JsonDiff.equals = function(left, right) {\n    return LineDiff.equals(left.replace(/,([\\r\\n])/g, '$1'), right.replace(/,([\\r\\n])/g, '$1'));\n  };\n\n  var JsDiff = {\n    Diff: Diff,\n\n    diffChars: function(oldStr, newStr, callback) { return CharDiff.diff(oldStr, newStr, callback); },\n    diffWords: function(oldStr, newStr, callback) { return WordDiff.diff(oldStr, newStr, callback); },\n    diffWordsWithSpace: function(oldStr, newStr, callback) { return WordWithSpaceDiff.diff(oldStr, newStr, callback); },\n    diffLines: function(oldStr, newStr, callback) { return LineDiff.diff(oldStr, newStr, callback); },\n    diffTrimmedLines: function(oldStr, newStr, callback) { return TrimmedLineDiff.diff(oldStr, newStr, callback); },\n\n    diffSentences: function(oldStr, newStr, callback) { return SentenceDiff.diff(oldStr, newStr, callback); },\n\n    diffCss: function(oldStr, newStr, callback) { return CssDiff.diff(oldStr, newStr, callback); },\n    diffJson: function(oldObj, newObj, callback) {\n      return JsonDiff.diff(\n        typeof oldObj === 'string' ? oldObj : JSON.stringify(canonicalize(oldObj), undefined, '  '),\n        typeof newObj === 'string' ? newObj : JSON.stringify(canonicalize(newObj), undefined, '  '),\n        callback\n      );\n    },\n\n    createTwoFilesPatch: function(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader) {\n      var ret = [];\n\n      if (oldFileName == newFileName) {\n        ret.push('Index: ' + oldFileName);\n      }\n      ret.push('===================================================================');\n      ret.push('--- ' + oldFileName + (typeof oldHeader === 'undefined' ? '' : '\\t' + oldHeader));\n      ret.push('+++ ' + newFileName + (typeof newHeader === 'undefined' ? '' : '\\t' + newHeader));\n\n      var diff = PatchDiff.diff(oldStr, newStr);\n      diff.push({value: '', lines: []});   // Append an empty value to make cleanup easier\n\n      // Formats a given set of lines for printing as context lines in a patch\n      function contextLines(lines) {\n        return map(lines, function(entry) { return ' ' + entry; });\n      }\n\n      // Outputs the no newline at end of file warning if needed\n      function eofNL(curRange, i, current) {\n        var last = diff[diff.length - 2],\n            isLast = i === diff.length - 2,\n            isLastOfType = i === diff.length - 3 && current.added !== last.added;\n\n        // Figure out if this is the last line for the given file and missing NL\n        if (!(/\\n$/.test(current.value)) && (isLast || isLastOfType)) {\n          curRange.push('\\\\ No newline at end of file');\n        }\n      }\n\n      var oldRangeStart = 0, newRangeStart = 0, curRange = [],\n          oldLine = 1, newLine = 1;\n      for (var i = 0; i < diff.length; i++) {\n        var current = diff[i],\n            lines = current.lines || current.value.replace(/\\n$/, '').split('\\n');\n        current.lines = lines;\n\n        if (current.added || current.removed) {\n          // If we have previous context, start with that\n          if (!oldRangeStart) {\n            var prev = diff[i - 1];\n            oldRangeStart = oldLine;\n            newRangeStart = newLine;\n\n            if (prev) {\n              curRange = contextLines(prev.lines.slice(-4));\n              oldRangeStart -= curRange.length;\n              newRangeStart -= curRange.length;\n            }\n          }\n\n          // Output our changes\n          curRange.push.apply(curRange, map(lines, function(entry) {\n            return (current.added ? '+' : '-') + entry;\n          }));\n          eofNL(curRange, i, current);\n\n          // Track the updated file position\n          if (current.added) {\n            newLine += lines.length;\n          } else {\n            oldLine += lines.length;\n          }\n        } else {\n          // Identical context lines. Track line changes\n          if (oldRangeStart) {\n            // Close out any changes that have been output (or join overlapping)\n            if (lines.length <= 8 && i < diff.length - 2) {\n              // Overlapping\n              curRange.push.apply(curRange, contextLines(lines));\n            } else {\n              // end the range and output\n              var contextSize = Math.min(lines.length, 4);\n              ret.push(\n                  '@@ -' + oldRangeStart + ',' + (oldLine - oldRangeStart + contextSize)\n                  + ' +' + newRangeStart + ',' + (newLine - newRangeStart + contextSize)\n                  + ' @@');\n              ret.push.apply(ret, curRange);\n              ret.push.apply(ret, contextLines(lines.slice(0, contextSize)));\n              if (lines.length <= 4) {\n                eofNL(ret, i, current);\n              }\n\n              oldRangeStart = 0;\n              newRangeStart = 0;\n              curRange = [];\n            }\n          }\n          oldLine += lines.length;\n          newLine += lines.length;\n        }\n      }\n\n      return ret.join('\\n') + '\\n';\n    },\n\n    createPatch: function(fileName, oldStr, newStr, oldHeader, newHeader) {\n      return JsDiff.createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader);\n    },\n\n    applyPatch: function(oldStr, uniDiff) {\n      var diffstr = uniDiff.split('\\n'),\n          hunks = [],\n          i = 0,\n          remEOFNL = false,\n          addEOFNL = false;\n\n      // Skip to the first change hunk\n      while (i < diffstr.length && !(/^@@/.test(diffstr[i]))) {\n        i++;\n      }\n\n      // Parse the unified diff\n      for (; i < diffstr.length; i++) {\n        if (diffstr[i][0] === '@') {\n          var chnukHeader = diffstr[i].split(/@@ -(\\d+),(\\d+) \\+(\\d+),(\\d+) @@/);\n          hunks.unshift({\n            start: chnukHeader[3],\n            oldlength: +chnukHeader[2],\n            removed: [],\n            newlength: chnukHeader[4],\n            added: []\n          });\n        } else if (diffstr[i][0] === '+') {\n          hunks[0].added.push(diffstr[i].substr(1));\n        } else if (diffstr[i][0] === '-') {\n          hunks[0].removed.push(diffstr[i].substr(1));\n        } else if (diffstr[i][0] === ' ') {\n          hunks[0].added.push(diffstr[i].substr(1));\n          hunks[0].removed.push(diffstr[i].substr(1));\n        } else if (diffstr[i][0] === '\\\\') {\n          if (diffstr[i - 1][0] === '+') {\n            remEOFNL = true;\n          } else if (diffstr[i - 1][0] === '-') {\n            addEOFNL = true;\n          }\n        }\n      }\n\n      // Apply the diff to the input\n      var lines = oldStr.split('\\n');\n      for (i = hunks.length - 1; i >= 0; i--) {\n        var hunk = hunks[i];\n        // Sanity check the input string. Bail if we don't match.\n        for (var j = 0; j < hunk.oldlength; j++) {\n          if (lines[hunk.start - 1 + j] !== hunk.removed[j]) {\n            return false;\n          }\n        }\n        Array.prototype.splice.apply(lines, [hunk.start - 1, hunk.oldlength].concat(hunk.added));\n      }\n\n      // Handle EOFNL insertion/removal\n      if (remEOFNL) {\n        while (!lines[lines.length - 1]) {\n          lines.pop();\n        }\n      } else if (addEOFNL) {\n        lines.push('');\n      }\n      return lines.join('\\n');\n    },\n\n    convertChangesToXML: function(changes) {\n      var ret = [];\n      for (var i = 0; i < changes.length; i++) {\n        var change = changes[i];\n        if (change.added) {\n          ret.push('<ins>');\n        } else if (change.removed) {\n          ret.push('<del>');\n        }\n\n        ret.push(escapeHTML(change.value));\n\n        if (change.added) {\n          ret.push('</ins>');\n        } else if (change.removed) {\n          ret.push('</del>');\n        }\n      }\n      return ret.join('');\n    },\n\n    // See: http://code.google.com/p/google-diff-match-patch/wiki/API\n    convertChangesToDMP: function(changes) {\n      var ret = [],\n          change,\n          operation;\n      for (var i = 0; i < changes.length; i++) {\n        change = changes[i];\n        if (change.added) {\n          operation = 1;\n        } else if (change.removed) {\n          operation = -1;\n        } else {\n          operation = 0;\n        }\n\n        ret.push([operation, change.value]);\n      }\n      return ret;\n    },\n\n    canonicalize: canonicalize\n  };\n\n  /*istanbul ignore next */\n  /*global module */\n  if (typeof module !== 'undefined' && module.exports) {\n    module.exports = JsDiff;\n  } else if (typeof define === 'function' && define.amd) {\n    /*global define */\n    define([], function() { return JsDiff; });\n  } else if (typeof global.JsDiff === 'undefined') {\n    global.JsDiff = JsDiff;\n  }\n}(this));\n\n},{}],68:[function(require,module,exports){\n'use strict';\n\nvar matchOperatorsRe = /[|\\\\{}()[\\]^$+*?.]/g;\n\nmodule.exports = function (str) {\n\tif (typeof str !== 'string') {\n\t\tthrow new TypeError('Expected a string');\n\t}\n\n\treturn str.replace(matchOperatorsRe,  '\\\\$&');\n};\n\n},{}],69:[function(require,module,exports){\n(function (process){\n// Growl - Copyright TJ Holowaychuk <tj@vision-media.ca> (MIT Licensed)\n\n/**\n * Module dependencies.\n */\n\nvar exec = require('child_process').exec\n  , fs = require('fs')\n  , path = require('path')\n  , exists = fs.existsSync || path.existsSync\n  , os = require('os')\n  , quote = JSON.stringify\n  , cmd;\n\nfunction which(name) {\n  var paths = process.env.PATH.split(':');\n  var loc;\n  \n  for (var i = 0, len = paths.length; i < len; ++i) {\n    loc = path.join(paths[i], name);\n    if (exists(loc)) return loc;\n  }\n}\n\nswitch(os.type()) {\n  case 'Darwin':\n    if (which('terminal-notifier')) {\n      cmd = {\n          type: \"Darwin-NotificationCenter\"\n        , pkg: \"terminal-notifier\"\n        , msg: '-message'\n        , title: '-title'\n        , subtitle: '-subtitle'\n        , priority: {\n              cmd: '-execute'\n            , range: []\n          }\n      };\n    } else {\n      cmd = {\n          type: \"Darwin-Growl\"\n        , pkg: \"growlnotify\"\n        , msg: '-m'\n        , sticky: '--sticky'\n        , priority: {\n              cmd: '--priority'\n            , range: [\n                -2\n              , -1\n              , 0\n              , 1\n              , 2\n              , \"Very Low\"\n              , \"Moderate\"\n              , \"Normal\"\n              , \"High\"\n              , \"Emergency\"\n            ]\n          }\n      };\n    }\n    break;\n  case 'Linux':\n    cmd = {\n        type: \"Linux\"\n      , pkg: \"notify-send\"\n      , msg: ''\n      , sticky: '-t 0'\n      , icon: '-i'\n      , priority: {\n          cmd: '-u'\n        , range: [\n            \"low\"\n          , \"normal\"\n          , \"critical\"\n        ]\n      }\n    };\n    break;\n  case 'Windows_NT':\n    cmd = {\n        type: \"Windows\"\n      , pkg: \"growlnotify\"\n      , msg: ''\n      , sticky: '/s:true'\n      , title: '/t:'\n      , icon: '/i:'\n      , priority: {\n            cmd: '/p:'\n          , range: [\n              -2\n            , -1\n            , 0\n            , 1\n            , 2\n          ]\n        }\n    };\n    break;\n}\n\n/**\n * Expose `growl`.\n */\n\nexports = module.exports = growl;\n\n/**\n * Node-growl version.\n */\n\nexports.version = '1.4.1'\n\n/**\n * Send growl notification _msg_ with _options_.\n *\n * Options:\n *\n *  - title   Notification title\n *  - sticky  Make the notification stick (defaults to false)\n *  - priority  Specify an int or named key (default is 0)\n *  - name    Application name (defaults to growlnotify)\n *  - image\n *    - path to an icon sets --iconpath\n *    - path to an image sets --image\n *    - capitalized word sets --appIcon\n *    - filename uses extname as --icon\n *    - otherwise treated as --icon\n *\n * Examples:\n *\n *   growl('New email')\n *   growl('5 new emails', { title: 'Thunderbird' })\n *   growl('Email sent', function(){\n *     // ... notification sent\n *   })\n *\n * @param {string} msg\n * @param {object} options\n * @param {function} fn\n * @api public\n */\n\nfunction growl(msg, options, fn) {\n  var image\n    , args\n    , options = options || {}\n    , fn = fn || function(){};\n\n  // noop\n  if (!cmd) return fn(new Error('growl not supported on this platform'));\n  args = [cmd.pkg];\n\n  // image\n  if (image = options.image) {\n    switch(cmd.type) {\n      case 'Darwin-Growl':\n        var flag, ext = path.extname(image).substr(1)\n        flag = flag || ext == 'icns' && 'iconpath'\n        flag = flag || /^[A-Z]/.test(image) && 'appIcon'\n        flag = flag || /^png|gif|jpe?g$/.test(ext) && 'image'\n        flag = flag || ext && (image = ext) && 'icon'\n        flag = flag || 'icon'\n        args.push('--' + flag, quote(image))\n        break;\n      case 'Linux':\n        args.push(cmd.icon, quote(image));\n        // libnotify defaults to sticky, set a hint for transient notifications\n        if (!options.sticky) args.push('--hint=int:transient:1');\n        break;\n      case 'Windows':\n        args.push(cmd.icon + quote(image));\n        break;\n    }\n  }\n\n  // sticky\n  if (options.sticky) args.push(cmd.sticky);\n\n  // priority\n  if (options.priority) {\n    var priority = options.priority + '';\n    var checkindexOf = cmd.priority.range.indexOf(priority);\n    if (~cmd.priority.range.indexOf(priority)) {\n      args.push(cmd.priority, options.priority);\n    }\n  }\n\n  // name\n  if (options.name && cmd.type === \"Darwin-Growl\") {\n    args.push('--name', options.name);\n  }\n\n  switch(cmd.type) {\n    case 'Darwin-Growl':\n      args.push(cmd.msg);\n      args.push(quote(msg));\n      if (options.title) args.push(quote(options.title));\n      break;\n    case 'Darwin-NotificationCenter':\n      args.push(cmd.msg);\n      args.push(quote(msg));\n      if (options.title) {\n        args.push(cmd.title);\n        args.push(quote(options.title));\n      }\n      if (options.subtitle) {\n        args.push(cmd.subtitle);\n        args.push(quote(options.subtitle));\n      }\n      break;\n    case 'Darwin-Growl':\n      args.push(cmd.msg);\n      args.push(quote(msg));\n      if (options.title) args.push(quote(options.title));\n      break;\n    case 'Linux':\n      if (options.title) {\n        args.push(quote(options.title));\n        args.push(cmd.msg);\n        args.push(quote(msg));\n      } else {\n        args.push(quote(msg));\n      }\n      break;\n    case 'Windows':\n      args.push(quote(msg));\n      if (options.title) args.push(cmd.title + quote(options.title));\n      break;\n  }\n\n  // execute\n  exec(args.join(' '), fn);\n};\n\n}).call(this,require('_process'))\n},{\"_process\":51,\"child_process\":41,\"fs\":41,\"os\":50,\"path\":41}],70:[function(require,module,exports){\n(function (process,global){\n/**\n * Shim process.stdout.\n */\n\nprocess.stdout = require('browser-stdout')();\n\nvar Mocha = require('../');\n\n/**\n * Create a Mocha instance.\n *\n * @return {undefined}\n */\n\nvar mocha = new Mocha({ reporter: 'html' });\n\n/**\n * Save timer references to avoid Sinon interfering (see GH-237).\n */\n\nvar Date = global.Date;\nvar setTimeout = global.setTimeout;\nvar setInterval = global.setInterval;\nvar clearTimeout = global.clearTimeout;\nvar clearInterval = global.clearInterval;\n\nvar uncaughtExceptionHandlers = [];\n\nvar originalOnerrorHandler = global.onerror;\n\n/**\n * Remove uncaughtException listener.\n * Revert to original onerror handler if previously defined.\n */\n\nprocess.removeListener = function(e, fn){\n  if ('uncaughtException' == e) {\n    if (originalOnerrorHandler) {\n      global.onerror = originalOnerrorHandler;\n    } else {\n      global.onerror = function() {};\n    }\n    var i = Mocha.utils.indexOf(uncaughtExceptionHandlers, fn);\n    if (i != -1) { uncaughtExceptionHandlers.splice(i, 1); }\n  }\n};\n\n/**\n * Implements uncaughtException listener.\n */\n\nprocess.on = function(e, fn){\n  if ('uncaughtException' == e) {\n    global.onerror = function(err, url, line){\n      fn(new Error(err + ' (' + url + ':' + line + ')'));\n      return !mocha.allowUncaught;\n    };\n    uncaughtExceptionHandlers.push(fn);\n  }\n};\n\n// The BDD UI is registered by default, but no UI will be functional in the\n// browser without an explicit call to the overridden `mocha.ui` (see below).\n// Ensure that this default UI does not expose its methods to the global scope.\nmocha.suite.removeAllListeners('pre-require');\n\nvar immediateQueue = []\n  , immediateTimeout;\n\nfunction timeslice() {\n  var immediateStart = new Date().getTime();\n  while (immediateQueue.length && (new Date().getTime() - immediateStart) < 100) {\n    immediateQueue.shift()();\n  }\n  if (immediateQueue.length) {\n    immediateTimeout = setTimeout(timeslice, 0);\n  } else {\n    immediateTimeout = null;\n  }\n}\n\n/**\n * High-performance override of Runner.immediately.\n */\n\nMocha.Runner.immediately = function(callback) {\n  immediateQueue.push(callback);\n  if (!immediateTimeout) {\n    immediateTimeout = setTimeout(timeslice, 0);\n  }\n};\n\n/**\n * Function to allow assertion libraries to throw errors directly into mocha.\n * This is useful when running tests in a browser because window.onerror will\n * only receive the 'message' attribute of the Error.\n */\nmocha.throwError = function(err) {\n  Mocha.utils.forEach(uncaughtExceptionHandlers, function (fn) {\n    fn(err);\n  });\n  throw err;\n};\n\n/**\n * Override ui to ensure that the ui functions are initialized.\n * Normally this would happen in Mocha.prototype.loadFiles.\n */\n\nmocha.ui = function(ui){\n  Mocha.prototype.ui.call(this, ui);\n  this.suite.emit('pre-require', global, null, this);\n  return this;\n};\n\n/**\n * Setup mocha with the given setting options.\n */\n\nmocha.setup = function(opts){\n  if ('string' == typeof opts) opts = { ui: opts };\n  for (var opt in opts) this[opt](opts[opt]);\n  return this;\n};\n\n/**\n * Run mocha, returning the Runner.\n */\n\nmocha.run = function(fn){\n  var options = mocha.options;\n  mocha.globals('location');\n\n  var query = Mocha.utils.parseQuery(global.location.search || '');\n  if (query.grep) mocha.grep(new RegExp(query.grep));\n  if (query.fgrep) mocha.grep(query.fgrep);\n  if (query.invert) mocha.invert();\n\n  return Mocha.prototype.run.call(mocha, function(err){\n    // The DOM Document is not available in Web Workers.\n    var document = global.document;\n    if (document && document.getElementById('mocha') && options.noHighlighting !== true) {\n      Mocha.utils.highlightTags('code');\n    }\n    if (fn) fn(err);\n  });\n};\n\n/**\n * Expose the process shim.\n * https://github.com/mochajs/mocha/pull/916\n */\n\nMocha.process = process;\n\n/**\n * Expose mocha.\n */\n\nwindow.Mocha = Mocha;\nwindow.mocha = mocha;\n\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"../\":1,\"_process\":51,\"browser-stdout\":40}]},{},[70]);\n"
  },
  {
    "path": "bower_components/mocha/scripts/ensure-compatible-npm.sh",
    "content": "#!/usr/bin/env sh\n\nset -o nounset\nset -o errexit\n\nnpm install semver\nif node -e \"process.exit(require('semver').lt(process.argv[1], '1.3.7') ? 0 : 1)\" $(npm -v); then\n  npm install -g npm@2\n  npm install -g npm\nfi\nnpm uninstall semver\n"
  },
  {
    "path": "bower_components/sinonjs/.bower.json",
    "content": "{\n  \"name\": \"sinonjs\",\n  \"version\": \"1.7.3\",\n  \"main\": \"sinon.js\",\n  \"ignore\": [\n    \"**/.*\",\n    \"node_modules\",\n    \"components\"\n  ],\n  \"homepage\": \"https://github.com/blittle/sinon.js\",\n  \"_release\": \"1.7.3\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"v1.7.3\",\n    \"commit\": \"b8d03cd2239f5aa92bba05278c4edfde34b35d1a\"\n  },\n  \"_source\": \"git://github.com/blittle/sinon.js.git\",\n  \"_target\": \"~1.7.3\",\n  \"_originalSource\": \"sinonjs\"\n}"
  },
  {
    "path": "bower_components/sinonjs/README.md",
    "content": "sinon.js\n========\n\nSinonJS proxy repository for the BowerJS package manager\n\nInstall with: `bower install sinon.js`\n\nFor more information on SinonJS: https://github.com/cjohansen/Sinon.JS \n"
  },
  {
    "path": "bower_components/sinonjs/bower.json",
    "content": "{\n  \"name\": \"sinonjs\",\n  \"version\": \"1.7.3\",\n  \"main\": \"sinon.js\",\n  \"ignore\": [\n    \"**/.*\",\n    \"node_modules\",\n    \"components\"\n  ]\n}\n"
  },
  {
    "path": "bower_components/sinonjs/sinon.js",
    "content": "/**\n * Sinon.JS 1.7.3, 2013/06/20\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS\n *\n * (The BSD License)\n * \n * Copyright (c) 2010-2013, Christian Johansen, christian@cjohansen.no\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * \n *     * Redistributions of source code must retain the above copyright notice,\n *       this list of conditions and the following disclaimer.\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 *     * Neither the name of Christian Johansen nor the names of his contributors\n *       may be used to endorse or promote products derived from this software\n *       without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nthis.sinon = (function () {\nvar buster = (function (setTimeout, B) {\n    var isNode = typeof require == \"function\" && typeof module == \"object\";\n    var div = typeof document != \"undefined\" && document.createElement(\"div\");\n    var F = function () {};\n\n    var buster = {\n        bind: function bind(obj, methOrProp) {\n            var method = typeof methOrProp == \"string\" ? obj[methOrProp] : methOrProp;\n            var args = Array.prototype.slice.call(arguments, 2);\n            return function () {\n                var allArgs = args.concat(Array.prototype.slice.call(arguments));\n                return method.apply(obj, allArgs);\n            };\n        },\n\n        partial: function partial(fn) {\n            var args = [].slice.call(arguments, 1);\n            return function () {\n                return fn.apply(this, args.concat([].slice.call(arguments)));\n            };\n        },\n\n        create: function create(object) {\n            F.prototype = object;\n            return new F();\n        },\n\n        extend: function extend(target) {\n            if (!target) { return; }\n            for (var i = 1, l = arguments.length, prop; i < l; ++i) {\n                for (prop in arguments[i]) {\n                    target[prop] = arguments[i][prop];\n                }\n            }\n            return target;\n        },\n\n        nextTick: function nextTick(callback) {\n            if (typeof process != \"undefined\" && process.nextTick) {\n                return process.nextTick(callback);\n            }\n            setTimeout(callback, 0);\n        },\n\n        functionName: function functionName(func) {\n            if (!func) return \"\";\n            if (func.displayName) return func.displayName;\n            if (func.name) return func.name;\n            var matches = func.toString().match(/function\\s+([^\\(]+)/m);\n            return matches && matches[1] || \"\";\n        },\n\n        isNode: function isNode(obj) {\n            if (!div) return false;\n            try {\n                obj.appendChild(div);\n                obj.removeChild(div);\n            } catch (e) {\n                return false;\n            }\n            return true;\n        },\n\n        isElement: function isElement(obj) {\n            return obj && obj.nodeType === 1 && buster.isNode(obj);\n        },\n\n        isArray: function isArray(arr) {\n            return Object.prototype.toString.call(arr) == \"[object Array]\";\n        },\n\n        flatten: function flatten(arr) {\n            var result = [], arr = arr || [];\n            for (var i = 0, l = arr.length; i < l; ++i) {\n                result = result.concat(buster.isArray(arr[i]) ? flatten(arr[i]) : arr[i]);\n            }\n            return result;\n        },\n\n        each: function each(arr, callback) {\n            for (var i = 0, l = arr.length; i < l; ++i) {\n                callback(arr[i]);\n            }\n        },\n\n        map: function map(arr, callback) {\n            var results = [];\n            for (var i = 0, l = arr.length; i < l; ++i) {\n                results.push(callback(arr[i]));\n            }\n            return results;\n        },\n\n        parallel: function parallel(fns, callback) {\n            function cb(err, res) {\n                if (typeof callback == \"function\") {\n                    callback(err, res);\n                    callback = null;\n                }\n            }\n            if (fns.length == 0) { return cb(null, []); }\n            var remaining = fns.length, results = [];\n            function makeDone(num) {\n                return function done(err, result) {\n                    if (err) { return cb(err); }\n                    results[num] = result;\n                    if (--remaining == 0) { cb(null, results); }\n                };\n            }\n            for (var i = 0, l = fns.length; i < l; ++i) {\n                fns[i](makeDone(i));\n            }\n        },\n\n        series: function series(fns, callback) {\n            function cb(err, res) {\n                if (typeof callback == \"function\") {\n                    callback(err, res);\n                }\n            }\n            var remaining = fns.slice();\n            var results = [];\n            function callNext() {\n                if (remaining.length == 0) return cb(null, results);\n                var promise = remaining.shift()(next);\n                if (promise && typeof promise.then == \"function\") {\n                    promise.then(buster.partial(next, null), next);\n                }\n            }\n            function next(err, result) {\n                if (err) return cb(err);\n                results.push(result);\n                callNext();\n            }\n            callNext();\n        },\n\n        countdown: function countdown(num, done) {\n            return function () {\n                if (--num == 0) done();\n            };\n        }\n    };\n\n    if (typeof process === \"object\" &&\n        typeof require === \"function\" && typeof module === \"object\") {\n        var crypto = require(\"crypto\");\n        var path = require(\"path\");\n\n        buster.tmpFile = function (fileName) {\n            var hashed = crypto.createHash(\"sha1\");\n            hashed.update(fileName);\n            var tmpfileName = hashed.digest(\"hex\");\n\n            if (process.platform == \"win32\") {\n                return path.join(process.env[\"TEMP\"], tmpfileName);\n            } else {\n                return path.join(\"/tmp\", tmpfileName);\n            }\n        };\n    }\n\n    if (Array.prototype.some) {\n        buster.some = function (arr, fn, thisp) {\n            return arr.some(fn, thisp);\n        };\n    } else {\n        // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some\n        buster.some = function (arr, fun, thisp) {\n                        if (arr == null) { throw new TypeError(); }\n            arr = Object(arr);\n            var len = arr.length >>> 0;\n            if (typeof fun !== \"function\") { throw new TypeError(); }\n\n            for (var i = 0; i < len; i++) {\n                if (arr.hasOwnProperty(i) && fun.call(thisp, arr[i], i, arr)) {\n                    return true;\n                }\n            }\n\n            return false;\n        };\n    }\n\n    if (Array.prototype.filter) {\n        buster.filter = function (arr, fn, thisp) {\n            return arr.filter(fn, thisp);\n        };\n    } else {\n        // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/filter\n        buster.filter = function (fn, thisp) {\n                        if (this == null) { throw new TypeError(); }\n\n            var t = Object(this);\n            var len = t.length >>> 0;\n            if (typeof fn != \"function\") { throw new TypeError(); }\n\n            var res = [];\n            for (var i = 0; i < len; i++) {\n                if (i in t) {\n                    var val = t[i]; // in case fun mutates this\n                    if (fn.call(thisp, val, i, t)) { res.push(val); }\n                }\n            }\n\n            return res;\n        };\n    }\n\n    if (isNode) {\n        module.exports = buster;\n        buster.eventEmitter = require(\"./buster-event-emitter\");\n        Object.defineProperty(buster, \"defineVersionGetter\", {\n            get: function () {\n                return require(\"./define-version-getter\");\n            }\n        });\n    }\n\n    return buster.extend(B || {}, buster);\n}(setTimeout, buster));\nif (typeof buster === \"undefined\") {\n    var buster = {};\n}\n\nif (typeof module === \"object\" && typeof require === \"function\") {\n    buster = require(\"buster-core\");\n}\n\nbuster.format = buster.format || {};\nbuster.format.excludeConstructors = [\"Object\", /^.$/];\nbuster.format.quoteStrings = true;\n\nbuster.format.ascii = (function () {\n    \n    var hasOwn = Object.prototype.hasOwnProperty;\n\n    var specialObjects = [];\n    if (typeof global != \"undefined\") {\n        specialObjects.push({ obj: global, value: \"[object global]\" });\n    }\n    if (typeof document != \"undefined\") {\n        specialObjects.push({ obj: document, value: \"[object HTMLDocument]\" });\n    }\n    if (typeof window != \"undefined\") {\n        specialObjects.push({ obj: window, value: \"[object Window]\" });\n    }\n\n    function keys(object) {\n        var k = Object.keys && Object.keys(object) || [];\n\n        if (k.length == 0) {\n            for (var prop in object) {\n                if (hasOwn.call(object, prop)) {\n                    k.push(prop);\n                }\n            }\n        }\n\n        return k.sort();\n    }\n\n    function isCircular(object, objects) {\n        if (typeof object != \"object\") {\n            return false;\n        }\n\n        for (var i = 0, l = objects.length; i < l; ++i) {\n            if (objects[i] === object) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    function ascii(object, processed, indent) {\n        if (typeof object == \"string\") {\n            var quote = typeof this.quoteStrings != \"boolean\" || this.quoteStrings;\n            return processed || quote ? '\"' + object + '\"' : object;\n        }\n\n        if (typeof object == \"function\" && !(object instanceof RegExp)) {\n            return ascii.func(object);\n        }\n\n        processed = processed || [];\n\n        if (isCircular(object, processed)) {\n            return \"[Circular]\";\n        }\n\n        if (Object.prototype.toString.call(object) == \"[object Array]\") {\n            return ascii.array.call(this, object, processed);\n        }\n\n        if (!object) {\n            return \"\" + object;\n        }\n\n        if (buster.isElement(object)) {\n            return ascii.element(object);\n        }\n\n        if (typeof object.toString == \"function\" &&\n            object.toString !== Object.prototype.toString) {\n            return object.toString();\n        }\n\n        for (var i = 0, l = specialObjects.length; i < l; i++) {\n            if (object === specialObjects[i].obj) {\n                return specialObjects[i].value;\n            }\n        }\n\n        return ascii.object.call(this, object, processed, indent);\n    }\n\n    ascii.func = function (func) {\n        return \"function \" + buster.functionName(func) + \"() {}\";\n    };\n\n    ascii.array = function (array, processed) {\n        processed = processed || [];\n        processed.push(array);\n        var pieces = [];\n\n        for (var i = 0, l = array.length; i < l; ++i) {\n            pieces.push(ascii.call(this, array[i], processed));\n        }\n\n        return \"[\" + pieces.join(\", \") + \"]\";\n    };\n\n    ascii.object = function (object, processed, indent) {\n        processed = processed || [];\n        processed.push(object);\n        indent = indent || 0;\n        var pieces = [], properties = keys(object), prop, str, obj;\n        var is = \"\";\n        var length = 3;\n\n        for (var i = 0, l = indent; i < l; ++i) {\n            is += \" \";\n        }\n\n        for (i = 0, l = properties.length; i < l; ++i) {\n            prop = properties[i];\n            obj = object[prop];\n\n            if (isCircular(obj, processed)) {\n                str = \"[Circular]\";\n            } else {\n                str = ascii.call(this, obj, processed, indent + 2);\n            }\n\n            str = (/\\s/.test(prop) ? '\"' + prop + '\"' : prop) + \": \" + str;\n            length += str.length;\n            pieces.push(str);\n        }\n\n        var cons = ascii.constructorName.call(this, object);\n        var prefix = cons ? \"[\" + cons + \"] \" : \"\"\n\n        return (length + indent) > 80 ?\n            prefix + \"{\\n  \" + is + pieces.join(\",\\n  \" + is) + \"\\n\" + is + \"}\" :\n            prefix + \"{ \" + pieces.join(\", \") + \" }\";\n    };\n\n    ascii.element = function (element) {\n        var tagName = element.tagName.toLowerCase();\n        var attrs = element.attributes, attribute, pairs = [], attrName;\n\n        for (var i = 0, l = attrs.length; i < l; ++i) {\n            attribute = attrs.item(i);\n            attrName = attribute.nodeName.toLowerCase().replace(\"html:\", \"\");\n\n            if (attrName == \"contenteditable\" && attribute.nodeValue == \"inherit\") {\n                continue;\n            }\n\n            if (!!attribute.nodeValue) {\n                pairs.push(attrName + \"=\\\"\" + attribute.nodeValue + \"\\\"\");\n            }\n        }\n\n        var formatted = \"<\" + tagName + (pairs.length > 0 ? \" \" : \"\");\n        var content = element.innerHTML;\n\n        if (content.length > 20) {\n            content = content.substr(0, 20) + \"[...]\";\n        }\n\n        var res = formatted + pairs.join(\" \") + \">\" + content + \"</\" + tagName + \">\";\n\n        return res.replace(/ contentEditable=\"inherit\"/, \"\");\n    };\n\n    ascii.constructorName = function (object) {\n        var name = buster.functionName(object && object.constructor);\n        var excludes = this.excludeConstructors || buster.format.excludeConstructors || [];\n\n        for (var i = 0, l = excludes.length; i < l; ++i) {\n            if (typeof excludes[i] == \"string\" && excludes[i] == name) {\n                return \"\";\n            } else if (excludes[i].test && excludes[i].test(name)) {\n                return \"\";\n            }\n        }\n\n        return name;\n    };\n\n    return ascii;\n}());\n\nif (typeof module != \"undefined\") {\n    module.exports = buster.format;\n}\n/*jslint eqeqeq: false, onevar: false, forin: true, nomen: false, regexp: false, plusplus: false*/\n/*global module, require, __dirname, document*/\n/**\n * Sinon core utilities. For internal use only.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\nvar sinon = (function (buster) {\n    var div = typeof document != \"undefined\" && document.createElement(\"div\");\n    var hasOwn = Object.prototype.hasOwnProperty;\n\n    function isDOMNode(obj) {\n        var success = false;\n\n        try {\n            obj.appendChild(div);\n            success = div.parentNode == obj;\n        } catch (e) {\n            return false;\n        } finally {\n            try {\n                obj.removeChild(div);\n            } catch (e) {\n                // Remove failed, not much we can do about that\n            }\n        }\n\n        return success;\n    }\n\n    function isElement(obj) {\n        return div && obj && obj.nodeType === 1 && isDOMNode(obj);\n    }\n\n    function isFunction(obj) {\n        return typeof obj === \"function\" || !!(obj && obj.constructor && obj.call && obj.apply);\n    }\n\n    function mirrorProperties(target, source) {\n        for (var prop in source) {\n            if (!hasOwn.call(target, prop)) {\n                target[prop] = source[prop];\n            }\n        }\n    }\n\n    function isRestorable (obj) {\n        return typeof obj === \"function\" && typeof obj.restore === \"function\" && obj.restore.sinon;\n    }\n\n    var sinon = {\n        wrapMethod: function wrapMethod(object, property, method) {\n            if (!object) {\n                throw new TypeError(\"Should wrap property of object\");\n            }\n\n            if (typeof method != \"function\") {\n                throw new TypeError(\"Method wrapper should be function\");\n            }\n\n            var wrappedMethod = object[property];\n\n            if (!isFunction(wrappedMethod)) {\n                throw new TypeError(\"Attempted to wrap \" + (typeof wrappedMethod) + \" property \" +\n                                    property + \" as function\");\n            }\n\n            if (wrappedMethod.restore && wrappedMethod.restore.sinon) {\n                throw new TypeError(\"Attempted to wrap \" + property + \" which is already wrapped\");\n            }\n\n            if (wrappedMethod.calledBefore) {\n                var verb = !!wrappedMethod.returns ? \"stubbed\" : \"spied on\";\n                throw new TypeError(\"Attempted to wrap \" + property + \" which is already \" + verb);\n            }\n\n            // IE 8 does not support hasOwnProperty on the window object.\n            var owned = hasOwn.call(object, property);\n            object[property] = method;\n            method.displayName = property;\n\n            method.restore = function () {\n                // For prototype properties try to reset by delete first.\n                // If this fails (ex: localStorage on mobile safari) then force a reset\n                // via direct assignment.\n                if (!owned) {\n                    delete object[property];\n                }\n                if (object[property] === method) {\n                    object[property] = wrappedMethod;\n                }\n            };\n\n            method.restore.sinon = true;\n            mirrorProperties(method, wrappedMethod);\n\n            return method;\n        },\n\n        extend: function extend(target) {\n            for (var i = 1, l = arguments.length; i < l; i += 1) {\n                for (var prop in arguments[i]) {\n                    if (arguments[i].hasOwnProperty(prop)) {\n                        target[prop] = arguments[i][prop];\n                    }\n\n                    // DONT ENUM bug, only care about toString\n                    if (arguments[i].hasOwnProperty(\"toString\") &&\n                        arguments[i].toString != target.toString) {\n                        target.toString = arguments[i].toString;\n                    }\n                }\n            }\n\n            return target;\n        },\n\n        create: function create(proto) {\n            var F = function () {};\n            F.prototype = proto;\n            return new F();\n        },\n\n        deepEqual: function deepEqual(a, b) {\n            if (sinon.match && sinon.match.isMatcher(a)) {\n                return a.test(b);\n            }\n            if (typeof a != \"object\" || typeof b != \"object\") {\n                return a === b;\n            }\n\n            if (isElement(a) || isElement(b)) {\n                return a === b;\n            }\n\n            if (a === b) {\n                return true;\n            }\n\n            if ((a === null && b !== null) || (a !== null && b === null)) {\n                return false;\n            }\n\n            var aString = Object.prototype.toString.call(a);\n            if (aString != Object.prototype.toString.call(b)) {\n                return false;\n            }\n\n            if (aString == \"[object Array]\") {\n                if (a.length !== b.length) {\n                    return false;\n                }\n\n                for (var i = 0, l = a.length; i < l; i += 1) {\n                    if (!deepEqual(a[i], b[i])) {\n                        return false;\n                    }\n                }\n\n                return true;\n            }\n\n            if (aString == \"[object Date]\") {\n                return a.valueOf() === b.valueOf();\n            }\n\n            var prop, aLength = 0, bLength = 0;\n\n            for (prop in a) {\n                aLength += 1;\n\n                if (!deepEqual(a[prop], b[prop])) {\n                    return false;\n                }\n            }\n\n            for (prop in b) {\n                bLength += 1;\n            }\n\n            return aLength == bLength;\n        },\n\n        functionName: function functionName(func) {\n            var name = func.displayName || func.name;\n\n            // Use function decomposition as a last resort to get function\n            // name. Does not rely on function decomposition to work - if it\n            // doesn't debugging will be slightly less informative\n            // (i.e. toString will say 'spy' rather than 'myFunc').\n            if (!name) {\n                var matches = func.toString().match(/function ([^\\s\\(]+)/);\n                name = matches && matches[1];\n            }\n\n            return name;\n        },\n\n        functionToString: function toString() {\n            if (this.getCall && this.callCount) {\n                var thisValue, prop, i = this.callCount;\n\n                while (i--) {\n                    thisValue = this.getCall(i).thisValue;\n\n                    for (prop in thisValue) {\n                        if (thisValue[prop] === this) {\n                            return prop;\n                        }\n                    }\n                }\n            }\n\n            return this.displayName || \"sinon fake\";\n        },\n\n        getConfig: function (custom) {\n            var config = {};\n            custom = custom || {};\n            var defaults = sinon.defaultConfig;\n\n            for (var prop in defaults) {\n                if (defaults.hasOwnProperty(prop)) {\n                    config[prop] = custom.hasOwnProperty(prop) ? custom[prop] : defaults[prop];\n                }\n            }\n\n            return config;\n        },\n\n        format: function (val) {\n            return \"\" + val;\n        },\n\n        defaultConfig: {\n            injectIntoThis: true,\n            injectInto: null,\n            properties: [\"spy\", \"stub\", \"mock\", \"clock\", \"server\", \"requests\"],\n            useFakeTimers: true,\n            useFakeServer: true\n        },\n\n        timesInWords: function timesInWords(count) {\n            return count == 1 && \"once\" ||\n                count == 2 && \"twice\" ||\n                count == 3 && \"thrice\" ||\n                (count || 0) + \" times\";\n        },\n\n        calledInOrder: function (spies) {\n            for (var i = 1, l = spies.length; i < l; i++) {\n                if (!spies[i - 1].calledBefore(spies[i]) || !spies[i].called) {\n                    return false;\n                }\n            }\n\n            return true;\n        },\n\n        orderByFirstCall: function (spies) {\n            return spies.sort(function (a, b) {\n                // uuid, won't ever be equal\n                var aCall = a.getCall(0);\n                var bCall = b.getCall(0);\n                var aId = aCall && aCall.callId || -1;\n                var bId = bCall && bCall.callId || -1;\n\n                return aId < bId ? -1 : 1;\n            });\n        },\n\n        log: function () {},\n\n        logError: function (label, err) {\n            var msg = label + \" threw exception: \"\n            sinon.log(msg + \"[\" + err.name + \"] \" + err.message);\n            if (err.stack) { sinon.log(err.stack); }\n\n            setTimeout(function () {\n                err.message = msg + err.message;\n                throw err;\n            }, 0);\n        },\n\n        typeOf: function (value) {\n            if (value === null) {\n                return \"null\";\n            }\n            else if (value === undefined) {\n                return \"undefined\";\n            }\n            var string = Object.prototype.toString.call(value);\n            return string.substring(8, string.length - 1).toLowerCase();\n        },\n\n        createStubInstance: function (constructor) {\n            if (typeof constructor !== \"function\") {\n                throw new TypeError(\"The constructor should be a function.\");\n            }\n            return sinon.stub(sinon.create(constructor.prototype));\n        },\n\n        restore: function (object) {\n            if (object !== null && typeof object === \"object\") {\n                for (var prop in object) {\n                    if (isRestorable(object[prop])) {\n                        object[prop].restore();\n                    }\n                }\n            }\n            else if (isRestorable(object)) {\n                object.restore();\n            }\n        }\n    };\n\n    var isNode = typeof module == \"object\" && typeof require == \"function\";\n\n    if (isNode) {\n        try {\n            buster = { format: require(\"buster-format\") };\n        } catch (e) {}\n        module.exports = sinon;\n        module.exports.spy = require(\"./sinon/spy\");\n        module.exports.stub = require(\"./sinon/stub\");\n        module.exports.mock = require(\"./sinon/mock\");\n        module.exports.collection = require(\"./sinon/collection\");\n        module.exports.assert = require(\"./sinon/assert\");\n        module.exports.sandbox = require(\"./sinon/sandbox\");\n        module.exports.test = require(\"./sinon/test\");\n        module.exports.testCase = require(\"./sinon/test_case\");\n        module.exports.assert = require(\"./sinon/assert\");\n        module.exports.match = require(\"./sinon/match\");\n    }\n\n    if (buster) {\n        var formatter = sinon.create(buster.format);\n        formatter.quoteStrings = false;\n        sinon.format = function () {\n            return formatter.ascii.apply(formatter, arguments);\n        };\n    } else if (isNode) {\n        try {\n            var util = require(\"util\");\n            sinon.format = function (value) {\n                return typeof value == \"object\" && value.toString === Object.prototype.toString ? util.inspect(value) : value;\n            };\n        } catch (e) {\n            /* Node, but no util module - would be very old, but better safe than\n             sorry */\n        }\n    }\n\n    return sinon;\n}(typeof buster == \"object\" && buster));\n\n/* @depend ../sinon.js */\n/*jslint eqeqeq: false, onevar: false, plusplus: false*/\n/*global module, require, sinon*/\n/**\n * Match functions\n *\n * @author Maximilian Antoni (mail@maxantoni.de)\n * @license BSD\n *\n * Copyright (c) 2012 Maximilian Antoni\n */\n\n(function (sinon) {\n    var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\n    if (!sinon && commonJSModule) {\n        sinon = require(\"../sinon\");\n    }\n\n    if (!sinon) {\n        return;\n    }\n\n    function assertType(value, type, name) {\n        var actual = sinon.typeOf(value);\n        if (actual !== type) {\n            throw new TypeError(\"Expected type of \" + name + \" to be \" +\n                type + \", but was \" + actual);\n        }\n    }\n\n    var matcher = {\n        toString: function () {\n            return this.message;\n        }\n    };\n\n    function isMatcher(object) {\n        return matcher.isPrototypeOf(object);\n    }\n\n    function matchObject(expectation, actual) {\n        if (actual === null || actual === undefined) {\n            return false;\n        }\n        for (var key in expectation) {\n            if (expectation.hasOwnProperty(key)) {\n                var exp = expectation[key];\n                var act = actual[key];\n                if (match.isMatcher(exp)) {\n                    if (!exp.test(act)) {\n                        return false;\n                    }\n                } else if (sinon.typeOf(exp) === \"object\") {\n                    if (!matchObject(exp, act)) {\n                        return false;\n                    }\n                } else if (!sinon.deepEqual(exp, act)) {\n                    return false;\n                }\n            }\n        }\n        return true;\n    }\n\n    matcher.or = function (m2) {\n        if (!isMatcher(m2)) {\n            throw new TypeError(\"Matcher expected\");\n        }\n        var m1 = this;\n        var or = sinon.create(matcher);\n        or.test = function (actual) {\n            return m1.test(actual) || m2.test(actual);\n        };\n        or.message = m1.message + \".or(\" + m2.message + \")\";\n        return or;\n    };\n\n    matcher.and = function (m2) {\n        if (!isMatcher(m2)) {\n            throw new TypeError(\"Matcher expected\");\n        }\n        var m1 = this;\n        var and = sinon.create(matcher);\n        and.test = function (actual) {\n            return m1.test(actual) && m2.test(actual);\n        };\n        and.message = m1.message + \".and(\" + m2.message + \")\";\n        return and;\n    };\n\n    var match = function (expectation, message) {\n        var m = sinon.create(matcher);\n        var type = sinon.typeOf(expectation);\n        switch (type) {\n        case \"object\":\n            if (typeof expectation.test === \"function\") {\n                m.test = function (actual) {\n                    return expectation.test(actual) === true;\n                };\n                m.message = \"match(\" + sinon.functionName(expectation.test) + \")\";\n                return m;\n            }\n            var str = [];\n            for (var key in expectation) {\n                if (expectation.hasOwnProperty(key)) {\n                    str.push(key + \": \" + expectation[key]);\n                }\n            }\n            m.test = function (actual) {\n                return matchObject(expectation, actual);\n            };\n            m.message = \"match(\" + str.join(\", \") + \")\";\n            break;\n        case \"number\":\n            m.test = function (actual) {\n                return expectation == actual;\n            };\n            break;\n        case \"string\":\n            m.test = function (actual) {\n                if (typeof actual !== \"string\") {\n                    return false;\n                }\n                return actual.indexOf(expectation) !== -1;\n            };\n            m.message = \"match(\\\"\" + expectation + \"\\\")\";\n            break;\n        case \"regexp\":\n            m.test = function (actual) {\n                if (typeof actual !== \"string\") {\n                    return false;\n                }\n                return expectation.test(actual);\n            };\n            break;\n        case \"function\":\n            m.test = expectation;\n            if (message) {\n                m.message = message;\n            } else {\n                m.message = \"match(\" + sinon.functionName(expectation) + \")\";\n            }\n            break;\n        default:\n            m.test = function (actual) {\n              return sinon.deepEqual(expectation, actual);\n            };\n        }\n        if (!m.message) {\n            m.message = \"match(\" + expectation + \")\";\n        }\n        return m;\n    };\n\n    match.isMatcher = isMatcher;\n\n    match.any = match(function () {\n        return true;\n    }, \"any\");\n\n    match.defined = match(function (actual) {\n        return actual !== null && actual !== undefined;\n    }, \"defined\");\n\n    match.truthy = match(function (actual) {\n        return !!actual;\n    }, \"truthy\");\n\n    match.falsy = match(function (actual) {\n        return !actual;\n    }, \"falsy\");\n\n    match.same = function (expectation) {\n        return match(function (actual) {\n            return expectation === actual;\n        }, \"same(\" + expectation + \")\");\n    };\n\n    match.typeOf = function (type) {\n        assertType(type, \"string\", \"type\");\n        return match(function (actual) {\n            return sinon.typeOf(actual) === type;\n        }, \"typeOf(\\\"\" + type + \"\\\")\");\n    };\n\n    match.instanceOf = function (type) {\n        assertType(type, \"function\", \"type\");\n        return match(function (actual) {\n            return actual instanceof type;\n        }, \"instanceOf(\" + sinon.functionName(type) + \")\");\n    };\n\n    function createPropertyMatcher(propertyTest, messagePrefix) {\n        return function (property, value) {\n            assertType(property, \"string\", \"property\");\n            var onlyProperty = arguments.length === 1;\n            var message = messagePrefix + \"(\\\"\" + property + \"\\\"\";\n            if (!onlyProperty) {\n                message += \", \" + value;\n            }\n            message += \")\";\n            return match(function (actual) {\n                if (actual === undefined || actual === null ||\n                        !propertyTest(actual, property)) {\n                    return false;\n                }\n                return onlyProperty || sinon.deepEqual(value, actual[property]);\n            }, message);\n        };\n    }\n\n    match.has = createPropertyMatcher(function (actual, property) {\n        if (typeof actual === \"object\") {\n            return property in actual;\n        }\n        return actual[property] !== undefined;\n    }, \"has\");\n\n    match.hasOwn = createPropertyMatcher(function (actual, property) {\n        return actual.hasOwnProperty(property);\n    }, \"hasOwn\");\n\n    match.bool = match.typeOf(\"boolean\");\n    match.number = match.typeOf(\"number\");\n    match.string = match.typeOf(\"string\");\n    match.object = match.typeOf(\"object\");\n    match.func = match.typeOf(\"function\");\n    match.array = match.typeOf(\"array\");\n    match.regexp = match.typeOf(\"regexp\");\n    match.date = match.typeOf(\"date\");\n\n    if (commonJSModule) {\n        module.exports = match;\n    } else {\n        sinon.match = match;\n    }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n  * @depend ../sinon.js\n  * @depend match.js\n  */\n/*jslint eqeqeq: false, onevar: false, plusplus: false*/\n/*global module, require, sinon*/\n/**\n  * Spy calls\n  *\n  * @author Christian Johansen (christian@cjohansen.no)\n  * @author Maximilian Antoni (mail@maxantoni.de)\n  * @license BSD\n  *\n  * Copyright (c) 2010-2013 Christian Johansen\n  * Copyright (c) 2013 Maximilian Antoni\n  */\n\nvar commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\nif (!this.sinon && commonJSModule) {\n    var sinon = require(\"../sinon\");\n}\n\n(function (sinon) {\n    function throwYieldError(proxy, text, args) {\n        var msg = sinon.functionName(proxy) + text;\n        if (args.length) {\n            msg += \" Received [\" + slice.call(args).join(\", \") + \"]\";\n        }\n        throw new Error(msg);\n    }\n\n    var slice = Array.prototype.slice;\n\n    var callProto = {\n        calledOn: function calledOn(thisValue) {\n            if (sinon.match && sinon.match.isMatcher(thisValue)) {\n                return thisValue.test(this.thisValue);\n            }\n            return this.thisValue === thisValue;\n        },\n\n        calledWith: function calledWith() {\n            for (var i = 0, l = arguments.length; i < l; i += 1) {\n                if (!sinon.deepEqual(arguments[i], this.args[i])) {\n                    return false;\n                }\n            }\n\n            return true;\n        },\n\n        calledWithMatch: function calledWithMatch() {\n            for (var i = 0, l = arguments.length; i < l; i += 1) {\n                var actual = this.args[i];\n                var expectation = arguments[i];\n                if (!sinon.match || !sinon.match(expectation).test(actual)) {\n                    return false;\n                }\n            }\n            return true;\n        },\n\n        calledWithExactly: function calledWithExactly() {\n            return arguments.length == this.args.length &&\n                this.calledWith.apply(this, arguments);\n        },\n\n        notCalledWith: function notCalledWith() {\n            return !this.calledWith.apply(this, arguments);\n        },\n\n        notCalledWithMatch: function notCalledWithMatch() {\n            return !this.calledWithMatch.apply(this, arguments);\n        },\n\n        returned: function returned(value) {\n            return sinon.deepEqual(value, this.returnValue);\n        },\n\n        threw: function threw(error) {\n            if (typeof error === \"undefined\" || !this.exception) {\n                return !!this.exception;\n            }\n\n            return this.exception === error || this.exception.name === error;\n        },\n\n        calledWithNew: function calledWithNew(thisValue) {\n            return this.thisValue instanceof this.proxy;\n        },\n\n        calledBefore: function (other) {\n            return this.callId < other.callId;\n        },\n\n        calledAfter: function (other) {\n            return this.callId > other.callId;\n        },\n\n        callArg: function (pos) {\n            this.args[pos]();\n        },\n\n        callArgOn: function (pos, thisValue) {\n            this.args[pos].apply(thisValue);\n        },\n\n        callArgWith: function (pos) {\n            this.callArgOnWith.apply(this, [pos, null].concat(slice.call(arguments, 1)));\n        },\n\n        callArgOnWith: function (pos, thisValue) {\n            var args = slice.call(arguments, 2);\n            this.args[pos].apply(thisValue, args);\n        },\n\n        \"yield\": function () {\n            this.yieldOn.apply(this, [null].concat(slice.call(arguments, 0)));\n        },\n\n        yieldOn: function (thisValue) {\n            var args = this.args;\n            for (var i = 0, l = args.length; i < l; ++i) {\n                if (typeof args[i] === \"function\") {\n                    args[i].apply(thisValue, slice.call(arguments, 1));\n                    return;\n                }\n            }\n            throwYieldError(this.proxy, \" cannot yield since no callback was passed.\", args);\n        },\n\n        yieldTo: function (prop) {\n            this.yieldToOn.apply(this, [prop, null].concat(slice.call(arguments, 1)));\n        },\n\n        yieldToOn: function (prop, thisValue) {\n            var args = this.args;\n            for (var i = 0, l = args.length; i < l; ++i) {\n                if (args[i] && typeof args[i][prop] === \"function\") {\n                    args[i][prop].apply(thisValue, slice.call(arguments, 2));\n                    return;\n                }\n            }\n            throwYieldError(this.proxy, \" cannot yield to '\" + prop +\n                \"' since no callback was passed.\", args);\n        },\n\n        toString: function () {\n            var callStr = this.proxy.toString() + \"(\";\n            var args = [];\n\n            for (var i = 0, l = this.args.length; i < l; ++i) {\n                args.push(sinon.format(this.args[i]));\n            }\n\n            callStr = callStr + args.join(\", \") + \")\";\n\n            if (typeof this.returnValue != \"undefined\") {\n                callStr += \" => \" + sinon.format(this.returnValue);\n            }\n\n            if (this.exception) {\n                callStr += \" !\" + this.exception.name;\n\n                if (this.exception.message) {\n                    callStr += \"(\" + this.exception.message + \")\";\n                }\n            }\n\n            return callStr;\n        }\n    };\n\n    callProto.invokeCallback = callProto.yield;\n\n    function createSpyCall(spy, thisValue, args, returnValue, exception, id) {\n        if (typeof id !== \"number\") {\n            throw new TypeError(\"Call id is not a number\");\n        }\n        var proxyCall = sinon.create(callProto);\n        proxyCall.proxy = spy;\n        proxyCall.thisValue = thisValue;\n        proxyCall.args = args;\n        proxyCall.returnValue = returnValue;\n        proxyCall.exception = exception;\n        proxyCall.callId = id;\n\n        return proxyCall;\n    };\n    createSpyCall.toString = callProto.toString; // used by mocks\n\n    sinon.spyCall = createSpyCall;\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n  * @depend ../sinon.js\n  */\n/*jslint eqeqeq: false, onevar: false, plusplus: false*/\n/*global module, require, sinon*/\n/**\n  * Spy functions\n  *\n  * @author Christian Johansen (christian@cjohansen.no)\n  * @license BSD\n  *\n  * Copyright (c) 2010-2013 Christian Johansen\n  */\n\n(function (sinon) {\n    var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n    var push = Array.prototype.push;\n    var slice = Array.prototype.slice;\n    var callId = 0;\n\n    function spy(object, property) {\n        if (!property && typeof object == \"function\") {\n            return spy.create(object);\n        }\n\n        if (!object && !property) {\n            return spy.create(function () { });\n        }\n\n        var method = object[property];\n        return sinon.wrapMethod(object, property, spy.create(method));\n    }\n\n    function matchingFake(fakes, args, strict) {\n        if (!fakes) {\n            return;\n        }\n\n        var alen = args.length;\n\n        for (var i = 0, l = fakes.length; i < l; i++) {\n            if (fakes[i].matches(args, strict)) {\n                return fakes[i];\n            }\n        }\n    }\n\n    function incrementCallCount() {\n        this.called = true;\n        this.callCount += 1;\n        this.notCalled = false;\n        this.calledOnce = this.callCount == 1;\n        this.calledTwice = this.callCount == 2;\n        this.calledThrice = this.callCount == 3;\n    }\n\n    function createCallProperties() {\n        this.firstCall = this.getCall(0);\n        this.secondCall = this.getCall(1);\n        this.thirdCall = this.getCall(2);\n        this.lastCall = this.getCall(this.callCount - 1);\n    }\n\n    var vars = \"a,b,c,d,e,f,g,h,i,j,k,l\";\n    function createProxy(func) {\n        // Retain the function length:\n        var p;\n        if (func.length) {\n            eval(\"p = (function proxy(\" + vars.substring(0, func.length * 2 - 1) +\n                \") { return p.invoke(func, this, slice.call(arguments)); });\");\n        }\n        else {\n            p = function proxy() {\n                return p.invoke(func, this, slice.call(arguments));\n            };\n        }\n        return p;\n    }\n\n    var uuid = 0;\n\n    // Public API\n    var spyApi = {\n        reset: function () {\n            this.called = false;\n            this.notCalled = true;\n            this.calledOnce = false;\n            this.calledTwice = false;\n            this.calledThrice = false;\n            this.callCount = 0;\n            this.firstCall = null;\n            this.secondCall = null;\n            this.thirdCall = null;\n            this.lastCall = null;\n            this.args = [];\n            this.returnValues = [];\n            this.thisValues = [];\n            this.exceptions = [];\n            this.callIds = [];\n            if (this.fakes) {\n                for (var i = 0; i < this.fakes.length; i++) {\n                    this.fakes[i].reset();\n                }\n            }\n        },\n\n        create: function create(func) {\n            var name;\n\n            if (typeof func != \"function\") {\n                func = function () { };\n            } else {\n                name = sinon.functionName(func);\n            }\n\n            var proxy = createProxy(func);\n\n            sinon.extend(proxy, spy);\n            delete proxy.create;\n            sinon.extend(proxy, func);\n\n            proxy.reset();\n            proxy.prototype = func.prototype;\n            proxy.displayName = name || \"spy\";\n            proxy.toString = sinon.functionToString;\n            proxy._create = sinon.spy.create;\n            proxy.id = \"spy#\" + uuid++;\n\n            return proxy;\n        },\n\n        invoke: function invoke(func, thisValue, args) {\n            var matching = matchingFake(this.fakes, args);\n            var exception, returnValue;\n\n            incrementCallCount.call(this);\n            push.call(this.thisValues, thisValue);\n            push.call(this.args, args);\n            push.call(this.callIds, callId++);\n\n            try {\n                if (matching) {\n                    returnValue = matching.invoke(func, thisValue, args);\n                } else {\n                    returnValue = (this.func || func).apply(thisValue, args);\n                }\n            } catch (e) {\n                push.call(this.returnValues, undefined);\n                exception = e;\n                throw e;\n            } finally {\n                push.call(this.exceptions, exception);\n            }\n\n            push.call(this.returnValues, returnValue);\n\n            createCallProperties.call(this);\n\n            return returnValue;\n        },\n\n        getCall: function getCall(i) {\n            if (i < 0 || i >= this.callCount) {\n                return null;\n            }\n\n            return sinon.spyCall(this, this.thisValues[i], this.args[i],\n                                    this.returnValues[i], this.exceptions[i],\n                                    this.callIds[i]);\n        },\n\n        calledBefore: function calledBefore(spyFn) {\n            if (!this.called) {\n                return false;\n            }\n\n            if (!spyFn.called) {\n                return true;\n            }\n\n            return this.callIds[0] < spyFn.callIds[spyFn.callIds.length - 1];\n        },\n\n        calledAfter: function calledAfter(spyFn) {\n            if (!this.called || !spyFn.called) {\n                return false;\n            }\n\n            return this.callIds[this.callCount - 1] > spyFn.callIds[spyFn.callCount - 1];\n        },\n\n        withArgs: function () {\n            var args = slice.call(arguments);\n\n            if (this.fakes) {\n                var match = matchingFake(this.fakes, args, true);\n\n                if (match) {\n                    return match;\n                }\n            } else {\n                this.fakes = [];\n            }\n\n            var original = this;\n            var fake = this._create();\n            fake.matchingAguments = args;\n            push.call(this.fakes, fake);\n\n            fake.withArgs = function () {\n                return original.withArgs.apply(original, arguments);\n            };\n\n            for (var i = 0; i < this.args.length; i++) {\n                if (fake.matches(this.args[i])) {\n                    incrementCallCount.call(fake);\n                    push.call(fake.thisValues, this.thisValues[i]);\n                    push.call(fake.args, this.args[i]);\n                    push.call(fake.returnValues, this.returnValues[i]);\n                    push.call(fake.exceptions, this.exceptions[i]);\n                    push.call(fake.callIds, this.callIds[i]);\n                }\n            }\n            createCallProperties.call(fake);\n\n            return fake;\n        },\n\n        matches: function (args, strict) {\n            var margs = this.matchingAguments;\n\n            if (margs.length <= args.length &&\n                sinon.deepEqual(margs, args.slice(0, margs.length))) {\n                return !strict || margs.length == args.length;\n            }\n        },\n\n        printf: function (format) {\n            var spy = this;\n            var args = slice.call(arguments, 1);\n            var formatter;\n\n            return (format || \"\").replace(/%(.)/g, function (match, specifyer) {\n                formatter = spyApi.formatters[specifyer];\n\n                if (typeof formatter == \"function\") {\n                    return formatter.call(null, spy, args);\n                } else if (!isNaN(parseInt(specifyer), 10)) {\n                    return sinon.format(args[specifyer - 1]);\n                }\n\n                return \"%\" + specifyer;\n            });\n        }\n    };\n\n    function delegateToCalls(method, matchAny, actual, notCalled) {\n        spyApi[method] = function () {\n            if (!this.called) {\n                if (notCalled) {\n                    return notCalled.apply(this, arguments);\n                }\n                return false;\n            }\n\n            var currentCall;\n            var matches = 0;\n\n            for (var i = 0, l = this.callCount; i < l; i += 1) {\n                currentCall = this.getCall(i);\n\n                if (currentCall[actual || method].apply(currentCall, arguments)) {\n                    matches += 1;\n\n                    if (matchAny) {\n                        return true;\n                    }\n                }\n            }\n\n            return matches === this.callCount;\n        };\n    }\n\n    delegateToCalls(\"calledOn\", true);\n    delegateToCalls(\"alwaysCalledOn\", false, \"calledOn\");\n    delegateToCalls(\"calledWith\", true);\n    delegateToCalls(\"calledWithMatch\", true);\n    delegateToCalls(\"alwaysCalledWith\", false, \"calledWith\");\n    delegateToCalls(\"alwaysCalledWithMatch\", false, \"calledWithMatch\");\n    delegateToCalls(\"calledWithExactly\", true);\n    delegateToCalls(\"alwaysCalledWithExactly\", false, \"calledWithExactly\");\n    delegateToCalls(\"neverCalledWith\", false, \"notCalledWith\",\n        function () { return true; });\n    delegateToCalls(\"neverCalledWithMatch\", false, \"notCalledWithMatch\",\n        function () { return true; });\n    delegateToCalls(\"threw\", true);\n    delegateToCalls(\"alwaysThrew\", false, \"threw\");\n    delegateToCalls(\"returned\", true);\n    delegateToCalls(\"alwaysReturned\", false, \"returned\");\n    delegateToCalls(\"calledWithNew\", true);\n    delegateToCalls(\"alwaysCalledWithNew\", false, \"calledWithNew\");\n    delegateToCalls(\"callArg\", false, \"callArgWith\", function () {\n        throw new Error(this.toString() + \" cannot call arg since it was not yet invoked.\");\n    });\n    spyApi.callArgWith = spyApi.callArg;\n    delegateToCalls(\"callArgOn\", false, \"callArgOnWith\", function () {\n        throw new Error(this.toString() + \" cannot call arg since it was not yet invoked.\");\n    });\n    spyApi.callArgOnWith = spyApi.callArgOn;\n    delegateToCalls(\"yield\", false, \"yield\", function () {\n        throw new Error(this.toString() + \" cannot yield since it was not yet invoked.\");\n    });\n    // \"invokeCallback\" is an alias for \"yield\" since \"yield\" is invalid in strict mode.\n    spyApi.invokeCallback = spyApi.yield;\n    delegateToCalls(\"yieldOn\", false, \"yieldOn\", function () {\n        throw new Error(this.toString() + \" cannot yield since it was not yet invoked.\");\n    });\n    delegateToCalls(\"yieldTo\", false, \"yieldTo\", function (property) {\n        throw new Error(this.toString() + \" cannot yield to '\" + property +\n            \"' since it was not yet invoked.\");\n    });\n    delegateToCalls(\"yieldToOn\", false, \"yieldToOn\", function (property) {\n        throw new Error(this.toString() + \" cannot yield to '\" + property +\n            \"' since it was not yet invoked.\");\n    });\n\n    spyApi.formatters = {\n        \"c\": function (spy) {\n            return sinon.timesInWords(spy.callCount);\n        },\n\n        \"n\": function (spy) {\n            return spy.toString();\n        },\n\n        \"C\": function (spy) {\n            var calls = [];\n\n            for (var i = 0, l = spy.callCount; i < l; ++i) {\n                var stringifiedCall = \"    \" + spy.getCall(i).toString();\n                if (/\\n/.test(calls[i - 1])) {\n                    stringifiedCall = \"\\n\" + stringifiedCall;\n                }\n                push.call(calls, stringifiedCall);\n            }\n\n            return calls.length > 0 ? \"\\n\" + calls.join(\"\\n\") : \"\";\n        },\n\n        \"t\": function (spy) {\n            var objects = [];\n\n            for (var i = 0, l = spy.callCount; i < l; ++i) {\n                push.call(objects, sinon.format(spy.thisValues[i]));\n            }\n\n            return objects.join(\", \");\n        },\n\n        \"*\": function (spy, args) {\n            var formatted = [];\n\n            for (var i = 0, l = args.length; i < l; ++i) {\n                push.call(formatted, sinon.format(args[i]));\n            }\n\n            return formatted.join(\", \");\n        }\n    };\n\n    sinon.extend(spy, spyApi);\n\n    spy.spyCall = sinon.spyCall;\n\n    if (commonJSModule) {\n        module.exports = spy;\n    } else {\n        sinon.spy = spy;\n    }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend ../sinon.js\n * @depend spy.js\n */\n/*jslint eqeqeq: false, onevar: false*/\n/*global module, require, sinon*/\n/**\n * Stub functions\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon) {\n    var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\n    if (!sinon && commonJSModule) {\n        sinon = require(\"../sinon\");\n    }\n\n    if (!sinon) {\n        return;\n    }\n\n    function stub(object, property, func) {\n        if (!!func && typeof func != \"function\") {\n            throw new TypeError(\"Custom stub should be function\");\n        }\n\n        var wrapper;\n\n        if (func) {\n            wrapper = sinon.spy && sinon.spy.create ? sinon.spy.create(func) : func;\n        } else {\n            wrapper = stub.create();\n        }\n\n        if (!object && !property) {\n            return sinon.stub.create();\n        }\n\n        if (!property && !!object && typeof object == \"object\") {\n            for (var prop in object) {\n                if (typeof object[prop] === \"function\") {\n                    stub(object, prop);\n                }\n            }\n\n            return object;\n        }\n\n        return sinon.wrapMethod(object, property, wrapper);\n    }\n\n    function getChangingValue(stub, property) {\n        var index = stub.callCount - 1;\n        var values = stub[property];\n        var prop = index in values ? values[index] : values[values.length - 1];\n        stub[property + \"Last\"] = prop;\n\n        return prop;\n    }\n\n    function getCallback(stub, args) {\n        var callArgAt = getChangingValue(stub, \"callArgAts\");\n\n        if (callArgAt < 0) {\n            var callArgProp = getChangingValue(stub, \"callArgProps\");\n\n            for (var i = 0, l = args.length; i < l; ++i) {\n                if (!callArgProp && typeof args[i] == \"function\") {\n                    return args[i];\n                }\n\n                if (callArgProp && args[i] &&\n                    typeof args[i][callArgProp] == \"function\") {\n                    return args[i][callArgProp];\n                }\n            }\n\n            return null;\n        }\n\n        return args[callArgAt];\n    }\n\n    var join = Array.prototype.join;\n\n    function getCallbackError(stub, func, args) {\n        if (stub.callArgAtsLast < 0) {\n            var msg;\n\n            if (stub.callArgPropsLast) {\n                msg = sinon.functionName(stub) +\n                    \" expected to yield to '\" + stub.callArgPropsLast +\n                    \"', but no object with such a property was passed.\"\n            } else {\n                msg = sinon.functionName(stub) +\n                            \" expected to yield, but no callback was passed.\"\n            }\n\n            if (args.length > 0) {\n                msg += \" Received [\" + join.call(args, \", \") + \"]\";\n            }\n\n            return msg;\n        }\n\n        return \"argument at index \" + stub.callArgAtsLast + \" is not a function: \" + func;\n    }\n\n    var nextTick = (function () {\n        if (typeof process === \"object\" && typeof process.nextTick === \"function\") {\n            return process.nextTick;\n        } else if (typeof setImmediate === \"function\") {\n            return setImmediate;\n        } else {\n            return function (callback) {\n                setTimeout(callback, 0);\n            };\n        }\n    })();\n\n    function callCallback(stub, args) {\n        if (stub.callArgAts.length > 0) {\n            var func = getCallback(stub, args);\n\n            if (typeof func != \"function\") {\n                throw new TypeError(getCallbackError(stub, func, args));\n            }\n\n            var callbackArguments = getChangingValue(stub, \"callbackArguments\");\n            var callbackContext = getChangingValue(stub, \"callbackContexts\");\n\n            if (stub.callbackAsync) {\n                nextTick(function() {\n                    func.apply(callbackContext, callbackArguments);\n                });\n            } else {\n                func.apply(callbackContext, callbackArguments);\n            }\n        }\n    }\n\n    var uuid = 0;\n\n    sinon.extend(stub, (function () {\n        var slice = Array.prototype.slice, proto;\n\n        function throwsException(error, message) {\n            if (typeof error == \"string\") {\n                this.exception = new Error(message || \"\");\n                this.exception.name = error;\n            } else if (!error) {\n                this.exception = new Error(\"Error\");\n            } else {\n                this.exception = error;\n            }\n\n            return this;\n        }\n\n        proto = {\n            create: function create() {\n                var functionStub = function () {\n\n                    callCallback(functionStub, arguments);\n\n                    if (functionStub.exception) {\n                        throw functionStub.exception;\n                    } else if (typeof functionStub.returnArgAt == 'number') {\n                        return arguments[functionStub.returnArgAt];\n                    } else if (functionStub.returnThis) {\n                        return this;\n                    }\n                    return functionStub.returnValue;\n                };\n\n                functionStub.id = \"stub#\" + uuid++;\n                var orig = functionStub;\n                functionStub = sinon.spy.create(functionStub);\n                functionStub.func = orig;\n\n                functionStub.callArgAts = [];\n                functionStub.callbackArguments = [];\n                functionStub.callbackContexts = [];\n                functionStub.callArgProps = [];\n\n                sinon.extend(functionStub, stub);\n                functionStub._create = sinon.stub.create;\n                functionStub.displayName = \"stub\";\n                functionStub.toString = sinon.functionToString;\n\n                return functionStub;\n            },\n\n            resetBehavior: function () {\n                var i;\n\n                this.callArgAts = [];\n                this.callbackArguments = [];\n                this.callbackContexts = [];\n                this.callArgProps = [];\n\n                delete this.returnValue;\n                delete this.returnArgAt;\n                this.returnThis = false;\n\n                if (this.fakes) {\n                    for (i = 0; i < this.fakes.length; i++) {\n                        this.fakes[i].resetBehavior();\n                    }\n                }\n            },\n\n            returns: function returns(value) {\n                this.returnValue = value;\n\n                return this;\n            },\n\n            returnsArg: function returnsArg(pos) {\n                if (typeof pos != \"number\") {\n                    throw new TypeError(\"argument index is not number\");\n                }\n\n                this.returnArgAt = pos;\n\n                return this;\n            },\n\n            returnsThis: function returnsThis() {\n                this.returnThis = true;\n\n                return this;\n            },\n\n            \"throws\": throwsException,\n            throwsException: throwsException,\n\n            callsArg: function callsArg(pos) {\n                if (typeof pos != \"number\") {\n                    throw new TypeError(\"argument index is not number\");\n                }\n\n                this.callArgAts.push(pos);\n                this.callbackArguments.push([]);\n                this.callbackContexts.push(undefined);\n                this.callArgProps.push(undefined);\n\n                return this;\n            },\n\n            callsArgOn: function callsArgOn(pos, context) {\n                if (typeof pos != \"number\") {\n                    throw new TypeError(\"argument index is not number\");\n                }\n                if (typeof context != \"object\") {\n                    throw new TypeError(\"argument context is not an object\");\n                }\n\n                this.callArgAts.push(pos);\n                this.callbackArguments.push([]);\n                this.callbackContexts.push(context);\n                this.callArgProps.push(undefined);\n\n                return this;\n            },\n\n            callsArgWith: function callsArgWith(pos) {\n                if (typeof pos != \"number\") {\n                    throw new TypeError(\"argument index is not number\");\n                }\n\n                this.callArgAts.push(pos);\n                this.callbackArguments.push(slice.call(arguments, 1));\n                this.callbackContexts.push(undefined);\n                this.callArgProps.push(undefined);\n\n                return this;\n            },\n\n            callsArgOnWith: function callsArgWith(pos, context) {\n                if (typeof pos != \"number\") {\n                    throw new TypeError(\"argument index is not number\");\n                }\n                if (typeof context != \"object\") {\n                    throw new TypeError(\"argument context is not an object\");\n                }\n\n                this.callArgAts.push(pos);\n                this.callbackArguments.push(slice.call(arguments, 2));\n                this.callbackContexts.push(context);\n                this.callArgProps.push(undefined);\n\n                return this;\n            },\n\n            yields: function () {\n                this.callArgAts.push(-1);\n                this.callbackArguments.push(slice.call(arguments, 0));\n                this.callbackContexts.push(undefined);\n                this.callArgProps.push(undefined);\n\n                return this;\n            },\n\n            yieldsOn: function (context) {\n                if (typeof context != \"object\") {\n                    throw new TypeError(\"argument context is not an object\");\n                }\n\n                this.callArgAts.push(-1);\n                this.callbackArguments.push(slice.call(arguments, 1));\n                this.callbackContexts.push(context);\n                this.callArgProps.push(undefined);\n\n                return this;\n            },\n\n            yieldsTo: function (prop) {\n                this.callArgAts.push(-1);\n                this.callbackArguments.push(slice.call(arguments, 1));\n                this.callbackContexts.push(undefined);\n                this.callArgProps.push(prop);\n\n                return this;\n            },\n\n            yieldsToOn: function (prop, context) {\n                if (typeof context != \"object\") {\n                    throw new TypeError(\"argument context is not an object\");\n                }\n\n                this.callArgAts.push(-1);\n                this.callbackArguments.push(slice.call(arguments, 2));\n                this.callbackContexts.push(context);\n                this.callArgProps.push(prop);\n\n                return this;\n            }\n        };\n\n        // create asynchronous versions of callsArg* and yields* methods\n        for (var method in proto) {\n            // need to avoid creating anotherasync versions of the newly added async methods\n            if (proto.hasOwnProperty(method) &&\n                method.match(/^(callsArg|yields|thenYields$)/) &&\n                !method.match(/Async/)) {\n                proto[method + 'Async'] = (function (syncFnName) {\n                    return function () {\n                        this.callbackAsync = true;\n                        return this[syncFnName].apply(this, arguments);\n                    };\n                })(method);\n            }\n        }\n\n        return proto;\n\n    }()));\n\n    if (commonJSModule) {\n        module.exports = stub;\n    } else {\n        sinon.stub = stub;\n    }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend ../sinon.js\n * @depend stub.js\n */\n/*jslint eqeqeq: false, onevar: false, nomen: false*/\n/*global module, require, sinon*/\n/**\n * Mock functions.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon) {\n    var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n    var push = [].push;\n\n    if (!sinon && commonJSModule) {\n        sinon = require(\"../sinon\");\n    }\n\n    if (!sinon) {\n        return;\n    }\n\n    function mock(object) {\n        if (!object) {\n            return sinon.expectation.create(\"Anonymous mock\");\n        }\n\n        return mock.create(object);\n    }\n\n    sinon.mock = mock;\n\n    sinon.extend(mock, (function () {\n        function each(collection, callback) {\n            if (!collection) {\n                return;\n            }\n\n            for (var i = 0, l = collection.length; i < l; i += 1) {\n                callback(collection[i]);\n            }\n        }\n\n        return {\n            create: function create(object) {\n                if (!object) {\n                    throw new TypeError(\"object is null\");\n                }\n\n                var mockObject = sinon.extend({}, mock);\n                mockObject.object = object;\n                delete mockObject.create;\n\n                return mockObject;\n            },\n\n            expects: function expects(method) {\n                if (!method) {\n                    throw new TypeError(\"method is falsy\");\n                }\n\n                if (!this.expectations) {\n                    this.expectations = {};\n                    this.proxies = [];\n                }\n\n                if (!this.expectations[method]) {\n                    this.expectations[method] = [];\n                    var mockObject = this;\n\n                    sinon.wrapMethod(this.object, method, function () {\n                        return mockObject.invokeMethod(method, this, arguments);\n                    });\n\n                    push.call(this.proxies, method);\n                }\n\n                var expectation = sinon.expectation.create(method);\n                push.call(this.expectations[method], expectation);\n\n                return expectation;\n            },\n\n            restore: function restore() {\n                var object = this.object;\n\n                each(this.proxies, function (proxy) {\n                    if (typeof object[proxy].restore == \"function\") {\n                        object[proxy].restore();\n                    }\n                });\n            },\n\n            verify: function verify() {\n                var expectations = this.expectations || {};\n                var messages = [], met = [];\n\n                each(this.proxies, function (proxy) {\n                    each(expectations[proxy], function (expectation) {\n                        if (!expectation.met()) {\n                            push.call(messages, expectation.toString());\n                        } else {\n                            push.call(met, expectation.toString());\n                        }\n                    });\n                });\n\n                this.restore();\n\n                if (messages.length > 0) {\n                    sinon.expectation.fail(messages.concat(met).join(\"\\n\"));\n                } else {\n                    sinon.expectation.pass(messages.concat(met).join(\"\\n\"));\n                }\n\n                return true;\n            },\n\n            invokeMethod: function invokeMethod(method, thisValue, args) {\n                var expectations = this.expectations && this.expectations[method];\n                var length = expectations && expectations.length || 0, i;\n\n                for (i = 0; i < length; i += 1) {\n                    if (!expectations[i].met() &&\n                        expectations[i].allowsCall(thisValue, args)) {\n                        return expectations[i].apply(thisValue, args);\n                    }\n                }\n\n                var messages = [], available, exhausted = 0;\n\n                for (i = 0; i < length; i += 1) {\n                    if (expectations[i].allowsCall(thisValue, args)) {\n                        available = available || expectations[i];\n                    } else {\n                        exhausted += 1;\n                    }\n                    push.call(messages, \"    \" + expectations[i].toString());\n                }\n\n                if (exhausted === 0) {\n                    return available.apply(thisValue, args);\n                }\n\n                messages.unshift(\"Unexpected call: \" + sinon.spyCall.toString.call({\n                    proxy: method,\n                    args: args\n                }));\n\n                sinon.expectation.fail(messages.join(\"\\n\"));\n            }\n        };\n    }()));\n\n    var times = sinon.timesInWords;\n\n    sinon.expectation = (function () {\n        var slice = Array.prototype.slice;\n        var _invoke = sinon.spy.invoke;\n\n        function callCountInWords(callCount) {\n            if (callCount == 0) {\n                return \"never called\";\n            } else {\n                return \"called \" + times(callCount);\n            }\n        }\n\n        function expectedCallCountInWords(expectation) {\n            var min = expectation.minCalls;\n            var max = expectation.maxCalls;\n\n            if (typeof min == \"number\" && typeof max == \"number\") {\n                var str = times(min);\n\n                if (min != max) {\n                    str = \"at least \" + str + \" and at most \" + times(max);\n                }\n\n                return str;\n            }\n\n            if (typeof min == \"number\") {\n                return \"at least \" + times(min);\n            }\n\n            return \"at most \" + times(max);\n        }\n\n        function receivedMinCalls(expectation) {\n            var hasMinLimit = typeof expectation.minCalls == \"number\";\n            return !hasMinLimit || expectation.callCount >= expectation.minCalls;\n        }\n\n        function receivedMaxCalls(expectation) {\n            if (typeof expectation.maxCalls != \"number\") {\n                return false;\n            }\n\n            return expectation.callCount == expectation.maxCalls;\n        }\n\n        return {\n            minCalls: 1,\n            maxCalls: 1,\n\n            create: function create(methodName) {\n                var expectation = sinon.extend(sinon.stub.create(), sinon.expectation);\n                delete expectation.create;\n                expectation.method = methodName;\n\n                return expectation;\n            },\n\n            invoke: function invoke(func, thisValue, args) {\n                this.verifyCallAllowed(thisValue, args);\n\n                return _invoke.apply(this, arguments);\n            },\n\n            atLeast: function atLeast(num) {\n                if (typeof num != \"number\") {\n                    throw new TypeError(\"'\" + num + \"' is not number\");\n                }\n\n                if (!this.limitsSet) {\n                    this.maxCalls = null;\n                    this.limitsSet = true;\n                }\n\n                this.minCalls = num;\n\n                return this;\n            },\n\n            atMost: function atMost(num) {\n                if (typeof num != \"number\") {\n                    throw new TypeError(\"'\" + num + \"' is not number\");\n                }\n\n                if (!this.limitsSet) {\n                    this.minCalls = null;\n                    this.limitsSet = true;\n                }\n\n                this.maxCalls = num;\n\n                return this;\n            },\n\n            never: function never() {\n                return this.exactly(0);\n            },\n\n            once: function once() {\n                return this.exactly(1);\n            },\n\n            twice: function twice() {\n                return this.exactly(2);\n            },\n\n            thrice: function thrice() {\n                return this.exactly(3);\n            },\n\n            exactly: function exactly(num) {\n                if (typeof num != \"number\") {\n                    throw new TypeError(\"'\" + num + \"' is not a number\");\n                }\n\n                this.atLeast(num);\n                return this.atMost(num);\n            },\n\n            met: function met() {\n                return !this.failed && receivedMinCalls(this);\n            },\n\n            verifyCallAllowed: function verifyCallAllowed(thisValue, args) {\n                if (receivedMaxCalls(this)) {\n                    this.failed = true;\n                    sinon.expectation.fail(this.method + \" already called \" + times(this.maxCalls));\n                }\n\n                if (\"expectedThis\" in this && this.expectedThis !== thisValue) {\n                    sinon.expectation.fail(this.method + \" called with \" + thisValue + \" as thisValue, expected \" +\n                        this.expectedThis);\n                }\n\n                if (!(\"expectedArguments\" in this)) {\n                    return;\n                }\n\n                if (!args) {\n                    sinon.expectation.fail(this.method + \" received no arguments, expected \" +\n                        sinon.format(this.expectedArguments));\n                }\n\n                if (args.length < this.expectedArguments.length) {\n                    sinon.expectation.fail(this.method + \" received too few arguments (\" + sinon.format(args) +\n                        \"), expected \" + sinon.format(this.expectedArguments));\n                }\n\n                if (this.expectsExactArgCount &&\n                    args.length != this.expectedArguments.length) {\n                    sinon.expectation.fail(this.method + \" received too many arguments (\" + sinon.format(args) +\n                        \"), expected \" + sinon.format(this.expectedArguments));\n                }\n\n                for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {\n                    if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {\n                        sinon.expectation.fail(this.method + \" received wrong arguments \" + sinon.format(args) +\n                            \", expected \" + sinon.format(this.expectedArguments));\n                    }\n                }\n            },\n\n            allowsCall: function allowsCall(thisValue, args) {\n                if (this.met() && receivedMaxCalls(this)) {\n                    return false;\n                }\n\n                if (\"expectedThis\" in this && this.expectedThis !== thisValue) {\n                    return false;\n                }\n\n                if (!(\"expectedArguments\" in this)) {\n                    return true;\n                }\n\n                args = args || [];\n\n                if (args.length < this.expectedArguments.length) {\n                    return false;\n                }\n\n                if (this.expectsExactArgCount &&\n                    args.length != this.expectedArguments.length) {\n                    return false;\n                }\n\n                for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {\n                    if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {\n                        return false;\n                    }\n                }\n\n                return true;\n            },\n\n            withArgs: function withArgs() {\n                this.expectedArguments = slice.call(arguments);\n                return this;\n            },\n\n            withExactArgs: function withExactArgs() {\n                this.withArgs.apply(this, arguments);\n                this.expectsExactArgCount = true;\n                return this;\n            },\n\n            on: function on(thisValue) {\n                this.expectedThis = thisValue;\n                return this;\n            },\n\n            toString: function () {\n                var args = (this.expectedArguments || []).slice();\n\n                if (!this.expectsExactArgCount) {\n                    push.call(args, \"[...]\");\n                }\n\n                var callStr = sinon.spyCall.toString.call({\n                    proxy: this.method || \"anonymous mock expectation\",\n                    args: args\n                });\n\n                var message = callStr.replace(\", [...\", \"[, ...\") + \" \" +\n                    expectedCallCountInWords(this);\n\n                if (this.met()) {\n                    return \"Expectation met: \" + message;\n                }\n\n                return \"Expected \" + message + \" (\" +\n                    callCountInWords(this.callCount) + \")\";\n            },\n\n            verify: function verify() {\n                if (!this.met()) {\n                    sinon.expectation.fail(this.toString());\n                } else {\n                    sinon.expectation.pass(this.toString());\n                }\n\n                return true;\n            },\n\n            pass: function(message) {\n              sinon.assert.pass(message);\n            },\n            fail: function (message) {\n                var exception = new Error(message);\n                exception.name = \"ExpectationError\";\n\n                throw exception;\n            }\n        };\n    }());\n\n    if (commonJSModule) {\n        module.exports = mock;\n    } else {\n        sinon.mock = mock;\n    }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend ../sinon.js\n * @depend stub.js\n * @depend mock.js\n */\n/*jslint eqeqeq: false, onevar: false, forin: true*/\n/*global module, require, sinon*/\n/**\n * Collections of stubs, spies and mocks.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon) {\n    var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n    var push = [].push;\n    var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n    if (!sinon && commonJSModule) {\n        sinon = require(\"../sinon\");\n    }\n\n    if (!sinon) {\n        return;\n    }\n\n    function getFakes(fakeCollection) {\n        if (!fakeCollection.fakes) {\n            fakeCollection.fakes = [];\n        }\n\n        return fakeCollection.fakes;\n    }\n\n    function each(fakeCollection, method) {\n        var fakes = getFakes(fakeCollection);\n\n        for (var i = 0, l = fakes.length; i < l; i += 1) {\n            if (typeof fakes[i][method] == \"function\") {\n                fakes[i][method]();\n            }\n        }\n    }\n\n    function compact(fakeCollection) {\n        var fakes = getFakes(fakeCollection);\n        var i = 0;\n        while (i < fakes.length) {\n          fakes.splice(i, 1);\n        }\n    }\n\n    var collection = {\n        verify: function resolve() {\n            each(this, \"verify\");\n        },\n\n        restore: function restore() {\n            each(this, \"restore\");\n            compact(this);\n        },\n\n        verifyAndRestore: function verifyAndRestore() {\n            var exception;\n\n            try {\n                this.verify();\n            } catch (e) {\n                exception = e;\n            }\n\n            this.restore();\n\n            if (exception) {\n                throw exception;\n            }\n        },\n\n        add: function add(fake) {\n            push.call(getFakes(this), fake);\n            return fake;\n        },\n\n        spy: function spy() {\n            return this.add(sinon.spy.apply(sinon, arguments));\n        },\n\n        stub: function stub(object, property, value) {\n            if (property) {\n                var original = object[property];\n\n                if (typeof original != \"function\") {\n                    if (!hasOwnProperty.call(object, property)) {\n                        throw new TypeError(\"Cannot stub non-existent own property \" + property);\n                    }\n\n                    object[property] = value;\n\n                    return this.add({\n                        restore: function () {\n                            object[property] = original;\n                        }\n                    });\n                }\n            }\n            if (!property && !!object && typeof object == \"object\") {\n                var stubbedObj = sinon.stub.apply(sinon, arguments);\n\n                for (var prop in stubbedObj) {\n                    if (typeof stubbedObj[prop] === \"function\") {\n                        this.add(stubbedObj[prop]);\n                    }\n                }\n\n                return stubbedObj;\n            }\n\n            return this.add(sinon.stub.apply(sinon, arguments));\n        },\n\n        mock: function mock() {\n            return this.add(sinon.mock.apply(sinon, arguments));\n        },\n\n        inject: function inject(obj) {\n            var col = this;\n\n            obj.spy = function () {\n                return col.spy.apply(col, arguments);\n            };\n\n            obj.stub = function () {\n                return col.stub.apply(col, arguments);\n            };\n\n            obj.mock = function () {\n                return col.mock.apply(col, arguments);\n            };\n\n            return obj;\n        }\n    };\n\n    if (commonJSModule) {\n        module.exports = collection;\n    } else {\n        sinon.collection = collection;\n    }\n}(typeof sinon == \"object\" && sinon || null));\n\n/*jslint eqeqeq: false, plusplus: false, evil: true, onevar: false, browser: true, forin: false*/\n/*global module, require, window*/\n/**\n * Fake timer API\n * setTimeout\n * setInterval\n * clearTimeout\n * clearInterval\n * tick\n * reset\n * Date\n *\n * Inspired by jsUnitMockTimeOut from JsUnit\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\nif (typeof sinon == \"undefined\") {\n    var sinon = {};\n}\n\n(function (global) {\n    var id = 1;\n\n    function addTimer(args, recurring) {\n        if (args.length === 0) {\n            throw new Error(\"Function requires at least 1 parameter\");\n        }\n\n        var toId = id++;\n        var delay = args[1] || 0;\n\n        if (!this.timeouts) {\n            this.timeouts = {};\n        }\n\n        this.timeouts[toId] = {\n            id: toId,\n            func: args[0],\n            callAt: this.now + delay,\n            invokeArgs: Array.prototype.slice.call(args, 2)\n        };\n\n        if (recurring === true) {\n            this.timeouts[toId].interval = delay;\n        }\n\n        return toId;\n    }\n\n    function parseTime(str) {\n        if (!str) {\n            return 0;\n        }\n\n        var strings = str.split(\":\");\n        var l = strings.length, i = l;\n        var ms = 0, parsed;\n\n        if (l > 3 || !/^(\\d\\d:){0,2}\\d\\d?$/.test(str)) {\n            throw new Error(\"tick only understands numbers and 'h:m:s'\");\n        }\n\n        while (i--) {\n            parsed = parseInt(strings[i], 10);\n\n            if (parsed >= 60) {\n                throw new Error(\"Invalid time \" + str);\n            }\n\n            ms += parsed * Math.pow(60, (l - i - 1));\n        }\n\n        return ms * 1000;\n    }\n\n    function createObject(object) {\n        var newObject;\n\n        if (Object.create) {\n            newObject = Object.create(object);\n        } else {\n            var F = function () {};\n            F.prototype = object;\n            newObject = new F();\n        }\n\n        newObject.Date.clock = newObject;\n        return newObject;\n    }\n\n    sinon.clock = {\n        now: 0,\n\n        create: function create(now) {\n            var clock = createObject(this);\n\n            if (typeof now == \"number\") {\n                clock.now = now;\n            }\n\n            if (!!now && typeof now == \"object\") {\n                throw new TypeError(\"now should be milliseconds since UNIX epoch\");\n            }\n\n            return clock;\n        },\n\n        setTimeout: function setTimeout(callback, timeout) {\n            return addTimer.call(this, arguments, false);\n        },\n\n        clearTimeout: function clearTimeout(timerId) {\n            if (!this.timeouts) {\n                this.timeouts = [];\n            }\n\n            if (timerId in this.timeouts) {\n                delete this.timeouts[timerId];\n            }\n        },\n\n        setInterval: function setInterval(callback, timeout) {\n            return addTimer.call(this, arguments, true);\n        },\n\n        clearInterval: function clearInterval(timerId) {\n            this.clearTimeout(timerId);\n        },\n\n        tick: function tick(ms) {\n            ms = typeof ms == \"number\" ? ms : parseTime(ms);\n            var tickFrom = this.now, tickTo = this.now + ms, previous = this.now;\n            var timer = this.firstTimerInRange(tickFrom, tickTo);\n\n            var firstException;\n            while (timer && tickFrom <= tickTo) {\n                if (this.timeouts[timer.id]) {\n                    tickFrom = this.now = timer.callAt;\n                    try {\n                      this.callTimer(timer);\n                    } catch (e) {\n                      firstException = firstException || e;\n                    }\n                }\n\n                timer = this.firstTimerInRange(previous, tickTo);\n                previous = tickFrom;\n            }\n\n            this.now = tickTo;\n\n            if (firstException) {\n              throw firstException;\n            }\n\n            return this.now;\n        },\n\n        firstTimerInRange: function (from, to) {\n            var timer, smallest, originalTimer;\n\n            for (var id in this.timeouts) {\n                if (this.timeouts.hasOwnProperty(id)) {\n                    if (this.timeouts[id].callAt < from || this.timeouts[id].callAt > to) {\n                        continue;\n                    }\n\n                    if (!smallest || this.timeouts[id].callAt < smallest) {\n                        originalTimer = this.timeouts[id];\n                        smallest = this.timeouts[id].callAt;\n\n                        timer = {\n                            func: this.timeouts[id].func,\n                            callAt: this.timeouts[id].callAt,\n                            interval: this.timeouts[id].interval,\n                            id: this.timeouts[id].id,\n                            invokeArgs: this.timeouts[id].invokeArgs\n                        };\n                    }\n                }\n            }\n\n            return timer || null;\n        },\n\n        callTimer: function (timer) {\n            if (typeof timer.interval == \"number\") {\n                this.timeouts[timer.id].callAt += timer.interval;\n            } else {\n                delete this.timeouts[timer.id];\n            }\n\n            try {\n                if (typeof timer.func == \"function\") {\n                    timer.func.apply(null, timer.invokeArgs);\n                } else {\n                    eval(timer.func);\n                }\n            } catch (e) {\n              var exception = e;\n            }\n\n            if (!this.timeouts[timer.id]) {\n                if (exception) {\n                  throw exception;\n                }\n                return;\n            }\n\n            if (exception) {\n              throw exception;\n            }\n        },\n\n        reset: function reset() {\n            this.timeouts = {};\n        },\n\n        Date: (function () {\n            var NativeDate = Date;\n\n            function ClockDate(year, month, date, hour, minute, second, ms) {\n                // Defensive and verbose to avoid potential harm in passing\n                // explicit undefined when user does not pass argument\n                switch (arguments.length) {\n                case 0:\n                    return new NativeDate(ClockDate.clock.now);\n                case 1:\n                    return new NativeDate(year);\n                case 2:\n                    return new NativeDate(year, month);\n                case 3:\n                    return new NativeDate(year, month, date);\n                case 4:\n                    return new NativeDate(year, month, date, hour);\n                case 5:\n                    return new NativeDate(year, month, date, hour, minute);\n                case 6:\n                    return new NativeDate(year, month, date, hour, minute, second);\n                default:\n                    return new NativeDate(year, month, date, hour, minute, second, ms);\n                }\n            }\n\n            return mirrorDateProperties(ClockDate, NativeDate);\n        }())\n    };\n\n    function mirrorDateProperties(target, source) {\n        if (source.now) {\n            target.now = function now() {\n                return target.clock.now;\n            };\n        } else {\n            delete target.now;\n        }\n\n        if (source.toSource) {\n            target.toSource = function toSource() {\n                return source.toSource();\n            };\n        } else {\n            delete target.toSource;\n        }\n\n        target.toString = function toString() {\n            return source.toString();\n        };\n\n        target.prototype = source.prototype;\n        target.parse = source.parse;\n        target.UTC = source.UTC;\n        target.prototype.toUTCString = source.prototype.toUTCString;\n        return target;\n    }\n\n    var methods = [\"Date\", \"setTimeout\", \"setInterval\",\n                   \"clearTimeout\", \"clearInterval\"];\n\n    function restore() {\n        var method;\n\n        for (var i = 0, l = this.methods.length; i < l; i++) {\n            method = this.methods[i];\n            if (global[method].hadOwnProperty) {\n                global[method] = this[\"_\" + method];\n            } else {\n                delete global[method];\n            }\n        }\n\n        // Prevent multiple executions which will completely remove these props\n        this.methods = [];\n    }\n\n    function stubGlobal(method, clock) {\n        clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(global, method);\n        clock[\"_\" + method] = global[method];\n\n        if (method == \"Date\") {\n            var date = mirrorDateProperties(clock[method], global[method]);\n            global[method] = date;\n        } else {\n            global[method] = function () {\n                return clock[method].apply(clock, arguments);\n            };\n\n            for (var prop in clock[method]) {\n                if (clock[method].hasOwnProperty(prop)) {\n                    global[method][prop] = clock[method][prop];\n                }\n            }\n        }\n\n        global[method].clock = clock;\n    }\n\n    sinon.useFakeTimers = function useFakeTimers(now) {\n        var clock = sinon.clock.create(now);\n        clock.restore = restore;\n        clock.methods = Array.prototype.slice.call(arguments,\n                                                   typeof now == \"number\" ? 1 : 0);\n\n        if (clock.methods.length === 0) {\n            clock.methods = methods;\n        }\n\n        for (var i = 0, l = clock.methods.length; i < l; i++) {\n            stubGlobal(clock.methods[i], clock);\n        }\n\n        return clock;\n    };\n}(typeof global != \"undefined\" && typeof global !== \"function\" ? global : this));\n\nsinon.timers = {\n    setTimeout: setTimeout,\n    clearTimeout: clearTimeout,\n    setInterval: setInterval,\n    clearInterval: clearInterval,\n    Date: Date\n};\n\nif (typeof module == \"object\" && typeof require == \"function\") {\n    module.exports = sinon;\n}\n\n/*jslint eqeqeq: false, onevar: false*/\n/*global sinon, module, require, ActiveXObject, XMLHttpRequest, DOMParser*/\n/**\n * Minimal Event interface implementation\n *\n * Original implementation by Sven Fuchs: https://gist.github.com/995028\n * Modifications and tests by Christian Johansen.\n *\n * @author Sven Fuchs (svenfuchs@artweb-design.de)\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2011 Sven Fuchs, Christian Johansen\n */\n\nif (typeof sinon == \"undefined\") {\n    this.sinon = {};\n}\n\n(function () {\n    var push = [].push;\n\n    sinon.Event = function Event(type, bubbles, cancelable, target) {\n        this.initEvent(type, bubbles, cancelable, target);\n    };\n\n    sinon.Event.prototype = {\n        initEvent: function(type, bubbles, cancelable, target) {\n            this.type = type;\n            this.bubbles = bubbles;\n            this.cancelable = cancelable;\n            this.target = target;\n        },\n\n        stopPropagation: function () {},\n\n        preventDefault: function () {\n            this.defaultPrevented = true;\n        }\n    };\n\n    sinon.EventTarget = {\n        addEventListener: function addEventListener(event, listener, useCapture) {\n            this.eventListeners = this.eventListeners || {};\n            this.eventListeners[event] = this.eventListeners[event] || [];\n            push.call(this.eventListeners[event], listener);\n        },\n\n        removeEventListener: function removeEventListener(event, listener, useCapture) {\n            var listeners = this.eventListeners && this.eventListeners[event] || [];\n\n            for (var i = 0, l = listeners.length; i < l; ++i) {\n                if (listeners[i] == listener) {\n                    return listeners.splice(i, 1);\n                }\n            }\n        },\n\n        dispatchEvent: function dispatchEvent(event) {\n            var type = event.type;\n            var listeners = this.eventListeners && this.eventListeners[type] || [];\n\n            for (var i = 0; i < listeners.length; i++) {\n                if (typeof listeners[i] == \"function\") {\n                    listeners[i].call(this, event);\n                } else {\n                    listeners[i].handleEvent(event);\n                }\n            }\n\n            return !!event.defaultPrevented;\n        }\n    };\n}());\n\n/**\n * @depend ../../sinon.js\n * @depend event.js\n */\n/*jslint eqeqeq: false, onevar: false*/\n/*global sinon, module, require, ActiveXObject, XMLHttpRequest, DOMParser*/\n/**\n * Fake XMLHttpRequest object\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\nif (typeof sinon == \"undefined\") {\n    this.sinon = {};\n}\nsinon.xhr = { XMLHttpRequest: this.XMLHttpRequest };\n\n// wrapper for global\n(function(global) {\n    var xhr = sinon.xhr;\n    xhr.GlobalXMLHttpRequest = global.XMLHttpRequest;\n    xhr.GlobalActiveXObject = global.ActiveXObject;\n    xhr.supportsActiveX = typeof xhr.GlobalActiveXObject != \"undefined\";\n    xhr.supportsXHR = typeof xhr.GlobalXMLHttpRequest != \"undefined\";\n    xhr.workingXHR = xhr.supportsXHR ? xhr.GlobalXMLHttpRequest : xhr.supportsActiveX\n                                     ? function() { return new xhr.GlobalActiveXObject(\"MSXML2.XMLHTTP.3.0\") } : false;\n\n    /*jsl:ignore*/\n    var unsafeHeaders = {\n        \"Accept-Charset\": true,\n        \"Accept-Encoding\": true,\n        \"Connection\": true,\n        \"Content-Length\": true,\n        \"Cookie\": true,\n        \"Cookie2\": true,\n        \"Content-Transfer-Encoding\": true,\n        \"Date\": true,\n        \"Expect\": true,\n        \"Host\": true,\n        \"Keep-Alive\": true,\n        \"Referer\": true,\n        \"TE\": true,\n        \"Trailer\": true,\n        \"Transfer-Encoding\": true,\n        \"Upgrade\": true,\n        \"User-Agent\": true,\n        \"Via\": true\n    };\n    /*jsl:end*/\n\n    function FakeXMLHttpRequest() {\n        this.readyState = FakeXMLHttpRequest.UNSENT;\n        this.requestHeaders = {};\n        this.requestBody = null;\n        this.status = 0;\n        this.statusText = \"\";\n\n        var xhr = this;\n        var events = [\"loadstart\", \"load\", \"abort\", \"loadend\"];\n\n        function addEventListener(eventName) {\n            xhr.addEventListener(eventName, function (event) {\n                var listener = xhr[\"on\" + eventName];\n\n                if (listener && typeof listener == \"function\") {\n                    listener(event);\n                }\n            });\n        }\n\n        for (var i = events.length - 1; i >= 0; i--) {\n            addEventListener(events[i]);\n        }\n\n        if (typeof FakeXMLHttpRequest.onCreate == \"function\") {\n            FakeXMLHttpRequest.onCreate(this);\n        }\n    }\n\n    function verifyState(xhr) {\n        if (xhr.readyState !== FakeXMLHttpRequest.OPENED) {\n            throw new Error(\"INVALID_STATE_ERR\");\n        }\n\n        if (xhr.sendFlag) {\n            throw new Error(\"INVALID_STATE_ERR\");\n        }\n    }\n\n    // filtering to enable a white-list version of Sinon FakeXhr,\n    // where whitelisted requests are passed through to real XHR\n    function each(collection, callback) {\n        if (!collection) return;\n        for (var i = 0, l = collection.length; i < l; i += 1) {\n            callback(collection[i]);\n        }\n    }\n    function some(collection, callback) {\n        for (var index = 0; index < collection.length; index++) {\n            if(callback(collection[index]) === true) return true;\n        };\n        return false;\n    }\n    // largest arity in XHR is 5 - XHR#open\n    var apply = function(obj,method,args) {\n        switch(args.length) {\n        case 0: return obj[method]();\n        case 1: return obj[method](args[0]);\n        case 2: return obj[method](args[0],args[1]);\n        case 3: return obj[method](args[0],args[1],args[2]);\n        case 4: return obj[method](args[0],args[1],args[2],args[3]);\n        case 5: return obj[method](args[0],args[1],args[2],args[3],args[4]);\n        };\n    };\n\n    FakeXMLHttpRequest.filters = [];\n    FakeXMLHttpRequest.addFilter = function(fn) {\n        this.filters.push(fn)\n    };\n    var IE6Re = /MSIE 6/;\n    FakeXMLHttpRequest.defake = function(fakeXhr,xhrArgs) {\n        var xhr = new sinon.xhr.workingXHR();\n        each([\"open\",\"setRequestHeader\",\"send\",\"abort\",\"getResponseHeader\",\n              \"getAllResponseHeaders\",\"addEventListener\",\"overrideMimeType\",\"removeEventListener\"],\n             function(method) {\n                 fakeXhr[method] = function() {\n                   return apply(xhr,method,arguments);\n                 };\n             });\n\n        var copyAttrs = function(args) {\n            each(args, function(attr) {\n              try {\n                fakeXhr[attr] = xhr[attr]\n              } catch(e) {\n                if(!IE6Re.test(navigator.userAgent)) throw e;\n              }\n            });\n        };\n\n        var stateChange = function() {\n            fakeXhr.readyState = xhr.readyState;\n            if(xhr.readyState >= FakeXMLHttpRequest.HEADERS_RECEIVED) {\n                copyAttrs([\"status\",\"statusText\"]);\n            }\n            if(xhr.readyState >= FakeXMLHttpRequest.LOADING) {\n                copyAttrs([\"responseText\"]);\n            }\n            if(xhr.readyState === FakeXMLHttpRequest.DONE) {\n                copyAttrs([\"responseXML\"]);\n            }\n            if(fakeXhr.onreadystatechange) fakeXhr.onreadystatechange.call(fakeXhr);\n        };\n        if(xhr.addEventListener) {\n          for(var event in fakeXhr.eventListeners) {\n              if(fakeXhr.eventListeners.hasOwnProperty(event)) {\n                  each(fakeXhr.eventListeners[event],function(handler) {\n                      xhr.addEventListener(event, handler);\n                  });\n              }\n          }\n          xhr.addEventListener(\"readystatechange\",stateChange);\n        } else {\n          xhr.onreadystatechange = stateChange;\n        }\n        apply(xhr,\"open\",xhrArgs);\n    };\n    FakeXMLHttpRequest.useFilters = false;\n\n    function verifyRequestSent(xhr) {\n        if (xhr.readyState == FakeXMLHttpRequest.DONE) {\n            throw new Error(\"Request done\");\n        }\n    }\n\n    function verifyHeadersReceived(xhr) {\n        if (xhr.async && xhr.readyState != FakeXMLHttpRequest.HEADERS_RECEIVED) {\n            throw new Error(\"No headers received\");\n        }\n    }\n\n    function verifyResponseBodyType(body) {\n        if (typeof body != \"string\") {\n            var error = new Error(\"Attempted to respond to fake XMLHttpRequest with \" +\n                                 body + \", which is not a string.\");\n            error.name = \"InvalidBodyException\";\n            throw error;\n        }\n    }\n\n    sinon.extend(FakeXMLHttpRequest.prototype, sinon.EventTarget, {\n        async: true,\n\n        open: function open(method, url, async, username, password) {\n            this.method = method;\n            this.url = url;\n            this.async = typeof async == \"boolean\" ? async : true;\n            this.username = username;\n            this.password = password;\n            this.responseText = null;\n            this.responseXML = null;\n            this.requestHeaders = {};\n            this.sendFlag = false;\n            if(sinon.FakeXMLHttpRequest.useFilters === true) {\n                var xhrArgs = arguments;\n                var defake = some(FakeXMLHttpRequest.filters,function(filter) {\n                    return filter.apply(this,xhrArgs)\n                });\n                if (defake) {\n                  return sinon.FakeXMLHttpRequest.defake(this,arguments);\n                }\n            }\n            this.readyStateChange(FakeXMLHttpRequest.OPENED);\n        },\n\n        readyStateChange: function readyStateChange(state) {\n            this.readyState = state;\n\n            if (typeof this.onreadystatechange == \"function\") {\n                try {\n                    this.onreadystatechange();\n                } catch (e) {\n                    sinon.logError(\"Fake XHR onreadystatechange handler\", e);\n                }\n            }\n\n            this.dispatchEvent(new sinon.Event(\"readystatechange\"));\n\n            switch (this.readyState) {\n                case FakeXMLHttpRequest.DONE:\n                    this.dispatchEvent(new sinon.Event(\"load\", false, false, this));\n                    this.dispatchEvent(new sinon.Event(\"loadend\", false, false, this));\n                    break;\n            }\n        },\n\n        setRequestHeader: function setRequestHeader(header, value) {\n            verifyState(this);\n\n            if (unsafeHeaders[header] || /^(Sec-|Proxy-)/.test(header)) {\n                throw new Error(\"Refused to set unsafe header \\\"\" + header + \"\\\"\");\n            }\n\n            if (this.requestHeaders[header]) {\n                this.requestHeaders[header] += \",\" + value;\n            } else {\n                this.requestHeaders[header] = value;\n            }\n        },\n\n        // Helps testing\n        setResponseHeaders: function setResponseHeaders(headers) {\n            this.responseHeaders = {};\n\n            for (var header in headers) {\n                if (headers.hasOwnProperty(header)) {\n                    this.responseHeaders[header] = headers[header];\n                }\n            }\n\n            if (this.async) {\n                this.readyStateChange(FakeXMLHttpRequest.HEADERS_RECEIVED);\n            } else {\n                this.readyState = FakeXMLHttpRequest.HEADERS_RECEIVED;\n            }\n        },\n\n        // Currently treats ALL data as a DOMString (i.e. no Document)\n        send: function send(data) {\n            verifyState(this);\n\n            if (!/^(get|head)$/i.test(this.method)) {\n                if (this.requestHeaders[\"Content-Type\"]) {\n                    var value = this.requestHeaders[\"Content-Type\"].split(\";\");\n                    this.requestHeaders[\"Content-Type\"] = value[0] + \";charset=utf-8\";\n                } else {\n                    this.requestHeaders[\"Content-Type\"] = \"text/plain;charset=utf-8\";\n                }\n\n                this.requestBody = data;\n            }\n\n            this.errorFlag = false;\n            this.sendFlag = this.async;\n            this.readyStateChange(FakeXMLHttpRequest.OPENED);\n\n            if (typeof this.onSend == \"function\") {\n                this.onSend(this);\n            }\n\n            this.dispatchEvent(new sinon.Event(\"loadstart\", false, false, this));\n        },\n\n        abort: function abort() {\n            this.aborted = true;\n            this.responseText = null;\n            this.errorFlag = true;\n            this.requestHeaders = {};\n\n            if (this.readyState > sinon.FakeXMLHttpRequest.UNSENT && this.sendFlag) {\n                this.readyStateChange(sinon.FakeXMLHttpRequest.DONE);\n                this.sendFlag = false;\n            }\n\n            this.readyState = sinon.FakeXMLHttpRequest.UNSENT;\n\n            this.dispatchEvent(new sinon.Event(\"abort\", false, false, this));\n            if (typeof this.onerror === \"function\") {\n                this.onerror();\n            }\n        },\n\n        getResponseHeader: function getResponseHeader(header) {\n            if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {\n                return null;\n            }\n\n            if (/^Set-Cookie2?$/i.test(header)) {\n                return null;\n            }\n\n            header = header.toLowerCase();\n\n            for (var h in this.responseHeaders) {\n                if (h.toLowerCase() == header) {\n                    return this.responseHeaders[h];\n                }\n            }\n\n            return null;\n        },\n\n        getAllResponseHeaders: function getAllResponseHeaders() {\n            if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {\n                return \"\";\n            }\n\n            var headers = \"\";\n\n            for (var header in this.responseHeaders) {\n                if (this.responseHeaders.hasOwnProperty(header) &&\n                    !/^Set-Cookie2?$/i.test(header)) {\n                    headers += header + \": \" + this.responseHeaders[header] + \"\\r\\n\";\n                }\n            }\n\n            return headers;\n        },\n\n        setResponseBody: function setResponseBody(body) {\n            verifyRequestSent(this);\n            verifyHeadersReceived(this);\n            verifyResponseBodyType(body);\n\n            var chunkSize = this.chunkSize || 10;\n            var index = 0;\n            this.responseText = \"\";\n\n            do {\n                if (this.async) {\n                    this.readyStateChange(FakeXMLHttpRequest.LOADING);\n                }\n\n                this.responseText += body.substring(index, index + chunkSize);\n                index += chunkSize;\n            } while (index < body.length);\n\n            var type = this.getResponseHeader(\"Content-Type\");\n\n            if (this.responseText &&\n                (!type || /(text\\/xml)|(application\\/xml)|(\\+xml)/.test(type))) {\n                try {\n                    this.responseXML = FakeXMLHttpRequest.parseXML(this.responseText);\n                } catch (e) {\n                    // Unable to parse XML - no biggie\n                }\n            }\n\n            if (this.async) {\n                this.readyStateChange(FakeXMLHttpRequest.DONE);\n            } else {\n                this.readyState = FakeXMLHttpRequest.DONE;\n            }\n        },\n\n        respond: function respond(status, headers, body) {\n            this.setResponseHeaders(headers || {});\n            this.status = typeof status == \"number\" ? status : 200;\n            this.statusText = FakeXMLHttpRequest.statusCodes[this.status];\n            this.setResponseBody(body || \"\");\n            if (typeof this.onload === \"function\"){\n                this.onload();\n            }\n\n        }\n    });\n\n    sinon.extend(FakeXMLHttpRequest, {\n        UNSENT: 0,\n        OPENED: 1,\n        HEADERS_RECEIVED: 2,\n        LOADING: 3,\n        DONE: 4\n    });\n\n    // Borrowed from JSpec\n    FakeXMLHttpRequest.parseXML = function parseXML(text) {\n        var xmlDoc;\n\n        if (typeof DOMParser != \"undefined\") {\n            var parser = new DOMParser();\n            xmlDoc = parser.parseFromString(text, \"text/xml\");\n        } else {\n            xmlDoc = new ActiveXObject(\"Microsoft.XMLDOM\");\n            xmlDoc.async = \"false\";\n            xmlDoc.loadXML(text);\n        }\n\n        return xmlDoc;\n    };\n\n    FakeXMLHttpRequest.statusCodes = {\n        100: \"Continue\",\n        101: \"Switching Protocols\",\n        200: \"OK\",\n        201: \"Created\",\n        202: \"Accepted\",\n        203: \"Non-Authoritative Information\",\n        204: \"No Content\",\n        205: \"Reset Content\",\n        206: \"Partial Content\",\n        300: \"Multiple Choice\",\n        301: \"Moved Permanently\",\n        302: \"Found\",\n        303: \"See Other\",\n        304: \"Not Modified\",\n        305: \"Use Proxy\",\n        307: \"Temporary Redirect\",\n        400: \"Bad Request\",\n        401: \"Unauthorized\",\n        402: \"Payment Required\",\n        403: \"Forbidden\",\n        404: \"Not Found\",\n        405: \"Method Not Allowed\",\n        406: \"Not Acceptable\",\n        407: \"Proxy Authentication Required\",\n        408: \"Request Timeout\",\n        409: \"Conflict\",\n        410: \"Gone\",\n        411: \"Length Required\",\n        412: \"Precondition Failed\",\n        413: \"Request Entity Too Large\",\n        414: \"Request-URI Too Long\",\n        415: \"Unsupported Media Type\",\n        416: \"Requested Range Not Satisfiable\",\n        417: \"Expectation Failed\",\n        422: \"Unprocessable Entity\",\n        500: \"Internal Server Error\",\n        501: \"Not Implemented\",\n        502: \"Bad Gateway\",\n        503: \"Service Unavailable\",\n        504: \"Gateway Timeout\",\n        505: \"HTTP Version Not Supported\"\n    };\n\n    sinon.useFakeXMLHttpRequest = function () {\n        sinon.FakeXMLHttpRequest.restore = function restore(keepOnCreate) {\n            if (xhr.supportsXHR) {\n                global.XMLHttpRequest = xhr.GlobalXMLHttpRequest;\n            }\n\n            if (xhr.supportsActiveX) {\n                global.ActiveXObject = xhr.GlobalActiveXObject;\n            }\n\n            delete sinon.FakeXMLHttpRequest.restore;\n\n            if (keepOnCreate !== true) {\n                delete sinon.FakeXMLHttpRequest.onCreate;\n            }\n        };\n        if (xhr.supportsXHR) {\n            global.XMLHttpRequest = sinon.FakeXMLHttpRequest;\n        }\n\n        if (xhr.supportsActiveX) {\n            global.ActiveXObject = function ActiveXObject(objId) {\n                if (objId == \"Microsoft.XMLHTTP\" || /^Msxml2\\.XMLHTTP/i.test(objId)) {\n\n                    return new sinon.FakeXMLHttpRequest();\n                }\n\n                return new xhr.GlobalActiveXObject(objId);\n            };\n        }\n\n        return sinon.FakeXMLHttpRequest;\n    };\n\n    sinon.FakeXMLHttpRequest = FakeXMLHttpRequest;\n})(this);\n\nif (typeof module == \"object\" && typeof require == \"function\") {\n    module.exports = sinon;\n}\n\n/**\n * @depend fake_xml_http_request.js\n */\n/*jslint eqeqeq: false, onevar: false, regexp: false, plusplus: false*/\n/*global module, require, window*/\n/**\n * The Sinon \"server\" mimics a web server that receives requests from\n * sinon.FakeXMLHttpRequest and provides an API to respond to those requests,\n * both synchronously and asynchronously. To respond synchronuously, canned\n * answers have to be provided upfront.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\nif (typeof sinon == \"undefined\") {\n    var sinon = {};\n}\n\nsinon.fakeServer = (function () {\n    var push = [].push;\n    function F() {}\n\n    function create(proto) {\n        F.prototype = proto;\n        return new F();\n    }\n\n    function responseArray(handler) {\n        var response = handler;\n\n        if (Object.prototype.toString.call(handler) != \"[object Array]\") {\n            response = [200, {}, handler];\n        }\n\n        if (typeof response[2] != \"string\") {\n            throw new TypeError(\"Fake server response body should be string, but was \" +\n                                typeof response[2]);\n        }\n\n        return response;\n    }\n\n    var wloc = typeof window !== \"undefined\" ? window.location : {};\n    var rCurrLoc = new RegExp(\"^\" + wloc.protocol + \"//\" + wloc.host);\n\n    function matchOne(response, reqMethod, reqUrl) {\n        var rmeth = response.method;\n        var matchMethod = !rmeth || rmeth.toLowerCase() == reqMethod.toLowerCase();\n        var url = response.url;\n        var matchUrl = !url || url == reqUrl || (typeof url.test == \"function\" && url.test(reqUrl));\n\n        return matchMethod && matchUrl;\n    }\n\n    function match(response, request) {\n        var requestMethod = this.getHTTPMethod(request);\n        var requestUrl = request.url;\n\n        if (!/^https?:\\/\\//.test(requestUrl) || rCurrLoc.test(requestUrl)) {\n            requestUrl = requestUrl.replace(rCurrLoc, \"\");\n        }\n\n        if (matchOne(response, this.getHTTPMethod(request), requestUrl)) {\n            if (typeof response.response == \"function\") {\n                var ru = response.url;\n                var args = [request].concat(!ru ? [] : requestUrl.match(ru).slice(1));\n                return response.response.apply(response, args);\n            }\n\n            return true;\n        }\n\n        return false;\n    }\n\n    function log(response, request) {\n        var str;\n\n        str =  \"Request:\\n\"  + sinon.format(request)  + \"\\n\\n\";\n        str += \"Response:\\n\" + sinon.format(response) + \"\\n\\n\";\n\n        sinon.log(str);\n    }\n\n    return {\n        create: function () {\n            var server = create(this);\n            this.xhr = sinon.useFakeXMLHttpRequest();\n            server.requests = [];\n\n            this.xhr.onCreate = function (xhrObj) {\n                server.addRequest(xhrObj);\n            };\n\n            return server;\n        },\n\n        addRequest: function addRequest(xhrObj) {\n            var server = this;\n            push.call(this.requests, xhrObj);\n\n            xhrObj.onSend = function () {\n                server.handleRequest(this);\n            };\n\n            if (this.autoRespond && !this.responding) {\n                setTimeout(function () {\n                    server.responding = false;\n                    server.respond();\n                }, this.autoRespondAfter || 10);\n\n                this.responding = true;\n            }\n        },\n\n        getHTTPMethod: function getHTTPMethod(request) {\n            if (this.fakeHTTPMethods && /post/i.test(request.method)) {\n                var matches = (request.requestBody || \"\").match(/_method=([^\\b;]+)/);\n                return !!matches ? matches[1] : request.method;\n            }\n\n            return request.method;\n        },\n\n        handleRequest: function handleRequest(xhr) {\n            if (xhr.async) {\n                if (!this.queue) {\n                    this.queue = [];\n                }\n\n                push.call(this.queue, xhr);\n            } else {\n                this.processRequest(xhr);\n            }\n        },\n\n        respondWith: function respondWith(method, url, body) {\n            if (arguments.length == 1 && typeof method != \"function\") {\n                this.response = responseArray(method);\n                return;\n            }\n\n            if (!this.responses) { this.responses = []; }\n\n            if (arguments.length == 1) {\n                body = method;\n                url = method = null;\n            }\n\n            if (arguments.length == 2) {\n                body = url;\n                url = method;\n                method = null;\n            }\n\n            push.call(this.responses, {\n                method: method,\n                url: url,\n                response: typeof body == \"function\" ? body : responseArray(body)\n            });\n        },\n\n        respond: function respond() {\n            if (arguments.length > 0) this.respondWith.apply(this, arguments);\n            var queue = this.queue || [];\n            var request;\n\n            while(request = queue.shift()) {\n                this.processRequest(request);\n            }\n        },\n\n        processRequest: function processRequest(request) {\n            try {\n                if (request.aborted) {\n                    return;\n                }\n\n                var response = this.response || [404, {}, \"\"];\n\n                if (this.responses) {\n                    for (var i = 0, l = this.responses.length; i < l; i++) {\n                        if (match.call(this, this.responses[i], request)) {\n                            response = this.responses[i].response;\n                            break;\n                        }\n                    }\n                }\n\n                if (request.readyState != 4) {\n                    log(response, request);\n\n                    request.respond(response[0], response[1], response[2]);\n                }\n            } catch (e) {\n                sinon.logError(\"Fake server request processing\", e);\n            }\n        },\n\n        restore: function restore() {\n            return this.xhr.restore && this.xhr.restore.apply(this.xhr, arguments);\n        }\n    };\n}());\n\nif (typeof module == \"object\" && typeof require == \"function\") {\n    module.exports = sinon;\n}\n\n/**\n * @depend fake_server.js\n * @depend fake_timers.js\n */\n/*jslint browser: true, eqeqeq: false, onevar: false*/\n/*global sinon*/\n/**\n * Add-on for sinon.fakeServer that automatically handles a fake timer along with\n * the FakeXMLHttpRequest. The direct inspiration for this add-on is jQuery\n * 1.3.x, which does not use xhr object's onreadystatehandler at all - instead,\n * it polls the object for completion with setInterval. Dispite the direct\n * motivation, there is nothing jQuery-specific in this file, so it can be used\n * in any environment where the ajax implementation depends on setInterval or\n * setTimeout.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function () {\n    function Server() {}\n    Server.prototype = sinon.fakeServer;\n\n    sinon.fakeServerWithClock = new Server();\n\n    sinon.fakeServerWithClock.addRequest = function addRequest(xhr) {\n        if (xhr.async) {\n            if (typeof setTimeout.clock == \"object\") {\n                this.clock = setTimeout.clock;\n            } else {\n                this.clock = sinon.useFakeTimers();\n                this.resetClock = true;\n            }\n\n            if (!this.longestTimeout) {\n                var clockSetTimeout = this.clock.setTimeout;\n                var clockSetInterval = this.clock.setInterval;\n                var server = this;\n\n                this.clock.setTimeout = function (fn, timeout) {\n                    server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);\n\n                    return clockSetTimeout.apply(this, arguments);\n                };\n\n                this.clock.setInterval = function (fn, timeout) {\n                    server.longestTimeout = Math.max(timeout, server.longestTimeout || 0);\n\n                    return clockSetInterval.apply(this, arguments);\n                };\n            }\n        }\n\n        return sinon.fakeServer.addRequest.call(this, xhr);\n    };\n\n    sinon.fakeServerWithClock.respond = function respond() {\n        var returnVal = sinon.fakeServer.respond.apply(this, arguments);\n\n        if (this.clock) {\n            this.clock.tick(this.longestTimeout || 0);\n            this.longestTimeout = 0;\n\n            if (this.resetClock) {\n                this.clock.restore();\n                this.resetClock = false;\n            }\n        }\n\n        return returnVal;\n    };\n\n    sinon.fakeServerWithClock.restore = function restore() {\n        if (this.clock) {\n            this.clock.restore();\n        }\n\n        return sinon.fakeServer.restore.apply(this, arguments);\n    };\n}());\n\n/**\n * @depend ../sinon.js\n * @depend collection.js\n * @depend util/fake_timers.js\n * @depend util/fake_server_with_clock.js\n */\n/*jslint eqeqeq: false, onevar: false, plusplus: false*/\n/*global require, module*/\n/**\n * Manages fake collections as well as fake utilities such as Sinon's\n * timers and fake XHR implementation in one convenient object.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\nif (typeof module == \"object\" && typeof require == \"function\") {\n    var sinon = require(\"../sinon\");\n    sinon.extend(sinon, require(\"./util/fake_timers\"));\n}\n\n(function () {\n    var push = [].push;\n\n    function exposeValue(sandbox, config, key, value) {\n        if (!value) {\n            return;\n        }\n\n        if (config.injectInto) {\n            config.injectInto[key] = value;\n        } else {\n            push.call(sandbox.args, value);\n        }\n    }\n\n    function prepareSandboxFromConfig(config) {\n        var sandbox = sinon.create(sinon.sandbox);\n\n        if (config.useFakeServer) {\n            if (typeof config.useFakeServer == \"object\") {\n                sandbox.serverPrototype = config.useFakeServer;\n            }\n\n            sandbox.useFakeServer();\n        }\n\n        if (config.useFakeTimers) {\n            if (typeof config.useFakeTimers == \"object\") {\n                sandbox.useFakeTimers.apply(sandbox, config.useFakeTimers);\n            } else {\n                sandbox.useFakeTimers();\n            }\n        }\n\n        return sandbox;\n    }\n\n    sinon.sandbox = sinon.extend(sinon.create(sinon.collection), {\n        useFakeTimers: function useFakeTimers() {\n            this.clock = sinon.useFakeTimers.apply(sinon, arguments);\n\n            return this.add(this.clock);\n        },\n\n        serverPrototype: sinon.fakeServer,\n\n        useFakeServer: function useFakeServer() {\n            var proto = this.serverPrototype || sinon.fakeServer;\n\n            if (!proto || !proto.create) {\n                return null;\n            }\n\n            this.server = proto.create();\n            return this.add(this.server);\n        },\n\n        inject: function (obj) {\n            sinon.collection.inject.call(this, obj);\n\n            if (this.clock) {\n                obj.clock = this.clock;\n            }\n\n            if (this.server) {\n                obj.server = this.server;\n                obj.requests = this.server.requests;\n            }\n\n            return obj;\n        },\n\n        create: function (config) {\n            if (!config) {\n                return sinon.create(sinon.sandbox);\n            }\n\n            var sandbox = prepareSandboxFromConfig(config);\n            sandbox.args = sandbox.args || [];\n            var prop, value, exposed = sandbox.inject({});\n\n            if (config.properties) {\n                for (var i = 0, l = config.properties.length; i < l; i++) {\n                    prop = config.properties[i];\n                    value = exposed[prop] || prop == \"sandbox\" && sandbox;\n                    exposeValue(sandbox, config, prop, value);\n                }\n            } else {\n                exposeValue(sandbox, config, \"sandbox\", value);\n            }\n\n            return sandbox;\n        }\n    });\n\n    sinon.sandbox.useFakeXMLHttpRequest = sinon.sandbox.useFakeServer;\n\n    if (typeof module == \"object\" && typeof require == \"function\") {\n        module.exports = sinon.sandbox;\n    }\n}());\n\n/**\n * @depend ../sinon.js\n * @depend stub.js\n * @depend mock.js\n * @depend sandbox.js\n */\n/*jslint eqeqeq: false, onevar: false, forin: true, plusplus: false*/\n/*global module, require, sinon*/\n/**\n * Test function, sandboxes fakes\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon) {\n    var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\n    if (!sinon && commonJSModule) {\n        sinon = require(\"../sinon\");\n    }\n\n    if (!sinon) {\n        return;\n    }\n\n    function test(callback) {\n        var type = typeof callback;\n\n        if (type != \"function\") {\n            throw new TypeError(\"sinon.test needs to wrap a test function, got \" + type);\n        }\n\n        return function () {\n            var config = sinon.getConfig(sinon.config);\n            config.injectInto = config.injectIntoThis && this || config.injectInto;\n            var sandbox = sinon.sandbox.create(config);\n            var exception, result;\n            var args = Array.prototype.slice.call(arguments).concat(sandbox.args);\n\n            try {\n                result = callback.apply(this, args);\n            } catch (e) {\n                exception = e;\n            }\n\n            if (typeof exception !== \"undefined\") {\n                sandbox.restore();\n                throw exception;\n            }\n            else {\n                sandbox.verifyAndRestore();\n            }\n\n            return result;\n        };\n    }\n\n    test.config = {\n        injectIntoThis: true,\n        injectInto: null,\n        properties: [\"spy\", \"stub\", \"mock\", \"clock\", \"server\", \"requests\"],\n        useFakeTimers: true,\n        useFakeServer: true\n    };\n\n    if (commonJSModule) {\n        module.exports = test;\n    } else {\n        sinon.test = test;\n    }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend ../sinon.js\n * @depend test.js\n */\n/*jslint eqeqeq: false, onevar: false, eqeqeq: false*/\n/*global module, require, sinon*/\n/**\n * Test case, sandboxes all test functions\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon) {\n    var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n\n    if (!sinon && commonJSModule) {\n        sinon = require(\"../sinon\");\n    }\n\n    if (!sinon || !Object.prototype.hasOwnProperty) {\n        return;\n    }\n\n    function createTest(property, setUp, tearDown) {\n        return function () {\n            if (setUp) {\n                setUp.apply(this, arguments);\n            }\n\n            var exception, result;\n\n            try {\n                result = property.apply(this, arguments);\n            } catch (e) {\n                exception = e;\n            }\n\n            if (tearDown) {\n                tearDown.apply(this, arguments);\n            }\n\n            if (exception) {\n                throw exception;\n            }\n\n            return result;\n        };\n    }\n\n    function testCase(tests, prefix) {\n        /*jsl:ignore*/\n        if (!tests || typeof tests != \"object\") {\n            throw new TypeError(\"sinon.testCase needs an object with test functions\");\n        }\n        /*jsl:end*/\n\n        prefix = prefix || \"test\";\n        var rPrefix = new RegExp(\"^\" + prefix);\n        var methods = {}, testName, property, method;\n        var setUp = tests.setUp;\n        var tearDown = tests.tearDown;\n\n        for (testName in tests) {\n            if (tests.hasOwnProperty(testName)) {\n                property = tests[testName];\n\n                if (/^(setUp|tearDown)$/.test(testName)) {\n                    continue;\n                }\n\n                if (typeof property == \"function\" && rPrefix.test(testName)) {\n                    method = property;\n\n                    if (setUp || tearDown) {\n                        method = createTest(property, setUp, tearDown);\n                    }\n\n                    methods[testName] = sinon.test(method);\n                } else {\n                    methods[testName] = tests[testName];\n                }\n            }\n        }\n\n        return methods;\n    }\n\n    if (commonJSModule) {\n        module.exports = testCase;\n    } else {\n        sinon.testCase = testCase;\n    }\n}(typeof sinon == \"object\" && sinon || null));\n\n/**\n * @depend ../sinon.js\n * @depend stub.js\n */\n/*jslint eqeqeq: false, onevar: false, nomen: false, plusplus: false*/\n/*global module, require, sinon*/\n/**\n * Assertions matching the test spy retrieval interface.\n *\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2010-2013 Christian Johansen\n */\n\n(function (sinon, global) {\n    var commonJSModule = typeof module == \"object\" && typeof require == \"function\";\n    var slice = Array.prototype.slice;\n    var assert;\n\n    if (!sinon && commonJSModule) {\n        sinon = require(\"../sinon\");\n    }\n\n    if (!sinon) {\n        return;\n    }\n\n    function verifyIsStub() {\n        var method;\n\n        for (var i = 0, l = arguments.length; i < l; ++i) {\n            method = arguments[i];\n\n            if (!method) {\n                assert.fail(\"fake is not a spy\");\n            }\n\n            if (typeof method != \"function\") {\n                assert.fail(method + \" is not a function\");\n            }\n\n            if (typeof method.getCall != \"function\") {\n                assert.fail(method + \" is not stubbed\");\n            }\n        }\n    }\n\n    function failAssertion(object, msg) {\n        object = object || global;\n        var failMethod = object.fail || assert.fail;\n        failMethod.call(object, msg);\n    }\n\n    function mirrorPropAsAssertion(name, method, message) {\n        if (arguments.length == 2) {\n            message = method;\n            method = name;\n        }\n\n        assert[name] = function (fake) {\n            verifyIsStub(fake);\n\n            var args = slice.call(arguments, 1);\n            var failed = false;\n\n            if (typeof method == \"function\") {\n                failed = !method(fake);\n            } else {\n                failed = typeof fake[method] == \"function\" ?\n                    !fake[method].apply(fake, args) : !fake[method];\n            }\n\n            if (failed) {\n                failAssertion(this, fake.printf.apply(fake, [message].concat(args)));\n            } else {\n                assert.pass(name);\n            }\n        };\n    }\n\n    function exposedName(prefix, prop) {\n        return !prefix || /^fail/.test(prop) ? prop :\n            prefix + prop.slice(0, 1).toUpperCase() + prop.slice(1);\n    };\n\n    assert = {\n        failException: \"AssertError\",\n\n        fail: function fail(message) {\n            var error = new Error(message);\n            error.name = this.failException || assert.failException;\n\n            throw error;\n        },\n\n        pass: function pass(assertion) {},\n\n        callOrder: function assertCallOrder() {\n            verifyIsStub.apply(null, arguments);\n            var expected = \"\", actual = \"\";\n\n            if (!sinon.calledInOrder(arguments)) {\n                try {\n                    expected = [].join.call(arguments, \", \");\n                    var calls = slice.call(arguments);\n                    var i = calls.length;\n                    while (i) {\n                        if (!calls[--i].called) {\n                            calls.splice(i, 1);\n                        }\n                    }\n                    actual = sinon.orderByFirstCall(calls).join(\", \");\n                } catch (e) {\n                    // If this fails, we'll just fall back to the blank string\n                }\n\n                failAssertion(this, \"expected \" + expected + \" to be \" +\n                              \"called in order but were called as \" + actual);\n            } else {\n                assert.pass(\"callOrder\");\n            }\n        },\n\n        callCount: function assertCallCount(method, count) {\n            verifyIsStub(method);\n\n            if (method.callCount != count) {\n                var msg = \"expected %n to be called \" + sinon.timesInWords(count) +\n                    \" but was called %c%C\";\n                failAssertion(this, method.printf(msg));\n            } else {\n                assert.pass(\"callCount\");\n            }\n        },\n\n        expose: function expose(target, options) {\n            if (!target) {\n                throw new TypeError(\"target is null or undefined\");\n            }\n\n            var o = options || {};\n            var prefix = typeof o.prefix == \"undefined\" && \"assert\" || o.prefix;\n            var includeFail = typeof o.includeFail == \"undefined\" || !!o.includeFail;\n\n            for (var method in this) {\n                if (method != \"export\" && (includeFail || !/^(fail)/.test(method))) {\n                    target[exposedName(prefix, method)] = this[method];\n                }\n            }\n\n            return target;\n        }\n    };\n\n    mirrorPropAsAssertion(\"called\", \"expected %n to have been called at least once but was never called\");\n    mirrorPropAsAssertion(\"notCalled\", function (spy) { return !spy.called; },\n                          \"expected %n to not have been called but was called %c%C\");\n    mirrorPropAsAssertion(\"calledOnce\", \"expected %n to be called once but was called %c%C\");\n    mirrorPropAsAssertion(\"calledTwice\", \"expected %n to be called twice but was called %c%C\");\n    mirrorPropAsAssertion(\"calledThrice\", \"expected %n to be called thrice but was called %c%C\");\n    mirrorPropAsAssertion(\"calledOn\", \"expected %n to be called with %1 as this but was called with %t\");\n    mirrorPropAsAssertion(\"alwaysCalledOn\", \"expected %n to always be called with %1 as this but was called with %t\");\n    mirrorPropAsAssertion(\"calledWithNew\", \"expected %n to be called with new\");\n    mirrorPropAsAssertion(\"alwaysCalledWithNew\", \"expected %n to always be called with new\");\n    mirrorPropAsAssertion(\"calledWith\", \"expected %n to be called with arguments %*%C\");\n    mirrorPropAsAssertion(\"calledWithMatch\", \"expected %n to be called with match %*%C\");\n    mirrorPropAsAssertion(\"alwaysCalledWith\", \"expected %n to always be called with arguments %*%C\");\n    mirrorPropAsAssertion(\"alwaysCalledWithMatch\", \"expected %n to always be called with match %*%C\");\n    mirrorPropAsAssertion(\"calledWithExactly\", \"expected %n to be called with exact arguments %*%C\");\n    mirrorPropAsAssertion(\"alwaysCalledWithExactly\", \"expected %n to always be called with exact arguments %*%C\");\n    mirrorPropAsAssertion(\"neverCalledWith\", \"expected %n to never be called with arguments %*%C\");\n    mirrorPropAsAssertion(\"neverCalledWithMatch\", \"expected %n to never be called with match %*%C\");\n    mirrorPropAsAssertion(\"threw\", \"%n did not throw exception%C\");\n    mirrorPropAsAssertion(\"alwaysThrew\", \"%n did not always throw exception%C\");\n\n    if (commonJSModule) {\n        module.exports = assert;\n    } else {\n        sinon.assert = assert;\n    }\n}(typeof sinon == \"object\" && sinon || null, typeof window != \"undefined\" ? window : (typeof self != \"undefined\") ? self : global));\n\nreturn sinon;}.call(typeof window != 'undefined' && window || {}));\n"
  },
  {
    "path": "bower_components/uwidget/.bower.json",
    "content": "{\n  \"name\": \"uwidget\",\n  \"version\": \"0.0.2\",\n  \"devDependencies\": {\n    \"jquery\": \"~1.10.0\"\n  },\n  \"keywords\": [\n    \"widget\",\n    \"API\",\n    \"jquery\"\n  ],\n  \"author\": {\n    \"name\": \"Guillaume Potier\",\n    \"email\": \"guillaume@wisembly.com\",\n    \"url\": \"http://guillaumepotier.com/\"\n  },\n  \"license\": \"MIT\",\n  \"homepage\": \"https://github.com/guillaumepotier/uwidget\",\n  \"_release\": \"0.0.2\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"0.0.2\",\n    \"commit\": \"5324c86db19b6c062780caf30d63861809eb82b0\"\n  },\n  \"_source\": \"git://github.com/guillaumepotier/uwidget.git\",\n  \"_target\": \"~0.0.1\",\n  \"_originalSource\": \"uwidget\"\n}"
  },
  {
    "path": "bower_components/uwidget/LICENSE",
    "content": "Copyright 2013-2014 Guillaume Potier and contributors\nhttp://github.com/guillaumepotier/uwidget\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "bower_components/uwidget/README.md",
    "content": "# Universal Widget\n\nThe aim of this very simple widget is to easily display a API-distant collection\nof objects, with simple sorting and filters option.\n\n# Requirements\n\njQuery >= 1.6\n\n# Installation\n\n```html\n<html>\n<head>\n<link href=\"gh-issues-widget.css\" rel=\"stylesheet\">\n</head>\n<body>\n  <div class=\"uwidget\" data-width=\"500px\" data-height=\"300px\"></div>\n  <script type=\"text/javascript\">\n    $(document).ready(function () {\n      $('.uwidget').UWidget({\n        url: 'https://api.url.ext',\n        handler: function (data) {\n          // special remote data treatment needed ?\n          return data;\n        },\n        template: 'item_tmpl',\n        sort: {\n          enabled: true,\n          name: 'sort',\n          values: ['created', 'updated', 'comments'],\n          labels: ['Creation date', 'Update date', 'Comments']\n        },\n        direction: {\n          enabled: true,\n          name: 'direction',\n          values: ['desc', 'asc'],\n          labels: ['Descending', 'Ascending']\n        },\n        filters: {\n          enabled: true,\n          name: 'labels',\n          values: ['bug', 'enhancement'],\n          labels: ['Bug', 'Enhancement']\n        }\n      });\n    });\n  </script>\n  <script type=\"text/html\" id=\"item_tmpl\">\n    <li>\n      <span class=\"gh-issue-comments\">\n        <%= comments %> <%= comments > 1 ? \"comments\" : \"commment\" %>\n      </span>\n      <span class=\"gh-issue-title\">\n        <a href=\"<%= html_url %>\"><%= title %></a>\n      </span>\n    </li>\n  </script>\n</body>\n</html>\n```\n\n## Configuration\n\nYou can pass some default parameters to the widget div:\n\n  - `data-sort`: default sorting method\n  - `data-direction`: default sorting direction\n  - `data-filters=\"filter1, filter2, ..\"`: default active filters\n  - `data-remote-options`: a valid JSON options object that allows you some\n  control over the `$.ajax()` call made by the widget\n\n## License\n\nReleased under the MIT License. See the bundled `LICENSE` file for\ndetails.\n"
  },
  {
    "path": "bower_components/uwidget/bower.json",
    "content": "{\n  \"name\": \"uwidget\",\n  \"version\": \"0.0.1\",\n  \"devDependencies\": {\n    \"jquery\": \"~1.10.0\"\n  },\n  \"keywords\": [\n    \"widget\",\n    \"API\",\n    \"jquery\"\n  ],\n  \"author\": {\n    \"name\": \"Guillaume Potier\",\n    \"email\": \"guillaume@wisembly.com\",\n    \"url\": \"http://guillaumepotier.com/\"\n  },\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "bower_components/uwidget/uwidget.css",
    "content": ".uwidget {\n  border: 1px solid #e5e5e5;\n}\n.uwidget .uwidget-actions {\n  display: block;\n  height: 22px;\n  background-color: #f5f5f5;\n}\n.uwidget .uwidget-actions .filters {\n  float: right;\n}\n.uwidget .uwidget-info {\n  display: block;\n  height: 15px;\n  color: #999999;\n  font-size: 10px;\n  text-align: right;\n  background-color: #f5f5f5;\n}\n.uwidget .uwidget-info a,\n.uwidget .uwidget-info a:hover,\n.uwidget .uwidget-info a:visited {\n  color: #999999;\n  text-decoration: none;\n}\n.uwidget ul.uwidget-container {\n  display: block;\n  margin: 0;\n  padding: 2px;\n  list-style: none;\n  text-align: justify;\n  overflow-x: hidden;\n  overflow-y: scroll;\n}\n.uwidget ul.uwidget-container li {\n  position: relative;\n  display: block;\n  margin-bottom: -1px;\n  padding: 8px;\n  border-bottom: 1px solid #e5e5e5;\n}\n.uwidget ul.uwidget-container li:last-child {\n  border: none;\n}\n"
  },
  {
    "path": "bower_components/uwidget/uwidget.js",
    "content": "!(function ($) {\n\n  var UWidget = function (element, options) {\n    this.init($(element), options);\n  };\n\n  UWidget.prototype = {\n    options: {\n      url: null,\n      handler: null,\n      template: null,\n      sort: {\n        enabled: false,\n        name: 'sort',\n        values: ['id', 'date'],\n        labels: ['Identifier', 'Date']\n      },\n      direction: {\n        enabled: false,\n        name: 'direction',\n        values: ['desc', 'asc'],\n        labels: ['Descending', 'Ascending']\n      },\n      filters: {\n        ebabled: false,\n        name: 'filters',\n        values: [],\n        labels: []\n      }\n    },\n\n    init: function ($element, options) {\n      this.$element = $element;\n      this.options = $.extend(true, {}, this.options, options);\n      this._xhrCache = {};\n\n      if (!this.options.url || !this.options.handler || !this.options.template)\n        throw new Error('You must define a widget url, an ajax handler and a template');\n\n      this\n        ._initActions()\n        ._initFromDOM()\n        .fetch();\n    },\n\n    _initActions: function () {\n      var i, checked;\n      this.$actions = $('<span class=\"uwidget-actions\"></span>');\n\n      if (this.options.sort.enabled) {\n        this.$sort = $('<select name=\"'+ this.options.sort.name +'\"></select>')\n          .on('change', false, $.proxy(this._updateActions, this));\n\n        for (i = 0; i < this.options.sort.values.length; i++)\n          this.$sort.append('<option value=\"' + this.options.sort.values[i] + '\">' + this.options.sort.labels[i] + '</option>');\n\n        this.$actions.append(this.$sort);\n      }\n\n      if (this.options.direction.enabled) {\n        this.$direction = $('<select name=\"'+ this.options.direction.name +'\"></select>')\n          .on('change', false, $.proxy(this._updateActions, this));\n\n        for (i = 0; i < this.options.direction.values.length; i++)\n          this.$direction.append('<option value=\"' + this.options.direction.values[i] + '\">' + this.options.direction.labels[i] + '</option>');\n\n        this.$actions.append(this.$direction);\n      }\n\n      if (this.options.filters.enabled) {\n        this.$filters = $('<span class=\"filters\"></span>')\n          .on('change', false, $.proxy(this._updateActions, this));\n\n        for (i = 0; i < this.options.filters.values.length; i++) {\n          checked = this.$element.data('filters') && new RegExp(this.options.filters.labels[i], 'i').test(this.$element.data('filters'));\n          this.$filters.append(this.options.filters.labels[i] + ' <input type=\"checkbox\" name=\"filters[]\" value=\"' + this.options.filters.values[i] + '\" ' + (checked ? 'checked' : '') + '/>');\n        }\n\n        this.$actions.append(this.$filters);\n      }\n\n      this.$container = $('<ul class=\"uwidget-container\"></ul>');\n      this.$info = $('<span class=\"uwidget-info\"><a href=\"#\" target=\"_blank\">UWidget</a></span>');\n\n      this.$element\n        .append(this.$actions)\n        .append(this.$container)\n        .append(this.$info);\n\n      this._updateActions();\n\n      return this;\n    },\n\n    _initFromDOM: function () {\n      if (this.$element.data('width'))\n        this.$element.css('width', this.$element.data('width'));\n\n      if (this.$element.data('height')) {\n        this.$element.css('height', this.$element.data('height'));\n        this.$container.css('height', this.$element.height() - this.$actions.height() - this.$info.height());\n      }\n\n      return this;\n    },\n\n    _updateActions: function () {\n      if (this.options.sort.enabled)\n        this.$element.data('sort', this.$sort.val());\n\n      if (this.options.direction.enabled)\n        this.$element.data('direction', this.$direction.val());\n\n      if (this.options.filters.enabled) {\n        var val = [];\n\n        this.$actions.find('input[type=checkbox]:checked').each(function () {\n          val.push($(this).val());\n        });\n\n        this.$element.data('filters', val.join(', '));\n      }\n\n      this.fetch();\n    },\n\n    getUrl: function () {\n      var url = ('function' === typeof this.options.url ? this.options.url(this.options) : this.options.url),\n        options = ['sort', 'direction', 'filters'],\n        value = '';\n\n      url += -1 !== url.indexOf('?') ? '&uwidget' : '?uwidget';\n\n      for (var i = 0; i < options.length; i++) {\n        value = this.$element.data([options[i]] + '');\n\n        if (this.options[options[i]].enabled && value.length)\n          url += '&' + this.options[options[i]].name + '=' + value;\n      }\n\n      return url;\n    },\n\n    fetch: function () {\n      var that = this,\n        url = that.getUrl();\n\n      this.$element\n        .removeClass('error')\n        .removeClass('fetched')\n        .addClass('fetching');\n\n      if ('undefined' !== typeof this._xhrCache[url])\n        return this._updateCollection.apply(this, this._xhrCache[url]);\n\n      $.ajax($.extend(true, {}, {\n        url: url\n      }, that.$element.data('remoteOptions')))\n        .done(function () {\n          that._updateCollection.apply(that, arguments);\n          that._xhrCache[url] = arguments;\n        })\n        .fail(function () {\n          that.$container.addClass('error');\n        })\n        .always(function () {\n          that.$container.removeClass('fetching');\n        });\n    },\n\n    _updateCollection: function (collection) {\n      this.$container.html('').addClass('fetched');\n      collection = this.options.handler.apply(this, arguments);\n\n      for (var i = 0; i < collection.length; i++)\n        this.$container.append(tmpl(this.options.template, collection[i]));\n    }\n  };\n\n  $.fn.UWidget = function (options) {\n    return new UWidget(this, options);\n  };\n\n  // Simple JavaScript Templating\n  // John Resig - http://ejohn.org/ - MIT Licensed\n  (function(){\n    var cache = {};\n\n    this.tmpl = function tmpl(str, data){\n      // Figure out if we're getting a template, or if we need to\n      // load the template - and be sure to cache the result.\n      var fn = !/\\W/.test(str) ?\n        cache[str] = cache[str] ||\n          tmpl(document.getElementById(str).innerHTML) :\n\n        // Generate a reusable function that will serve as a template\n        // generator (and which will be cached).\n        new Function(\"obj\",\n          \"var p=[],print=function(){p.push.apply(p,arguments);};\" +\n\n          // Introduce the data as local variables using with(){}\n          \"with(obj){p.push('\" +\n\n          // Convert the template into pure JavaScript\n          str\n            .replace(/[\\r\\t\\n]/g, \" \")\n            .split(\"<%\").join(\"\\t\")\n            .replace(/((^|%>)[^\\t]*)'/g, \"$1\\r\")\n            .replace(/\\t=(.*?)%>/g, \"',$1,'\")\n            .split(\"\\t\").join(\"');\")\n            .split(\"%>\").join(\"p.push('\")\n            .split(\"\\r\").join(\"\\\\'\")\n          + \"');}return p.join('');\");\n\n      // Provide some basic currying to the user\n      return data ? fn(data) : fn;\n    };\n  })();\n})(window.jQuery);\n"
  },
  {
    "path": "bower_components/uwidget/uwidget.less",
    "content": "@lightgrey: #999;\n@extralightgrey: #f5f5f5;\n@border: #e5e5e5;\n@black: #111;\n\n.uwidget {\n  border: 1px solid @border;\n\n  .uwidget-actions {\n    display: block;\n    height: 22px;\n    background-color: @extralightgrey;\n\n    .filters {\n      float:right;\n    }\n  }\n\n  .uwidget-info {\n    display: block;\n    height: 15px;\n    color: @lightgrey;\n    font-size: 10px;\n    text-align: right;\n    background-color: @extralightgrey;\n\n    a, a:hover, a:visited {\n      color: @lightgrey;\n      text-decoration: none;\n    }\n  }\n\n  ul.uwidget-container {\n    display: block;\n    margin: 0;\n    padding: 2px;\n    list-style: none;\n    text-align: justify;\n    overflow-x: hidden;\n    overflow-y: scroll;\n\n    li {\n      position: relative;\n      display: block;\n      margin-bottom: -1px;\n      padding: 8px;\n      border-bottom: 1px solid @border;\n\n      &:last-child {\n        border: none;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "dist/i18n/al.js",
    "content": "// Validation errors messages for Parsley\n\n\nParsley.addMessages('al', {\n  defaultMessage: \"Kjo vlerë është invalide.\",\n  type: {\n    email:        \"Kjo vlerë duhet të ketë formë valide të një email adrese.\",\n    url:          \"Kjo vlerë duhet të ketë formë valide të një URL-je.\",\n    number:       \"Kjo vlerë duhet të jetë numërike.\",\n    integer:      \"Kjo vlerë duhet të jetë numër i plotë.\",\n    digits:       \"Kjo vlerë duhet të jetë shifër.\",\n    alphanum:     \"Kjo vlerë duhet të jetë alfanumerike.\"\n  },\n  notblank:       \"Kjo vlerë nuk duhet të jetë e zbrazët.\",\n  required:       \"Kjo vlerë kërkohet domosdosmërisht.\",\n  pattern:        \"Kjo vlerë është invalide.\",\n  min:            \"Kjo vlerë duhet të jetë më e madhe ose e barabartë me %s.\",\n  max:            \"Kjo vlerë duhet të jetë më e vogël ose e barabartë me %s.\",\n  range:          \"Kjo vlerë duhet të jetë në mes të %s dhe %s.\",\n  minlength:      \"Kjo vlerë është shum e shkurtë. Ajo duhet të ketë %s apo më shum shkronja.\",\n  maxlength:      \"Kjo vlerë është shum e gjatë. Ajo duhet të ketë %s apo më pak shkronja\",\n  length:         \"Gjatësia e kësaj vlere është invalide. Ajo duhet të jetë në mes të %s dhe %s shkronjash.\",\n  mincheck:       \"Ju duhet të zgjedhni së paku %s zgjedhje.\",\n  maxcheck:       \"Ju duhet të zgjedhni %s ose më pak zgjedhje.\",\n  check:          \"Ju duhet të zgjedhni në mes të %s dhe %s zgjedhjeve.\",\n  equalto:        \"Kjo vlerë duhet të jetë e njejtë.\"\n});\n\nParsley.setLocale('al');\n"
  },
  {
    "path": "dist/i18n/ar.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('ar', {\n  defaultMessage: \"تأكد من صحة القيمة المدخل\",\n  type: {\n    email:        \"تأكد من إدخال بريد الكتروني صحيح\",\n    url:          \"تأكد من إدخال رابط صحيح\",\n    number:       \"تأكد من إدخال رقم\",\n    integer:      \"تأكد من إدخال عدد صحيح بدون كسور\",\n    digits:       \"تأكد من إدخال رقم\",\n    alphanum:     \"تأكد من إدخال حروف وأرقام فقط\"\n  },\n  notblank:       \"تأكد من تعبئة الحقل\",\n  required:       \"هذا الحقل مطلوب\",\n  pattern:        \"القيمة المدخلة غير صحيحة\",\n  min:            \"القيمة المدخلة يجب أن تكون أكبر من %s.\",\n  max:            \"القيمة المدخلة يجب أن تكون أصغر من %s.\",\n  range:          \"القيمة المدخلة يجب أن تكون بين %s و %s.\",\n  minlength:      \"القيمة المدخلة قصيرة جداً . تأكد من إدخال %s حرف أو أكثر\",\n  maxlength:      \"القيمة المدخلة طويلة . تأكد من إدخال %s حرف أو أقل\",\n  length:         \"القيمة المدخلة غير صحيحة. تأكد من إدخال بين  %s و %s خانة\",\n  mincheck:       \"يجب اختيار %s خيار على الأقل.\",\n  maxcheck:       \"يجب اختيار%s خيار أو أقل\",\n  check:          \"يجب اختيار بين %s و %s خيار.\",\n  equalto:        \"تأكد من تطابق القيمتين المدخلة.\"\n});\n\nParsley.setLocale('ar');\n"
  },
  {
    "path": "dist/i18n/bg.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('bg', {\n  defaultMessage: \"Невалидна стойност.\",\n  type: {\n    email:        \"Невалиден имейл адрес.\",\n    url:          \"Невалиден URL адрес.\",\n    number:       \"Невалиден номер.\",\n    integer:      \"Невалиден номер.\",\n    digits:       \"Невалидни цифри.\",\n    alphanum:     \"Стойността трябва да садържа само букви или цифри.\"\n  },\n  notblank:       \"Полето е задължително.\",\n  required:       \"Полето е задължително.\",\n  pattern:        \"Невалидна стойност.\",\n  min:            \"Стойността трябва да бъде по-голяма или равна на %s.\",\n  max:            \"Стойността трябва да бъде по-малка или равна на %s.\",\n  range:          \"Стойността трябва да бъде между %s и %s.\",\n  minlength:      \"Стойността е прекалено кратка. Мин. дължина: %s символа.\",\n  maxlength:      \"Стойността е прекалено дълга. Макс. дължина: %s символа.\",\n  length:         \"Дължината на стойността трябва да бъде между %s и %s символа.\",\n  mincheck:       \"Трябва да изберете поне %s стойности.\",\n  maxcheck:       \"Трябва да изберете най-много %s стойности.\",\n  check:          \"Трябва да изберете между %s и %s стойности.\",\n  equalto:        \"Стойността трябва да съвпада.\"\n});\n\nParsley.setLocale('bg');\n"
  },
  {
    "path": "dist/i18n/ca.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('ca', {\n  defaultMessage: \"Aquest valor sembla ser invàlid.\",\n  type: {\n    email:        \"Aquest valor ha de ser una adreça de correu electrònic vàlida.\",\n    url:          \"Aquest valor ha de ser una URL vàlida.\",\n    number:       \"Aquest valor ha de ser un nombre vàlid.\",\n    integer:      \"Aquest valor ha de ser un nombre enter vàlid.\",\n    digits:       \"Aquest valor només pot contenir dígits.\",\n    alphanum:     \"Aquest valor ha de ser alfanumèric.\"\n  },\n  notblank:       \"Aquest valor no pot ser buit.\",\n  required:       \"Aquest valor és obligatori.\",\n  pattern:        \"Aquest valor és incorrecte.\",\n  min:            \"Aquest valor no pot ser menor que %s.\",\n  max:            \"Aquest valor no pot ser major que %s.\",\n  range:          \"Aquest valor ha d'estar entre %s i %s.\",\n  minlength:      \"Aquest valor és massa curt. La longitud mínima és de %s caràcters.\",\n  maxlength:      \"Aquest valor és massa llarg. La longitud màxima és de %s caràcters.\",\n  length:         \"La longitud d'aquest valor ha de ser d'entre %s i %s caràcters.\",\n  mincheck:       \"Has de marcar un mínim de %s opcions.\",\n  maxcheck:       \"Has de marcar un màxim de %s opcions.\",\n  check:          \"Has de marcar entre %s i %s opcions.\",\n  equalto:        \"Aquest valor ha de ser el mateix.\"\n});\n\nParsley.setLocale('ca');\n"
  },
  {
    "path": "dist/i18n/cs.extra.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('cs', {\n  dateiso:  \"Tato položka musí být datum ve formátu RRRR-MM-DD.\",\n  minwords: \"Tato položka musí mít délku nejméně %s slov.\",\n  maxwords: \"Tato položka musí mít délku nejvíce %s slov.\",\n  words:    \"Tato položka musí být od %s do %s slov dlouhá.\",\n  gt:       \"Tato hodnota musí být větší.\",\n  gte:      \"Tato hodnota musí být větší nebo rovna.\",\n  lt:       \"Tato hodnota musí být menší.\",\n  lte:      \"Tato hodnota musí být menší nebo rovna.\"\n});\n"
  },
  {
    "path": "dist/i18n/cs.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('cs', {\n  defaultMessage: \"Tato položka je neplatná.\",\n  type: {\n    email:        \"Tato položka musí být e-mailová adresa.\",\n    url:          \"Tato položka musí být platná URL adresa.\",\n    number:       \"Tato položka musí být číslo.\",\n    integer:      \"Tato položka musí být celé číslo.\",\n    digits:       \"Tato položka musí být kladné celé číslo.\",\n    alphanum:     \"Tato položka musí být alfanumerická.\"\n  },\n  notblank:       \"Tato položka nesmí být prázdná.\",\n  required:       \"Tato položka je povinná.\",\n  pattern:        \"Tato položka je neplatná.\",\n  min:            \"Tato položka musí být větší nebo rovna %s.\",\n  max:            \"Tato položka musí být menší nebo rovna %s.\",\n  range:          \"Tato položka musí být v rozsahu od %s do %s.\",\n  minlength:      \"Tato položka musí mít nejméně %s znaků.\",\n  maxlength:      \"Tato položka musí mít nejvíce %s znaků.\",\n  length:         \"Tato položka musí mít délku od %s do %s znaků.\",\n  mincheck:       \"Je nutné vybrat alespoň %s možností.\",\n  maxcheck:       \"Je nutné vybrat nejvýše %s možností.\",\n  check:          \"Je nutné vybrat od %s do %s možností.\",\n  equalto:        \"Tato položka musí být stejná.\"\n});\n\nParsley.setLocale('cs');\n"
  },
  {
    "path": "dist/i18n/cy.js",
    "content": "Parsley.addMessages(\"cy\", {\n    defaultMessage: \"Mae'n ymddangos bod y gwerth hwn yn annilys.\",\n    type: {\n        email: \"Mae angen e-bost dilys.\",\n        url: \"Dylai'r gwerth hwn fod yn url dilys.\",\n        number: \"Dylai'r gwerth hwn fod yn rhif dilys.\",\n        integer: \"Dylai'r gwerth hwn fod yn gyfanrif dilys.\",\n        digits: \"Dylai'r gwerth hwn fod yn ddigidau.\",\n        alphanum: \"Dylai'r gwerth hwn fod yn alffaniwmerig.\"\n    },\n    notblank: \"Ni ddylai'r gwerth hwn fod yn wag.\",\n    required: \"Llenwch y maes hwn os gwelwch yn dda.\",\n    pattern: \"Mae'n ymddangos bod y gwerth hwn yn annilys.\",\n    min: \"Dylai'r gwerth hwn fod yn fwy na %s neu'n hafal iddo.\",\n    max: \"Dylai'r gwerth hwn fod yn is na %s neu'n hafal iddo.\",\n    range: \"Dylai'r gwerth hwn fod rhwng %s a %s.\",\n    minlength: \"Mae'r gwerth hwn yn rhy fyr. Dylai fod ganddo %s nod neu fwy.\",\n    maxlength: \"Mae'r gwerth hwn yn rhy hir. Dylai fod ganddo %s nod neu lai.\",\n    length: \"Mae'r hyd gwerth hwn yn annilys. Dylai fod rhwng %s a %s nod o hyd.\",\n    mincheck: \"Rhaid i chi ddewis o leiaf %s dewisiadau.\",\n    maxcheck: \"Rhaid i chi ddewis dewisiadau %s neu lai.\",\n    check: \"Rhaid i chi ddewis rhwng %s a %s dewisiadau.\",\n    equalto: \"Dylai'r gwerth hwn fod yr un fath.\",\n    euvatin: \"Nid yw'n Rhif Adnabod TAW dilys.\"\n});\n\nParsley.setLocale(\"cy\");\n\n"
  },
  {
    "path": "dist/i18n/da.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('da', {\n  defaultMessage: \"Indtast venligst en korrekt værdi.\",\n  type: {\n    email:        \"Indtast venligst en korrekt emailadresse.\",\n    url:          \"Indtast venligst en korrekt internetadresse.\",\n    number:       \"Indtast venligst et tal.\",\n    integer:      \"Indtast venligst et heltal.\",\n    digits:       \"Dette felt må kun bestå af tal.\",\n    alphanum:     \"Dette felt skal indeholde både tal og bogstaver.\"\n  },\n  notblank:       \"Dette felt må ikke være tomt.\",\n  required:       \"Dette felt er påkrævet.\",\n  pattern:        \"Ugyldig indtastning.\",\n  min:            \"Dette felt skal indeholde et tal som er større end eller lig med %s.\",\n  max:            \"Dette felt skal indeholde et tal som er mindre end eller lig med %s.\",\n  range:          \"Dette felt skal indeholde et tal mellem %s og %s.\",\n  minlength:      \"Indtast venligst mindst %s tegn.\",\n  maxlength:      \"Dette felt kan højst indeholde %s tegn.\",\n  length:         \"Længden af denne værdi er ikke korrekt. Værdien skal være mellem %s og %s tegn lang.\",\n  mincheck:       \"Vælg mindst %s muligheder.\",\n  maxcheck:       \"Vælg op til %s muligheder.\",\n  check:          \"Vælg mellem %s og %s muligheder.\",\n  equalto:        \"De to felter er ikke ens.\"\n});\n\nParsley.setLocale('da');\n"
  },
  {
    "path": "dist/i18n/de.extra.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('de', {\n  dateiso:  \"Die Eingabe muss ein gültiges Datum sein (YYYY-MM-DD).\",\n  minwords: \"Die Eingabe ist zu kurz. Sie muss aus %s oder mehr Wörtern bestehen.\",\n  maxwords: \"Die Eingabe ist zu lang. Sie muss aus %s oder weniger Wörtern bestehen.\",\n  words:    \"Die Länge der Eingabe ist ungültig. Sie muss zwischen %s und %s Wörter enthalten.\",\n  gt:       \"Die Eingabe muss größer sein.\",\n  gte:      \"Die Eingabe muss größer oder gleich sein.\",\n  lt:       \"Die Eingabe muss kleiner sein.\",\n  lte:      \"Die Eingabe muss kleiner oder gleich sein.\"\n});\n"
  },
  {
    "path": "dist/i18n/de.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('de', {\n  defaultMessage: \"Die Eingabe scheint nicht korrekt zu sein.\",\n  type: {\n    email:        \"Die Eingabe muss eine gültige E-Mail-Adresse sein.\",\n    url:          \"Die Eingabe muss eine gültige URL sein.\",\n    number:       \"Die Eingabe muss eine Zahl sein.\",\n    integer:      \"Die Eingabe muss eine Zahl sein.\",\n    digits:       \"Die Eingabe darf nur Ziffern enthalten.\",\n    alphanum:     \"Die Eingabe muss alphanumerisch sein.\"\n  },\n  notblank:       \"Die Eingabe darf nicht leer sein.\",\n  required:       \"Dies ist ein Pflichtfeld.\",\n  pattern:        \"Die Eingabe scheint ungültig zu sein.\",\n  min:            \"Die Eingabe muss größer oder gleich %s sein.\",\n  max:            \"Die Eingabe muss kleiner oder gleich %s sein.\",\n  range:          \"Die Eingabe muss zwischen %s und %s liegen.\",\n  minlength:      \"Die Eingabe ist zu kurz. Es müssen mindestens %s Zeichen eingegeben werden.\",\n  maxlength:      \"Die Eingabe ist zu lang. Es dürfen höchstens %s Zeichen eingegeben werden.\",\n  length:         \"Die Länge der Eingabe ist ungültig. Es müssen zwischen %s und %s Zeichen eingegeben werden.\",\n  mincheck:       \"Wählen Sie mindestens %s Angaben aus.\",\n  maxcheck:       \"Wählen Sie maximal %s Angaben aus.\",\n  check:          \"Wählen Sie zwischen %s und %s Angaben.\",\n  equalto:        \"Dieses Feld muss dem anderen entsprechen.\"\n});\n\nParsley.setLocale('de');\n"
  },
  {
    "path": "dist/i18n/el.extra.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('el', {\n  dateiso:  \"Η τιμή πρέπει να είναι μια έγκυρη ημερομηνία (YYYY-MM-DD).\",\n  minwords: \"Το κείμενο είναι πολύ μικρό. Πρέπει να έχει %s ή και περισσότερες λέξεις.\",\n  maxwords: \"Το κείμενο είναι πολύ μεγάλο. Πρέπει να έχει %s ή και λιγότερες λέξεις.\",\n  words:    \"Το μήκος του κειμένου είναι μη έγκυρο. Πρέπει να είναι μεταξύ %s και %s λεξεων.\",\n  gt:       \"Η τιμή πρέπει να είναι μεγαλύτερη.\",\n  gte:      \"Η τιμή πρέπει να είναι μεγαλύτερη ή ίση.\",\n  lt:       \"Η τιμή πρέπει να είναι μικρότερη.\",\n  lte:      \"Η τιμή πρέπει να είναι μικρότερη ή ίση.\",\n  notequalto: \"Η τιμή πρέπει να είναι διαφορετική.\"\n});\n"
  },
  {
    "path": "dist/i18n/el.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('el', {\n  defaultMessage: \"Η τιμή φαίνεται να είναι μη έγκυρη.\",\n  type: {\n    email:        \"Η τιμή πρέπει να είναι ένα έγκυρο email.\",\n    url:          \"Η τιμή πρέπει να είναι ένα έγκυρο url.\",\n    number:       \"Η τιμή πρέπει να είναι ένας έγκυρος αριθμός.\",\n    integer:      \"Η τιμή πρέπει να είναι ένας έγκυρος ακέραιος.\",\n    digits:       \"Η τιμή πρέπει να είναι ψηφία.\",\n    alphanum:     \"Η τιμή πρέπει να είναι αλφαριθμητικό.\"\n  },\n  notblank:       \"Η τιμή δεν πρέπει να είναι κενή.\",\n  required:       \"Απαιτούμενο πεδίο\",\n  pattern:        \"Η τιμή φαίνεται να είναι μη έγκυρη.\",\n  min:            \"Η τιμή πρέπει να είναι μεγαλύτερη ή ίση με %s.\",\n  max:            \"Η τιμή πρέπει να είναι μικρότερη ή ίση με %s.\",\n  range:          \"Η τιμή πρέπει να είναι μεταξύ %s και %s.\",\n  minlength:      \"Το κείμενο είναι πολύ μικρό. Πρέπει να είναι %s ή και περισσότεροι χαρακτήρες.\",\n  maxlength:      \"Η κείμενο είναι πολύ μεγάλο. Πρέπει να είναι %s ή και λιγότεροι χαρακτήρες.\",\n  length:         \"Το μήκος του κειμένου είναι μη έγκυρο. Πρέπει να είναι μεταξύ %s και %s χαρακτήρων.\",\n  mincheck:       \"Πρέπει να επιλέξετε τουλάχιστον %s επιλογές.\",\n  maxcheck:       \"Πρέπει να επιλέξετε %s ή λιγότερες επιλογές.\",\n  check:          \"Πρέπει να επιλέξετε μεταξύ %s και %s επίλογων.\",\n  equalto:        \"Η τιμή πρέπει να είναι η ίδια.\"\n});\n\nParsley.setLocale('el');\n"
  },
  {
    "path": "dist/i18n/en.extra.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('en', {\n  dateiso:  \"This value should be a valid date (YYYY-MM-DD).\",\n  date: \"It must be a valid date with format %s\",\n  datebeforenow: \"Date must be valid with format %s and be before now\",\n  dateafternow: \"Date must be valid with format %s and be after now\",\n  minwords: \"This value is too short. It should have %s words or more.\",\n  maxwords: \"This value is too long. It should have %s words or fewer.\",\n  words:    \"This value length is invalid. It should be between %s and %s words long.\",\n  gt:       \"This value should be greater than %s.\",\n  gte:      \"This value should be greater or equal to %s.\",\n  lt:       \"This value should be less than %s.\",\n  lte:      \"This value should be less or equal to %s.\",\n  notequalto: \"This value should be different from %s.\"\n});\n"
  },
  {
    "path": "dist/i18n/en.js",
    "content": "// This is included with the Parsley library itself,\n// thus there is no use in adding it to your project.\n\n\nParsley.addMessages('en', {\n  defaultMessage: \"This value seems to be invalid.\",\n  type: {\n    email:        \"This value should be a valid email.\",\n    url:          \"This value should be a valid url.\",\n    number:       \"This value should be a valid number.\",\n    integer:      \"This value should be a valid integer.\",\n    digits:       \"This value should be digits.\",\n    alphanum:     \"This value should be alphanumeric.\"\n  },\n  notblank:       \"This value should not be blank.\",\n  required:       \"This value is required.\",\n  pattern:        \"This value seems to be invalid.\",\n  min:            \"This value should be greater than or equal to %s.\",\n  max:            \"This value should be lower than or equal to %s.\",\n  range:          \"This value should be between %s and %s.\",\n  minlength:      \"This value is too short. It should have %s characters or more.\",\n  maxlength:      \"This value is too long. It should have %s characters or fewer.\",\n  length:         \"This value length is invalid. It should be between %s and %s characters long.\",\n  mincheck:       \"You must select at least %s choices.\",\n  maxcheck:       \"You must select %s choices or fewer.\",\n  check:          \"You must select between %s and %s choices.\",\n  equalto:        \"This value should be the same.\",\n  euvatin:        \"It's not a valid VAT Identification Number.\",\n});\n\nParsley.setLocale('en');\n"
  },
  {
    "path": "dist/i18n/es.js",
    "content": "// ParsleyConfig definition if not already set\n// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('es', {\n  defaultMessage: \"Este valor parece ser inválido.\",\n  type: {\n    email:        \"Este valor debe ser un correo válido.\",\n    url:          \"Este valor debe ser una URL válida.\",\n    number:       \"Este valor debe ser un número válido.\",\n    integer:      \"Este valor debe ser un número válido.\",\n    digits:       \"Este valor debe ser un dígito válido.\",\n    alphanum:     \"Este valor debe ser alfanumérico.\"\n  },\n  notblank:       \"Este valor no debe estar en blanco.\",\n  required:       \"Este valor es requerido.\",\n  pattern:        \"Este valor es incorrecto.\",\n  min:            \"Este valor no debe ser menor que %s.\",\n  max:            \"Este valor no debe ser mayor que %s.\",\n  range:          \"Este valor debe estar entre %s y %s.\",\n  minlength:      \"Este valor es muy corto. La longitud mínima es de %s caracteres.\",\n  maxlength:      \"Este valor es muy largo. La longitud máxima es de %s caracteres.\",\n  length:         \"La longitud de este valor debe estar entre %s y %s caracteres.\",\n  mincheck:       \"Debe seleccionar al menos %s opciones.\",\n  maxcheck:       \"Debe seleccionar %s opciones o menos.\",\n  check:          \"Debe seleccionar entre %s y %s opciones.\",\n  equalto:        \"Este valor debe ser idéntico.\"\n});\n\nParsley.setLocale('es');\n"
  },
  {
    "path": "dist/i18n/et.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('et', {\n  defaultMessage: \"See väärtus ei sobi.\",\n  type: {\n    email: \"See väärtus peab olema kehtiv email.\",\n    url: \"See väärtus peab olema kehtiv link.\",\n    number: \"See väärtus peab olema number.\",\n    integer: \"See väärtus peab olema täisarv.\",\n    digits: \"See väärtus peab olema number.\",\n    alphanum: \"See väärtus peab olema täht või number.\"\n  },\n  notblank: \"See väärtus ei tohi olla tühi.\",\n  required: \"See väärtus on nõutud.\",\n  pattern: \"See väärtus ei sobi.\",\n  min: \"See väärtus peab olema suurem või võrdne %s.\",\n  max: \"See väärtus peab olema väiksem või võrdne %s.\",\n  range: \"See väärtus peab olema %s ja %s vahel.\",\n  minlength: \"See väärtus on liiga lühike. Peab olema vähemalt %s tähte.\",\n  maxlength: \"See väärtus ei tohi olla rohkem kui %s tähte.\",\n  length: \"See väärtuse pikkus ei sobi. Peab olema vahemikus %s - %s.\",\n  mincheck: \"Pead valima vähemalt %s valikut.\",\n  maxcheck: \"Maksimaalselt %s valikut.\",\n  check: \"Valik peab olema vahemikus %s ja %s .\",\n  equalto: \"See väärtus peab olema sama.\"\n});\n\nParsley.setLocale('et');\n"
  },
  {
    "path": "dist/i18n/eu.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('eu', {\n  defaultMessage: \"Balio hau baliogabekoa dirudi.\",\n  type: {\n    email:        \"Balio honek posta balioduna izan behar da.\",\n    url:          \"Balio honek URL balioduna izan behar da.\",\n    number:       \"Balio honek zenbaki balioduna izan behar da.\",\n    integer:      \"Balio honek zenbaki balioduna izan behar da.\",\n    digits:       \"Balio honek digitu balioduna izan behar da.\",\n    alphanum:     \"Balio honek alfanumerikoa izan behar da.\"\n  },\n  notblank:       \"Balio honek ezin da hutsik egon.\",\n  required:       \"Balio hau nahitaezkoa da.\",\n  pattern:        \"Balio hau ez da zuzena.\",\n  min:            \"Balio honek %s baino baxuagoa ezin da izan.\",\n  max:            \"Balio honek %s baino altuagoa ezin da izan.\",\n  range:          \"Balio honek %s eta %s artean egon behar da.\",\n  minlength:      \"Balio hau oso motza da. Gutxienezko luzera %s karakteretakoa da.\",\n  maxlength:      \"Balio hau oso luzea da. Gehienezko luzera %s karakteretakoa da.\",\n  length:         \"Balio honen luzera %s eta %s karaketere artean egon behar da.\",\n  mincheck:       \"%s aukera hautatu behar dituzu gutxienez.\",\n  maxcheck:       \"%s aukera edo gutxiago hautatu behar dituzu.\",\n  check:          \"%s eta %s aukeren artean hautatu behar duzu.\",\n  equalto:        \"Balio honek berbera izan behar da.\"\n});\n\nParsley.setLocale('eu');\n"
  },
  {
    "path": "dist/i18n/fa.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('fa', {\n  defaultMessage: \"این مقدار صحیح نمی باشد\",\n  type: {\n    email:        \"این مقدار باید یک ایمیل معتبر باشد\",\n    url:          \"این مقدار باید یک آدرس معتبر باشد\",\n    number:       \"این مقدار باید یک عدد معتبر باشد\",\n    integer:      \"این مقدار باید یک عدد صحیح معتبر باشد\",\n    digits:       \"این مقدار باید یک عدد باشد\",\n    alphanum:     \"این مقدار باید حروف الفبا باشد\"\n  },\n  notblank:       \"این مقدار نباید خالی باشد\",\n  required:       \"این مقدار باید وارد شود\",\n  pattern:        \"این مقدار به نظر می رسد نامعتبر است\",\n  min:            \"این مقدیر باید بزرگتر با مساوی %s باشد\",\n  max:            \"این مقدار باید کمتر و یا مساوی %s باشد\",\n  range:          \"این مقدار باید بین %s و %s باشد\",\n  minlength:      \"این مقدار بیش از حد کوتاه است. باید %s کاراکتر یا بیشتر باشد.\",\n  maxlength:      \"این مقدار بیش از حد طولانی است. باید %s کاراکتر یا کمتر باشد.\",\n  length:         \"این مقدار نامعتبر است و باید بین %s و %s باشد\",\n  mincheck:       \"شما حداقل باید %s گزینه را انتخاب کنید.\",\n  maxcheck:       \"شما حداکثر می‌توانید %s انتخاب داشته باشید.\",\n  check:          \"باید بین %s و %s مورد انتخاب کنید\",\n  equalto:        \"این مقدار باید یکسان باشد\"\n});\n\nParsley.setLocale('fa');\n"
  },
  {
    "path": "dist/i18n/fi.extra.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('fi', {\n  dateiso: \"Sy&ouml;t&auml; oikea p&auml;iv&auml;m&auml;&auml;r&auml; (YYYY-MM-DD).\"\n});\n"
  },
  {
    "path": "dist/i18n/fi.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('fi', {\n  defaultMessage: \"Sy&ouml;tetty arvo on virheellinen.\",\n  type: {\n    email:        \"S&auml;hk&ouml;postiosoite on virheellinen.\",\n    url:          \"Url-osoite on virheellinen.\",\n    number:       \"Sy&ouml;t&auml; numero.\",\n    integer:      \"Sy&ouml;t&auml; kokonaisluku.\",\n    digits:       \"Sy&ouml;t&auml; ainoastaan numeroita.\",\n    alphanum:     \"Sy&ouml;t&auml; ainoastaan kirjaimia tai numeroita.\"\n  },\n  notblank:       \"T&auml;m&auml; kentt&auml;&auml; ei voi j&auml;tt&auml;&auml; tyhj&auml;ksi.\",\n  required:       \"T&auml;m&auml; kentt&auml; on pakollinen.\",\n  pattern:        \"Sy&ouml;tetty arvo on virheellinen.\",\n  min:            \"Sy&ouml;t&auml; arvo joka on yht&auml; suuri tai suurempi kuin %s.\",\n  max:            \"Sy&ouml;t&auml; arvo joka on pienempi tai yht&auml; suuri kuin %s.\",\n  range:          \"Sy&ouml;t&auml; arvo v&auml;lilt&auml;: %s-%s.\",\n  minlength:      \"Sy&ouml;tetyn arvon t&auml;ytyy olla v&auml;hint&auml;&auml;n %s merkki&auml; pitk&auml;.\",\n  maxlength:      \"Sy&ouml;tetty arvo saa olla enint&auml;&auml;n %s merkki&auml; pitk&auml;.\",\n  length:         \"Sy&ouml;tetyn arvon t&auml;ytyy olla v&auml;hint&auml;&auml;n %s ja enint&auml;&auml;n %s merkki&auml; pitk&auml;.\",\n  mincheck:       \"Valitse v&auml;hint&auml;&auml;n %s vaihtoehtoa.\",\n  maxcheck:       \"Valitse enint&auml;&auml;n %s vaihtoehtoa.\",\n  check:          \"Valitse %s-%s vaihtoehtoa.\",\n  equalto:        \"Salasanat eiv&auml;t t&auml;sm&auml;&auml;.\"\n});\n\nParsley.setLocale('fi');\n"
  },
  {
    "path": "dist/i18n/fr.extra.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('fr', {\n  dateiso:    \"Cette valeur n'est pas une date valide (YYYY-MM-DD).\",\n  minwords:   \"Cette valeur est trop courte. Elle doit contenir au moins %s mots.\",\n  maxwords:   \"Cette valeur est trop longue. Elle doit contenir tout au plus %s mots.\",\n  words:      \"Cette valeur est invalide. Elle doit contenir entre %s et %s mots.\",\n  gt:         \"Cette valeur doit être plus grande.\",\n  gte:        \"Cette valeur doit être plus grande ou égale.\",\n  lt:         \"Cette valeur doit être plus petite.\",\n  lte:        \"Cette valeur doit être plus petite ou égale.\",\n  notequalto: \"Cette valeur doit être différente.\"\n});\n"
  },
  {
    "path": "dist/i18n/fr.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('fr', {\n  defaultMessage: \"Cette valeur semble non valide.\",\n  type: {\n    email:        \"Cette valeur n'est pas une adresse email valide.\",\n    url:          \"Cette valeur n'est pas une URL valide.\",\n    number:       \"Cette valeur doit être un nombre.\",\n    integer:      \"Cette valeur doit être un entier.\",\n    digits:       \"Cette valeur doit être numérique.\",\n    alphanum:     \"Cette valeur doit être alphanumérique.\"\n  },\n  notblank:       \"Cette valeur ne peut pas être vide.\",\n  required:       \"Ce champ est requis.\",\n  pattern:        \"Cette valeur semble non valide.\",\n  min:            \"Cette valeur ne doit pas être inférieure à %s.\",\n  max:            \"Cette valeur ne doit pas excéder %s.\",\n  range:          \"Cette valeur doit être comprise entre %s et %s.\",\n  minlength:      \"Cette chaîne est trop courte. Elle doit avoir au minimum %s caractères.\",\n  maxlength:      \"Cette chaîne est trop longue. Elle doit avoir au maximum %s caractères.\",\n  length:         \"Cette valeur doit contenir entre %s et %s caractères.\",\n  mincheck:       \"Vous devez sélectionner au moins %s choix.\",\n  maxcheck:       \"Vous devez sélectionner %s choix maximum.\",\n  check:          \"Vous devez sélectionner entre %s et %s choix.\",\n  equalto:        \"Cette valeur devrait être identique.\"\n});\n\nParsley.setLocale('fr');\n"
  },
  {
    "path": "dist/i18n/he.extra.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('he', {\n  dateiso: \"ערך זה צריך להיות תאריך בפורמט (YYYY-MM-DD).\"\n});\n"
  },
  {
    "path": "dist/i18n/he.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('he', {\n  defaultMessage: \"נראה כי ערך זה אינו תקף.\",\n  type: {\n    email:        \"ערך זה צריך להיות כתובת אימייל.\",\n    url:          \"ערך זה צריך להיות URL תקף.\",\n    number:       \"ערך זה צריך להיות מספר.\",\n    integer:      \"ערך זה צריך להיות מספר שלם.\",\n    digits:       \"ערך זה צריך להיות ספרתי.\",\n    alphanum:     \"ערך זה צריך להיות אלפאנומרי.\"\n  },\n  notblank:       \"ערך זה אינו יכול להשאר ריק.\",\n  required:       \"ערך זה דרוש.\",\n  pattern:        \"נראה כי ערך זה אינו תקף.\",\n  min:            \"ערך זה צריך להיות לכל הפחות %s.\",\n  max:            \"ערך זה צריך להיות לכל היותר %s.\",\n  range:          \"ערך זה צריך להיות בין %s ל-%s.\",\n  minlength:      \"ערך זה קצר מידי. הוא צריך להיות לכל הפחות %s תווים.\",\n  maxlength:      \"ערך זה ארוך מידי. הוא צריך להיות לכל היותר %s תווים.\",\n  length:         \"ערך זה אינו באורך תקף. האורך צריך להיות בין %s ל-%s תווים.\",\n  mincheck:       \"אנא בחר לפחות %s אפשרויות.\",\n  maxcheck:       \"אנא בחר לכל היותר %s אפשרויות.\",\n  check:          \"אנא בחר בין %s ל-%s אפשרויות.\",\n  equalto:        \"ערך זה צריך להיות זהה.\"\n});\n\nParsley.setLocale('he');\n"
  },
  {
    "path": "dist/i18n/hr.extra.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('hr', {\n  dateiso:  \"Ovo polje treba sadržavati ispravno unešen datum (GGGG-MM-DD).\",\n  minwords: \"Unos je prekratak. Treba sadržavati %s ili više riječi.\",\n  maxwords: \"Unos je predugačak. Treba sadržavati %s ili manje riječi.\",\n  words:    \"Neispravna duljina unosa. Treba sadržavati između %s i %s riječi.\",\n  gt:       \"Ova vrijednost treba biti veća.\",\n  gte:      \"Ova vrijednost treba biti veća ili jednaka.\",\n  lt:       \"Ova vrijednost treba biti manja.\",\n  lte:      \"Ova vrijednost treba biti manja ili jednaka.\",\n  notequalto: \"Ova vrijednost treba biti drugačija.\"\n});\n"
  },
  {
    "path": "dist/i18n/hr.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('hr', {\n  defaultMessage: \"Neispravan unos.\",\n  type: {\n    email: \"Ovo polje treba sadržavati ispravnu email adresu.\",\n    url: \"Ovo polje treba sadržavati ispravni url.\",\n    number: \"Ovo polje treba sadržavati ispravno upisan broj.\",\n    integer: \"Ovo polje treba sadržavati ispravno upisan cijeli broj.\",\n    digits: \"Ovo polje treba sadržavati znamenke.\",\n    alphanum: \"Ovo polje treba sadržavati brojke ili slova.\"\n  },\n  notblank: \"Ovo polje ne smije biti prazno.\",\n  required: \"Ovo polje je obavezno.\",\n  pattern: \"Neispravan unos.\",\n  min: \"Vrijednost treba biti jednaka ili veća od %s.\",\n  max: \"Vrijednost treba biti jednaka ili manja od %s.\",\n  range: \"Vrijednost treba biti između %s i %s.\",\n  minlength: \"Unos je prekratak. Treba sadržavati %s ili više znakova.\",\n  maxlength: \"Unos je predugačak. Treba sadržavati %s ili manje znakova.\",\n  length: \"Neispravna duljina unosa. Treba sadržavati između %s i %s znakova.\",\n  mincheck: \"Treba odabrati najmanje %s izbora.\",\n  maxcheck: \"Treba odabrati %s ili manje izbora.\",\n  check: \"Treba odabrati između %s i %s izbora.\",\n  equalto: \"Ova vrijednost treba biti ista.\"\n});\n\nParsley.setLocale('hr');\n"
  },
  {
    "path": "dist/i18n/hu.extra.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('hu', {\n  dateiso:  \"A mező értéke csak érvényes dátum lehet (YYYY-MM-DD).\",\n  minwords: \"Minimum %s szó megadása szükséges.\",\n  maxwords: \"Maximum %s szó megadása engedélyezett.\",\n  words:    \"Minimum %s, maximum %s szó megadása szükséges.\",\n  gt:       \"A mező értéke nagyobb kell legyen.\",\n  gte:      \"A mező értéke nagyobb vagy egyenlő kell legyen.\",\n  lt:       \"A mező értéke kevesebb kell legyen.\",\n  lte:      \"A mező értéke kevesebb vagy egyenlő kell legyen.\",\n  notequalto: \"Az érték különböző kell legyen.\"\n});\n"
  },
  {
    "path": "dist/i18n/hu.js",
    "content": "// This is included with the Parsley library itself,\n// thus there is no use in adding it to your project.\n\n\nParsley.addMessages('hu', {\n  defaultMessage: \"Érvénytelen mező.\",\n  type: {\n    email:        \"Érvénytelen email cím.\",\n    url:          \"Érvénytelen URL cím.\",\n    number:       \"Érvénytelen szám.\",\n    integer:      \"Érvénytelen egész szám.\",\n    digits:       \"Érvénytelen szám.\",\n    alphanum:     \"Érvénytelen alfanumerikus érték.\"\n  },\n  notblank:       \"Ez a mező nem maradhat üresen.\",\n  required:       \"A mező kitöltése kötelező.\",\n  pattern:        \"Érvénytelen érték.\",\n  min:            \"A mező értéke nagyobb vagy egyenlő kell legyen mint %s.\",\n  max:            \"A mező értéke kisebb vagy egyenlő kell legyen mint %s.\",\n  range:          \"A mező értéke %s és %s közé kell essen.\",\n  minlength:      \"Legalább %s karakter megadása szükséges.\",\n  maxlength:      \"Legfeljebb %s karakter megadása engedélyezett.\",\n  length:         \"Nem megfelelő karakterszám. Minimum %s, maximum %s karakter adható meg.\",\n  mincheck:       \"Legalább %s értéket kell kiválasztani.\",\n  maxcheck:       \"Maximum %s értéket lehet kiválasztani.\",\n  check:          \"Legalább %s, legfeljebb %s értéket kell kiválasztani.\",\n  equalto:        \"A mező értéke nem egyező.\"\n});\n\nParsley.setLocale('hu');\n"
  },
  {
    "path": "dist/i18n/id.extra.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('id', {\n  dateiso: \"Harus tanggal yang valid (YYYY-MM-DD).\"\n});\n"
  },
  {
    "path": "dist/i18n/id.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('id', {\n  defaultMessage: \"tidak valid\",\n  type: {\n    email:        \"email tidak valid\",\n    url:          \"url tidak valid\",\n    number:       \"nomor tidak valid\",\n    integer:      \"integer tidak valid\",\n    digits:       \"harus berupa digit\",\n    alphanum:     \"harus berupa alphanumeric\"\n  },\n  notblank:       \"tidak boleh kosong\",\n  required:       \"tidak boleh kosong\",\n  pattern:        \"tidak valid\",\n  min:            \"harus lebih besar atau sama dengan %s.\",\n  max:            \"harus lebih kecil atau sama dengan %s.\",\n  range:          \"harus dalam rentang %s dan %s.\",\n  minlength:      \"terlalu pendek, minimal %s karakter atau lebih.\",\n  maxlength:      \"terlalu panjang, maksimal %s karakter atau kurang.\",\n  length:         \"panjang karakter harus dalam rentang %s dan %s\",\n  mincheck:       \"pilih minimal %s pilihan\",\n  maxcheck:       \"pilih maksimal %s pilihan\",\n  check:          \"pilih antar %s dan %s pilihan\",\n  equalto:        \"harus sama\"\n});\n\nParsley.setLocale('id');\n"
  },
  {
    "path": "dist/i18n/is.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('is', {\n  defaultMessage: \"Gildið virðist vera ógilt.\",\n  type: {\n    email:        \"Þetta gildi ætti að vera gilt netfang.\",\n    url:          \"Þetta gildi ætti að vera gild vefslóð.\",\n    number:       \"Þetta gildi ætti að vera gild tala.\",\n    integer:      \"Þetta gildi ætti að vera gild heiltala.\",\n    digits:       \"Þetta gildi ætti að vera tölur.\",\n    alphanum:     \"Þetta gildi ætti að vera ritstafrænt\"\n  },\n  notblank:       \"Þetta gildi ætti ekki að vera tómt.\",\n  required:       \"Þessa gildis er krafist.\",\n  pattern:        \"Gildið virðist vera ógilt.\",\n  min:            \"Þetta gildi ætti að vera stærra en eða jafnt og %s.\",\n  max:            \"Þetta gildi ætti að vera minna en eða jafnt og %s.\",\n  range:          \"Þetta gildi ætti að vera á milli %s og %s.\",\n  minlength:      \"Þetta gildi er of stutt. Það ætti að vera %s stafir eða meira.\",\n  maxlength:      \"Þetta gildi er of langt. Það ætti að vera %s stafir eða færri.\",\n  length:         \"Lengd þessa gildis er ógild. Hún ætti að vera á milli %s og %s stafa löng.\",\n  mincheck:       \"Þú þarft að velja að minnsta kosti %s valkosti.\",\n  maxcheck:       \"Þú þarft að velja %s valkosti eða færri.\",\n  check:          \"Þú þarft að velja á milli %s og %s valkosti.\",\n  equalto:        \"Þetta gildi ætti að vera eins.\"\n});\n\nParsley.setLocale('is');\n"
  },
  {
    "path": "dist/i18n/it.extra.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('it', {\n  dateiso: \"Inserire una data valida (AAAA-MM-GG).\",\n  date: \"Deve essere una data valida nel formato %s\",\n  datebeforenow: \"La data deve essere valida nel formato %s e precedere la data attuale\",\n  dateafternow: \"La data deve essere valida nel formato %s e posteriore alla data attuale\",\n  minwords:   \"Questo valore deve avere almeno %s parole.\",\n  maxwords:   \"Questo valore deve avere meno di %s parole.\",\n  words:      \"Questo valore deve avere tra %s e %s parole.\",\n  gt:         \"Questo valore deve essere maggiore di %s.\",\n  gte:        \"Questo valore deve essere maggiore o uguale a %s.\",\n  lt:         \"Questo valore deve essere minore di %s.\",\n  lte:        \"Questo valore deve essere minore o uguale a %s.\",\n  notequalto: \"Questo valore deve essere differente da %s.\"\n});\n"
  },
  {
    "path": "dist/i18n/it.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('it', {\n  defaultMessage: \"Questo valore sembra essere non valido.\",\n  type: {\n    email:        \"Questo valore deve essere un indirizzo email valido.\",\n    url:          \"Questo valore deve essere un URL valido.\",\n    number:       \"Questo valore deve essere un numero valido.\",\n    integer:      \"Questo valore deve essere un numero valido.\",\n    digits:       \"Questo valore deve essere di tipo numerico.\",\n    alphanum:     \"Questo valore deve essere di tipo alfanumerico.\"\n  },\n  notblank:       \"Questo valore non deve essere vuoto.\",\n  required:       \"Questo valore è richiesto.\",\n  pattern:        \"Questo valore non è corretto.\",\n  min:            \"Questo valore deve essere maggiore di %s.\",\n  max:            \"Questo valore deve essere minore di %s.\",\n  range:          \"Questo valore deve essere compreso tra %s e %s.\",\n  minlength:      \"Questo valore è troppo corto. La lunghezza minima è di %s caratteri.\",\n  maxlength:      \"Questo valore è troppo lungo. La lunghezza massima è di %s caratteri.\",\n  length:         \"La lunghezza di questo valore deve essere compresa fra %s e %s caratteri.\",\n  mincheck:       \"Devi scegliere almeno %s opzioni.\",\n  maxcheck:       \"Devi scegliere al più %s opzioni.\",\n  check:          \"Devi scegliere tra %s e %s opzioni.\",\n  equalto:        \"Questo valore deve essere identico.\",\n  euvatin:        \"Non è un codice IVA valido\",\n});\n\nParsley.setLocale('it');\n"
  },
  {
    "path": "dist/i18n/ja.extra.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('ja', {\n  dateiso:  \"有効な日付を入力してください。 (YYYY-MM-DD).\",\n  minwords: \"語句が短すぎます。 %s 語以上で入力してください。\",\n  maxwords: \"語句が長すぎます。 %s 語以内で入力してください。\",\n  words:    \"語句の長さが正しくありません。 %s 語から %s 語の間で入力してください。\",\n  gt:       \"より大きい値を入力してください。\",\n  gte:      \"より大きいか、同じ値を入力してください。\",\n  lt:       \"より小さい値を入力してください。\",\n  lte:      \"より小さいか、同じ値を入力してください。\",\n  notequalto: \"異なる値を入力してください。\"\n});\n"
  },
  {
    "path": "dist/i18n/ja.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('ja', {\n  defaultMessage: \"無効な値です。\",\n  type: {\n    email:        \"有効なメールアドレスを入力してください。\",\n    url:          \"有効なURLを入力してください。\",\n    number:       \"数値を入力してください。\",\n    integer:      \"整数を入力してください。\",\n    digits:       \"数字を入力してください。\",\n    alphanum:     \"英数字を入力してください。\"\n  },\n  notblank:       \"この値を入力してください\",\n  required:       \"この値は必須です。\",\n  pattern:        \"この値は無効です。\",\n  min:            \"%s 以上の値にしてください。\",\n  max:            \"%s 以下の値にしてください。\",\n  range:          \"%s から %s の値にしてください。\",\n  minlength:      \"%s 文字以上で入力してください。\",\n  maxlength:      \"%s 文字以下で入力してください。\",\n  length:         \"%s から %s 文字の間で入力してください。\",\n  mincheck:       \"%s 個以上選択してください。\",\n  maxcheck:       \"%s 個以下選択してください。\",\n  check:          \"%s から %s 個選択してください。\",\n  equalto:        \"値が違います。\"\n});\n\nParsley.setLocale('ja');\n"
  },
  {
    "path": "dist/i18n/ko.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('ko', {\n  defaultMessage: \"입력하신 내용이 올바르지 않습니다.\",\n  type: {\n    email:        \"입력하신 이메일이 유효하지 않습니다.\",\n    url:          \"입력하신 URL이 유효하지 않습니다.\",\n    number:       \"입력하신 전화번호가 올바르지 않습니다.\",\n    integer:      \"입력하신 정수가 유효하지 않습니다.\",\n    digits:       \"숫자를 입력하여 주십시오.\",\n    alphanum:     \"입력하신 내용은 알파벳과 숫자의 조합이어야 합니다.\"\n  },\n  notblank:       \"공백은 입력하실 수 없습니다.\",\n  required:       \"필수 입력사항입니다.\",\n  pattern:        \"입력하신 내용이 올바르지 않습니다.\",\n  min:            \"입력하신 내용이 %s보다 크거나 같아야 합니다. \",\n  max:            \"입력하신 내용이 %s보다 작거나 같아야 합니다.\",\n  range:          \"입력하신 내용이 %s보다 크고 %s 보다 작아야 합니다.\",\n  minlength:      \"%s 이상의 글자수를 입력하십시오. \",\n  maxlength:      \"%s 이하의 글자수를 입력하십시오. \",\n  length:         \"입력하신 내용의 글자수가 %s보다 크고 %s보다 작아야 합니다.\",\n  mincheck:       \"최소한 %s개를 선택하여 주십시오. \",\n  maxcheck:       \"%s개 또는 그보다 적게 선택하여 주십시오.\",\n  check:          \"선택하신 내용이 %s보다 크거나 %s보다 작아야 합니다.\",\n  equalto:        \"같은 값을 입력하여 주십시오.\"\n});\n\nParsley.setLocale('ko');\n"
  },
  {
    "path": "dist/i18n/lt.extra.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('lt', {\n  dateiso:  \"Šis įrašas turi būti teisingo formato data (YYYY-MM-DD).\",\n  minwords: \"Šis įrašas turi turėti ne mažiau kaip %s žodžių.\",\n  maxwords: \"Šis įrašas turi turėti ne daugiau kaip %s žodžių.\",\n  words:    \"Šis įrašas turi turėti nuo %s iki %s žodžių.\",\n  gt:       \"Ši vertė turi būti didesnė.\",\n  gte:      \"Ši vertė turi būti didesnė arba lygi.\",\n  lt:       \"Ši vertė turi būti mažesnė.\",\n  lte:      \"Ši vertė turi būti mažesnė arba lygi.\",\n  notequalto: \"Ši vertė turi būti skirtinga.\"\n});\n"
  },
  {
    "path": "dist/i18n/lt.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('lt', {\n  defaultMessage: \"Šis įrašas neteisingas.\",\n  type: {\n    email:        \"Šis įrašas nėra teisingas el. paštas.\",\n    url:          \"Šis įrašas nėra teisingas url.\",\n    number:       \"Šis įrašas nėra skaičius.\",\n    integer:      \"Šis įrašas nėra sveikasis skaičius.\",\n    digits:       \"Šis įrašas turi būti skaičius.\",\n    alphanum:     \"Šis įrašas turi būti iš skaičių ir raidžių.\"\n  },\n  notblank:       \"Šis įrašas negali būti tuščias.\",\n  required:       \"Šis įrašas yra privalomas\",\n  pattern:        \"Šis įrašas neteisingas.\",\n  min:            \"Ši vertė turi būti didesnė arba lygi %s.\",\n  max:            \"Ši vertė turi būti mažesnė arba lygi %s.\",\n  range:          \"Ši vertė turi būti tarp %s ir %s.\",\n  minlength:      \"Šis įrašas per trumpas. Jis turi turėti %s simbolius arba daugiau.\",\n  maxlength:      \"Šis įrašas per ilgas. Jis turi turėti %s simbolius arba mažiau.\",\n  length:         \"Šio įrašo ilgis neteisingas. Jis turėtų būti tarp %s ir %s simbolių.\",\n  mincheck:       \"Jūs turite pasirinkti bent %s pasirinkimus.\",\n  maxcheck:       \"Jūs turite pasirinkti ne daugiau %s pasirinkimų.\",\n  check:          \"Jūs turite pasirinkti tarp %s ir %s pasirinkimų.\",\n  equalto:        \"Ši reikšmė turėtų būti vienoda.\"\n});\n\nParsley.setLocale('lt');\n"
  },
  {
    "path": "dist/i18n/lv.extra.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('lv', {\n  dateiso:  \"Šai vērtībai jābūt korekti noformētam datumam (YYYY-MM-DD).\",\n  minwords: \"Šī vērtība ir par īsu. Tai jābūt vismaz %s vārdus garai.\",\n  maxwords: \"Šī vērtība ir par garu. Tai jābūt %s vārdus garai vai īsākai.\",\n  words:    \"Šīs vērtības garums ir nederīgs. Tai jābūt no %s līdz %s vārdus garai.\",\n  gt:       \"Šai vērtībai jābūt lielākai.\",\n  gte:      \"Šai vērtībai jābūt lielākai vai vienādai.\",\n  lt:       \"Šai vērtībai jābūt mazākai.\",\n  lte:      \"Šai vērtībai jābūt mazākai vai vienādai.\",\n  notequalto: \"Šai vērtībai jābūt atšķirīgai.\"\n});\n"
  },
  {
    "path": "dist/i18n/lv.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('lv', {\n  defaultMessage: \"Šis ieraksts veikts nekorekti.\",\n  type: {\n    email:        \"Šeit jāieraksta derīgs e-pasts.\",\n    url:          \"Šeit jāieraksta korekts url.\",\n    number:       \"Šeit jāieraksta derīgs skaitlis.\",\n    integer:      \"Šeit jāieraksta vesels skaitlis.\",\n    digits:       \"Šeit jāieraksta cipari.\",\n    alphanum:     \"Šeit derīgi tikai alfabēta burti vai cipari.\"\n  },\n  notblank:       \"Šis ieraksts nedrīkst būt tukšs.\",\n  required:       \"Šis ieraksts ir obligāti jāaizpilda.\",\n  pattern:        \"Šis ieraksts aizpildīts nekorekti.\",\n  min:            \"Šai vērtībai jābūt lielākai vai vienādai ar %s.\",\n  max:            \"Šai vērtībai jābūt mazākai vai vienādai ar %s.\",\n  range:          \"Šai vērtībai jābūt starp %s un %s.\",\n  minlength:      \"Vērtībai jābūt vismaz %s simbolu garai.\",\n  maxlength:      \"Vērtībai jābūt %s simbolus garai vai īsākai.\",\n  length:         \"Šīs vērtības garums ir neatbilstošs. Tai jābūt %s līdz %s simbolus garai.\",\n  mincheck:       \"Jāizvēlas vismaz %s varianti.\",\n  maxcheck:       \"Jāizvēlas %s varianti vai mazāk.\",\n  check:          \"Jāizvēlas no %s līdz %s variantiem.\",\n  equalto:        \"Šai vērtībai jāsakrīt.\"\n});\n\nParsley.setLocale('lv');\n"
  },
  {
    "path": "dist/i18n/mk.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('mk', {\n  defaultMessage: \"Оваа вредност се чини дека е неважечка.\",\n  type: {\n    email:        \"Оваа вредност треба да е важечка е-пошта.\",\n    url:          \"Оваа вредност треба да е важечки урл.\",\n    number:       \"Оваа вредност треба да е важечки број.\",\n    integer:      \"Оваа вредност треба да е важечки цел број.\",\n    digits:       \"Оваа вредност треба да е цифри.\",\n    alphanum:     \"Оваа вредност треба да е алфанумеричка\"\n  },\n  notblank:       \"Оваа вредност не треба да е празна.\",\n  required:       \"Оваа вредност е потребна.\",\n  pattern:        \"Оваа вредност се чини дека е неважечка.\",\n  min:            \"Оваа вредност треба да е поголема од или еднаква на %s.\",\n  max:            \"Оваа вредност треба да е помала од или еднаква на %s.\",\n  range:          \"Оваа вредност треба да е помеѓу %s и %s.\",\n  minlength:      \"Оваа вредност е прекратка. Треба да има %s знаци или повеќе.\",\n  maxlength:      \"Оваа вредност е предолга. Треба да има %s знаци или помалку.\",\n  length:         \"Должината на оваа вредност е неважечка. Треба да биде долга помеѓу %s и %s знаци.\",\n  mincheck:       \"Мора да изберете најмалку %s опции.\",\n  maxcheck:       \"Мора да изберете %s опции или помалку.\",\n  check:          \"Мора да изберете помеѓу %s и %s опции.\",\n  equalto:        \"Оваа вредност треба да биде иста.\"\n});\n\nParsley.setLocale('mk');\n"
  },
  {
    "path": "dist/i18n/ms.extra.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('ms', {\n  dateiso:  \"Nilai hendaklah berbentuk tarikh yang sah (YYYY-MM-DD).\",\n  minwords: \"Ayat terlalu pendek. Ianya perlu sekurang-kurangnya %s patah perkataan.\",\n  maxwords: \"Ayat terlalu panjang. Ianya tidak boleh melebihi %s patah perkataan.\",\n  words:    \"Panjang ayat tidak sah. Jumlah perkataan adalah diantara %s hingga %s patah perkataan.\",\n  gt:       \"Nilai lebih besar diperlukan.\",\n  gte:      \"Nilai hendaklah lebih besar atau sama.\",\n  lt:       \"Nilai lebih kecil diperlukan.\",\n  lte:      \"Nilai hendaklah lebih kecil atau sama.\"\n});\n"
  },
  {
    "path": "dist/i18n/ms.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('ms', {\n  defaultMessage: \"Nilai tidak sah.\",\n  type: {\n    email:        \"Nilai mestilah dalam format emel yang sah.\",\n    url:          \"Nilai mestilah dalam bentuk url yang sah.\",\n    number:       \"Hanya nombor dibenarkan.\",\n    integer:      \"Hanya integer dibenarkan.\",\n    digits:       \"Hanya angka dibenarkan.\",\n    alphanum:     \"Hanya alfanumerik dibenarkan.\"\n  },\n  notblank:       \"Nilai ini tidak boleh kosong.\",\n  required:       \"Nilai ini wajib diisi.\",\n  pattern:        \"Bentuk nilai ini tidak sah.\",\n  min:            \"Nilai perlu lebih besar atau sama dengan %s.\",\n  max:            \"Nilai perlu lebih kecil atau sama dengan %s.\",\n  range:          \"Nilai perlu berada antara %s hingga %s.\",\n  minlength:      \"Nilai terlalu pendek. Ianya perlu sekurang-kurangnya %s huruf.\",\n  maxlength:      \"Nilai terlalu panjang. Ianya tidak boleh melebihi %s huruf.\",\n  length:         \"Panjang nilai tidak sah. Panjangnya perlu diantara %s hingga %s huruf.\",\n  mincheck:       \"Anda mesti memilih sekurang-kurangnya %s pilihan.\",\n  maxcheck:       \"Anda tidak boleh memilih lebih daripada %s pilihan.\",\n  check:          \"Anda mesti memilih diantara %s hingga %s pilihan.\",\n  equalto:        \"Nilai dimasukkan hendaklah sama.\"\n});\n\nParsley.setLocale('ms');\n"
  },
  {
    "path": "dist/i18n/nl.extra.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('nl', {\n  dateiso:  \"Deze waarde moet een datum in het volgende formaat zijn: (YYYY-MM-DD).\",\n  date:     \"Dit moet een geldige datum zijn in formaat %s.\",\n  datebeforenow: \"Datum moet geldig zijn in het formaat %s en eerder zijn dan nu.\",\n  dateafternow: \"Datum moet geldig zijn in het formaat %s en later zijn dan nu.\",\n  minwords: \"Deze waarde moet minstens %s woorden bevatten.\",\n  maxwords: \"Deze waarde mag maximaal %s woorden bevatten.\",\n  words:    \"Deze waarde moet tussen de %s en %s woorden bevatten.\",\n  gt:       \"Deze waarde moet groter dan %s zijn.\",\n  gte:      \"Deze waarde moet groter zijn dan of gelijk zijn aan %s.\",\n  lt:       \"Deze waarde moet kleiner dan %s zijn.\",\n  lte:      \"Deze waarde moet kleiner zijn dan of gelijk zijn aan %s.\",\n  notequalto: \"Deze waarde moet verschillen van %s.\"\n});\n"
  },
  {
    "path": "dist/i18n/nl.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('nl', {\n  defaultMessage: \"Deze waarde lijkt onjuist.\",\n  type: {\n    email:        \"Dit lijkt geen geldig e-mail adres te zijn.\",\n    url:          \"Dit lijkt geen geldige URL te zijn.\",\n    number:       \"Deze waarde moet een nummer zijn.\",\n    integer:      \"Deze waarde moet een nummer zijn.\",\n    digits:       \"Deze waarde moet numeriek zijn.\",\n    alphanum:     \"Deze waarde moet alfanumeriek zijn.\"\n  },\n  notblank:       \"Deze waarde mag niet leeg zijn.\",\n  required:       \"Dit veld is verplicht.\",\n  pattern:        \"Deze waarde lijkt onjuist te zijn.\",\n  min:            \"Deze waarde mag niet lager zijn dan %s.\",\n  max:            \"Deze waarde mag niet groter zijn dan %s.\",\n  range:          \"Deze waarde moet tussen %s en %s liggen.\",\n  minlength:      \"Deze tekst is te kort. Deze moet uit minimaal %s karakters bestaan.\",\n  maxlength:      \"Deze waarde is te lang. Deze mag maximaal %s karakters lang zijn.\",\n  length:         \"Deze waarde moet tussen %s en %s karakters lang zijn.\",\n  equalto:        \"Deze waardes moeten identiek zijn.\"\n});\n\nParsley.setLocale('nl');\n"
  },
  {
    "path": "dist/i18n/no.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('no', {\n  defaultMessage: \"Verdien er ugyldig.\",\n  type: {\n    email:        \"Verdien må være en gyldig e-postadresse.\",\n    url:          \"Verdien må være en gyldig url.\",\n    number:       \"Verdien må være et gyldig tall.\",\n    integer:      \"Verdien må være et gyldig heltall.\",\n    digits:       \"Verdien må være et siffer.\",\n    alphanum:     \"Verdien må være alfanumerisk\"\n  },\n  notblank:       \"Verdien kan ikke være blank.\",\n  required:       \"Verdien er obligatorisk.\",\n  pattern:        \"Verdien er ugyldig.\",\n  min:            \"Verdien må være større eller lik %s.\",\n  max:            \"Verdien må være mindre eller lik %s.\",\n  range:          \"Verdien må være mellom %s and %s.\",\n  minlength:      \"Verdien er for kort. Den må bestå av minst %s tegn.\",\n  maxlength:      \"Verdien er for lang. Den kan bestå av maksimalt %s tegn.\",\n  length:         \"Verdien har ugyldig lengde. Den må være mellom %s og %s tegn lang.\",\n  mincheck:       \"Du må velge minst %s alternativer.\",\n  maxcheck:       \"Du må velge %s eller færre alternativer.\",\n  check:          \"Du må velge mellom %s og %s alternativer.\",\n  equalto:        \"Verdien må være lik.\"\n});\n\nParsley.setLocale('no');\n"
  },
  {
    "path": "dist/i18n/pl.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('pl', {\n  defaultMessage: \"Wartość wygląda na nieprawidłową\",\n  type: {\n    email:        \"Wpisz poprawny adres e-mail.\",\n    url:          \"Wpisz poprawny adres URL.\",\n    number:       \"Wpisz poprawną liczbę.\",\n    integer:      \"Dozwolone są jedynie liczby całkowite.\",\n    digits:       \"Dozwolone są jedynie cyfry.\",\n    alphanum:     \"Dozwolone są jedynie znaki alfanumeryczne.\"\n  },\n  notblank:       \"Pole nie może być puste.\",\n  required:       \"Pole jest wymagane.\",\n  pattern:        \"Pole zawiera nieprawidłową wartość.\",\n  min:            \"Wartość nie może być mniejsza od %s.\",\n  max:            \"Wartość nie może być większa od %s.\",\n  range:          \"Wartość powinna zawierać się pomiędzy %s a %s.\",\n  minlength:      \"Minimalna ilość znaków wynosi %s.\",\n  maxlength:      \"Maksymalna ilość znaków wynosi %s.\",\n  length:         \"Ilość znaków wynosi od %s do %s.\",\n  mincheck:       \"Wybierz minimalnie %s opcji.\",\n  maxcheck:       \"Wybierz maksymalnie %s opcji.\",\n  check:          \"Wybierz od %s do %s opcji.\",\n  equalto:        \"Wartości nie są identyczne.\"\n});\n\nParsley.setLocale('pl');\n"
  },
  {
    "path": "dist/i18n/pt-br.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('pt-br', {\n  defaultMessage: \"Este valor parece ser inválido.\",\n  type: {\n    email:        \"Este campo deve ser um email válido.\",\n    url:          \"Este campo deve ser um URL válida.\",\n    number:       \"Este campo deve ser um número válido.\",\n    integer:      \"Este campo deve ser um inteiro válido.\",\n    digits:       \"Este campo deve conter apenas dígitos.\",\n    alphanum:     \"Este campo deve ser alfa numérico.\"\n  },\n  notblank:       \"Este campo não pode ficar vazio.\",\n  required:       \"Este campo é obrigatório.\",\n  pattern:        \"Este campo parece estar inválido.\",\n  min:            \"Este campo deve ser maior ou igual a %s.\",\n  max:            \"Este campo deve ser menor ou igual a %s.\",\n  range:          \"Este campo deve estar entre %s e %s.\",\n  minlength:      \"Este campo é pequeno demais. Ele deveria ter %s caracteres ou mais.\",\n  maxlength:      \"Este campo é grande demais. Ele deveria ter %s caracteres ou menos.\",\n  length:         \"O tamanho deste campo é inválido. Ele deveria ter entre %s e %s caracteres.\",\n  mincheck:       \"Você deve escolher pelo menos %s opções.\",\n  maxcheck:       \"Você deve escolher %s opções ou mais\",\n  check:          \"Você deve escolher entre %s e %s opções.\",\n  equalto:        \"Este valor deveria ser igual.\"\n});\n\nParsley.setLocale('pt-br');\n"
  },
  {
    "path": "dist/i18n/pt-pt.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('pt-pt', {\n  defaultMessage: \"Este valor parece ser inválido.\",\n  type: {\n    email:        \"Este campo deve ser um email válido.\",\n    url:          \"Este campo deve ser um URL válido.\",\n    number:       \"Este campo deve ser um número válido.\",\n    integer:      \"Este campo deve ser um número inteiro válido.\",\n    digits:       \"Este campo deve conter apenas dígitos.\",\n    alphanum:     \"Este campo deve ser alfanumérico.\"\n  },\n  notblank:       \"Este campo não pode ficar vazio.\",\n  required:       \"Este campo é obrigatório.\",\n  pattern:        \"Este campo parece estar inválido.\",\n  min:            \"Este valor deve ser maior ou igual a %s.\",\n  max:            \"Este valor deve ser menor ou igual a %s.\",\n  range:          \"Este valor deve estar entre %s e %s.\",\n  minlength:      \"Este campo é pequeno demais. Deve ter %s caracteres ou mais.\",\n  maxlength:      \"Este campo é grande demais. Deve ter %s caracteres ou menos.\",\n  length:         \"O tamanho deste campo é inválido. Ele deveria ter entre %s e %s caracteres.\",\n  mincheck:       \"Escolha pelo menos %s opções.\",\n  maxcheck:       \"Escolha %s opções ou mais\",\n  check:          \"Escolha entre %s e %s opções.\",\n  equalto:        \"Este valor deveria ser igual.\"\n});\n\nParsley.setLocale('pt-pt');\n"
  },
  {
    "path": "dist/i18n/ro.extra.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('ro', {\n  dateiso:    \"Trebuie să fie o dată corectă (YYYY-MM-DD).\",\n  minwords:   \"Textul e prea scurt. Trebuie să aibă cel puțin %s cuvinte.\",\n  maxwords:   \"Textul e prea lung. Trebuie să aibă cel mult %s cuvinte.\",\n  words:      \"Textul trebuie să aibă cel puțin %s și cel mult %s caractere.\",\n  gt:         \"Valoarea ar trebui să fie mai mare.\",\n  gte:        \"Valoarea ar trebui să fie mai mare sau egală.\",\n  lt:         \"Valoarea ar trebui să fie mai mică.\",\n  lte:        \"Valoarea ar trebui să fie mai mică sau egală.\",\n  notequalto: \"Valoarea ar trebui să fie diferită.\"\n});\n"
  },
  {
    "path": "dist/i18n/ro.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('ro', {\n  defaultMessage: \"Acest câmp nu este completat corect.\",\n  type: {\n    email:        \"Trebuie să scrii un email valid.\",\n    url:          \"Trebuie să scrii un link valid\",\n    number:       \"Trebuie să scrii un număr valid\",\n    integer:      \"Trebuie să scrii un număr întreg valid\",\n    digits:       \"Trebuie să conțină doar cifre.\",\n    alphanum:     \"Trebuie să conțină doar cifre sau litere.\"\n  },\n  notblank:       \"Acest câmp nu poate fi lăsat gol.\",\n  required:       \"Acest câmp trebuie să fie completat.\",\n  pattern:        \"Acest câmp nu este completat corect.\",\n  min:            \"Trebuie să fie ceva mai mare sau egal cu %s.\",\n  max:            \"Trebuie să fie ceva mai mic sau egal cu %s.\",\n  range:          \"Valoarea trebuie să fie între %s și %s.\",\n  minlength:      \"Trebuie să scrii cel puțin %s caractere.\",\n  maxlength:      \"Trebuie să scrii cel mult %s caractere.\",\n  length:         \"Trebuie să scrii cel puțin %s și %s cel mult %s caractere.\",\n  mincheck:       \"Trebuie să alegi cel puțin %s opțiuni.\",\n  maxcheck:       \"Poți alege maxim %s opțiuni.\",\n  check:          \"Trebuie să alegi între %s sau %s.\",\n  equalto:        \"Trebuie să fie la fel.\"\n});\n\nParsley.setLocale('ro');\n"
  },
  {
    "path": "dist/i18n/ru.extra.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('ru', {\n  dateiso:  \"Это значение должно быть корректной датой (ГГГГ-ММ-ДД).\",\n  minwords: \"Это значение должно содержать не менее %s слов.\",\n  maxwords: \"Это значение должно содержать не более %s слов.\",\n  words:    \"Это значение должно содержать от %s до %s слов.\",\n  gt:       \"Это значение должно быть больше.\",\n  gte:      \"Это значение должно быть больше или равно.\",\n  lt:       \"Это значение должно быть меньше.\",\n  lte:      \"Это значение должно быть меньше или равно.\",\n  notequalto: \"Это значение должно отличаться.\"\n});\n"
  },
  {
    "path": "dist/i18n/ru.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('ru', {\n  defaultMessage: \"Некорректное значение.\",\n  type: {\n    email:        \"Введите адрес электронной почты.\",\n    url:          \"Введите URL адрес.\",\n    number:       \"Введите число.\",\n    integer:      \"Введите целое число.\",\n    digits:       \"Введите только цифры.\",\n    alphanum:     \"Введите буквенно-цифровое значение.\"\n  },\n  notblank:       \"Это поле должно быть заполнено.\",\n  required:       \"Обязательное поле.\",\n  pattern:        \"Это значение некорректно.\",\n  min:            \"Это значение должно быть не менее чем %s.\",\n  max:            \"Это значение должно быть не более чем %s.\",\n  range:          \"Это значение должно быть от %s до %s.\",\n  minlength:      \"Это значение должно содержать не менее %s символов.\",\n  maxlength:      \"Это значение должно содержать не более %s символов.\",\n  length:         \"Это значение должно содержать от %s до %s символов.\",\n  mincheck:       \"Выберите не менее %s значений.\",\n  maxcheck:       \"Выберите не более %s значений.\",\n  check:          \"Выберите от %s до %s значений.\",\n  equalto:        \"Это значение должно совпадать.\"\n});\n\nParsley.setLocale('ru');\n"
  },
  {
    "path": "dist/i18n/sk.extra.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('sk', {\n  dateiso:  \"Prosím zadajte dátum vo formáte RRRR-MM-DD.\",\n  minwords: \"Prosím zadajte hodnotu dlhú %s slov a viacej.\",\n  maxwords: \"Prosím zadajte hodnotu kratšiu ako %s slov.\",\n  words:    \"Prosím zadajte hodnotu medzi %s a %s slov.\",\n  gt:       \"Táto hodnota musí byť väčšia.\",\n  gte:      \"Táto hodnota musí byť väčšia alebo rovná.\",\n  lt:       \"Táto hodnota musí byť menšia.\",\n  lte:      \"Táto hodnota musí byť menšia alebo rovná.\"\n});\n"
  },
  {
    "path": "dist/i18n/sk.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('sk', {\n  defaultMessage: \"Prosím zadajte správnu hodnotu.\",\n  type: {\n    email:        \"Prosím zadajte správnu emailovú adresu.\",\n    url:          \"Prosím zadajte platnú URL adresu.\",\n    number:       \"Toto pole môže obsahovať len čísla.\",\n    integer:      \"Toto pole môže obsahovať len celé čísla.\",\n    digits:       \"Toto pole môže obsahovať len kladné celé čísla.\",\n    alphanum:     \"Toto pole môže obsahovať len alfanumerické znaky.\"\n  },\n  notblank:       \"Toto pole nesmie byť prázdne.\",\n  required:       \"Toto pole je povinné.\",\n  pattern:        \"Toto pole je neplatné.\",\n  min:            \"Prosím zadajte hodnotu väčšiu alebo rovnú %s.\",\n  max:            \"Prosím zadajte hodnotu menšiu alebo rovnú %s.\",\n  range:          \"Prosím zadajte hodnotu v rozmedzí %s a %s\",\n  minlength:      \"Prosím zadajte hodnotu dlhšiu ako %s znakov.\",\n  maxlength:      \"Prosím zadajte hodnotu kratšiu ako %s znakov.\",\n  length:         \"Prosím zadajte hodnotu medzi %s a %s znakov.\",\n  mincheck:       \"Je nutné vybrať minimálne %s možností.\",\n  maxcheck:       \"Je nutné vybrať maximálne %s možností.\",\n  check:          \"Je nutné vybrať od %s do %s možností.\",\n  equalto:        \"Prosím zadajte rovnakú hodnotu.\"\n});\n\nParsley.setLocale('sk');\n"
  },
  {
    "path": "dist/i18n/sl.extra.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('sl', {\n  dateiso:  \"Vnesite datum v ISO obliki (YYYY-MM-DD).\",\n  minwords: \"Vpis je prekratek. Vpisati morate najmnaj %s besed.\",\n  maxwords: \"Vpis je predolg. Vpišete lahko največ %s besed.\",\n  words:    \"Dolžina vpisa je napačna. Dolžina je lahko samo med %s in %s besed.\",\n  gt:       \"Vpisani podatek mora biti večji.\",\n  gte:      \"Vpisani podatek mora biti enak ali večji.\",\n  lt:       \"Vpisani podatek mora biti manjši.\",\n  lte:      \"Vpisani podatek mora biti enak ali manjši.\",\n  notequalto: \"Vpisana vrednost mora biti drugačna.\"\n});\n"
  },
  {
    "path": "dist/i18n/sl.js",
    "content": "// This is included with the Parsley library itself,\n// thus there is no use in adding it to your project.\n\n\nParsley.addMessages('sl', {\n  defaultMessage: \"Podatek ne ustreza vpisnim kriterijem.\",\n  type: {\n    email:        \"Vpišite pravilen email.\",\n    url:          \"Vpišite pravilen url naslov.\",\n    number:       \"Vpišite številko.\",\n    integer:      \"Vpišite celo število brez decimalnih mest.\",\n    digits:       \"Vpišite samo cifre.\",\n    alphanum:     \"Vpišite samo alfanumerične znake (cifre in črke).\"\n  },\n  notblank:       \"To polje ne sme biti prazno.\",\n  required:       \"To polje je obvezno.\",\n  pattern:        \"Podatek ne ustreza vpisnim kriterijem.\",\n  min:            \"Vrednost mora biti višja ali enaka kot %s.\",\n  max:            \"Vrednost mora biti nižja ali enaka kot  %s.\",\n  range:          \"Vrednost mora biti med %s in %s.\",\n  minlength:      \"Vpis je prekratek. Mora imeti najmanj %s znakov.\",\n  maxlength:      \"Vpis je predolg. Lahko ima največ %s znakov.\",\n  length:         \"Število vpisanih znakov je napačno. Število znakov je lahko samo med %s in %s.\",\n  mincheck:       \"Izbrati morate vsaj %s možnosti.\",\n  maxcheck:       \"Izberete lahko največ %s možnosti.\",\n  check:          \"Število izbranih možnosti je lahko samo med %s in %s.\",\n  equalto:        \"Vnos mora biti enak.\"\n});\n\nParsley.setLocale('sl');\n"
  },
  {
    "path": "dist/i18n/sq.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('sq', {\n  defaultMessage: \"Kjo vlere eshte e pasakte.\",\n  type: {\n    email:        \"Duhet te jete nje email i vlefshem.\",\n    url:          \"Duhet te jete nje URL e vlefshme.\",\n    number:       \"Duhet te jete numer.\",\n    integer:      \"Kjo vlere duhet te jete integer.\",\n    digits:       \"Kjo vlere duhet te permbaje digit.\",\n    alphanum:     \"Kjo vlere duhet te permbaje vetel alphanumeric.\"\n  },\n  notblank:       \"Nuk mund te lihet bosh.\",\n  required:       \"Eshte e detyrueshme.\",\n  pattern:        \"Kjo vlere eshte e pasakte.\",\n  min:            \"Duhet te jete me e madhe ose baraz me %s.\",\n  max:            \"Duhet te jete me e vogel ose baraz me %s.\",\n  range:          \"Duhet te jete midis %s dhe %s.\",\n  minlength:      \"Kjo vlere eshte shume e shkurter. Ajo duhet te permbaje min %s karaktere.\",\n  maxlength:      \"Kjo vlere eshte shume e gjate. Ajo duhet te permbaje max %s karaktere.\",\n  length:         \"Gjatesia e kesaj vlere eshte e pasakte. Ajo duhet te jete midis %s dhe %s karakteresh.\",\n  mincheck:       \"Ju duhet te zgjidhni te pakten %s vlere.\",\n  maxcheck:       \"Ju duhet te zgjidhni max %s vlera.\",\n  check:          \"Ju mund te zgjidhni midis %s dhe %s vlerash.\",\n  equalto:        \"Kjo vlere duhet te jete e njejte.\"\n});\n\nParsley.setLocale('sq');\n"
  },
  {
    "path": "dist/i18n/sr.extra.js",
    "content": "// Extra validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('sr', {\n  dateiso:  \"Unesite validan datum u formatu YYYY-MM-DD.\",\n  minwords: \"Potrebno je da unesete %s ili više reči.\",\n  maxwords: \"Moguće je uneti maksimalno %s reči.\",\n  words:    \"Potrebno je da unesete između %s i %s reči.\",\n  gt:       \"Ova vrednost mora da bude veća.\",\n  gte:      \"Ova vrednost mora da bude veća ili jednaka.\",\n  lt:       \"Ova vrednost mora da bude manja.\",\n  lte:      \"Ova vrednost mora da bude manja ili jednaka.\",\n  notequalto: \"Sadržaj ovog polja mora biti različit.\"\n});\n"
  },
  {
    "path": "dist/i18n/sr.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('sr', {\n  defaultMessage: \"Uneta vrednost nije validna.\",\n  type: {\n    email:        \"Unesite pravilnu email adresu.\",\n    url:          \"Unesite pravilnu url adresu.\",\n    number:       \"Unesite numeričku vrednost.\",\n    integer:      \"Unesite ceo broj bez decimala.\",\n    digits:       \"Unesite samo brojeve.\",\n    alphanum:     \"Unesite samo alfanumeričke znake (slova i brojeve).\"\n  },\n  notblank:       \"Ovo polje ne sme biti prazno.\",\n  required:       \"Ovo polje je obavezno.\",\n  pattern:        \"Uneta vrednost nije validna.\",\n  min:            \"Vrednost mora biti veća ili jednaka %s.\",\n  max:            \"Vrednost mora biti manja ili jednaka %s.\",\n  range:          \"Vrednost mora biti između %s i %s.\",\n  minlength:      \"Unos je prekratak. Mora imati najmanje %s znakova.\",\n  maxlength:      \"Unos je predug. Može imati najviše %s znakova.\",\n  length:         \"Dužina unosa je pogrešna. Broj znakova mora biti između %s i %s.\",\n  mincheck:       \"Morate izabrati minimalno %s opcija.\",\n  maxcheck:       \"Možete izabrati najviše %s opcija.\",\n  check:          \"Broj izabranih opcija mora biti između %s i %s.\",\n  equalto:        \"Unos mora biti jednak.\"\n});\n\nParsley.setLocale('sr');\n"
  },
  {
    "path": "dist/i18n/sv.extra.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('sv', {\n  dateiso: \"Ange ett giltigt datum (ÅÅÅÅ-MM-DD).\"\n});\n"
  },
  {
    "path": "dist/i18n/sv.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('sv', {\n  defaultMessage: \"Ogiltigt värde.\",\n  type: {\n    email:        \"Ange en giltig e-postadress.\",\n    url:          \"Ange en giltig URL.\",\n    number:       \"Ange ett giltigt nummer.\",\n    integer:      \"Ange ett heltal.\",\n    digits:       \"Ange endast siffror.\",\n    alphanum:     \"Ange endast bokstäver och siffror.\"\n  },\n  notblank:       \"Värdet får inte vara tomt.\",\n  required:       \"Måste fyllas i.\",\n  pattern:        \"Värdet är ej giltigt.\",\n  min:            \"Värdet måste vara större än eller lika med %s.\",\n  max:            \"Värdet måste vara mindre än eller lika med %s.\",\n  range:          \"Värdet måste vara mellan %s och %s.\",\n  minlength:      \"Värdet måste vara minst %s tecken.\",\n  maxlength:      \"Värdet får maximalt innehålla %s tecken.\",\n  length:         \"Värdet måste vara mellan %s och %s tecken.\",\n  mincheck:       \"Minst %s val måste göras.\",\n  maxcheck:       \"Maximalt %s val får göras.\",\n  check:          \"Mellan %s och %s val måste göras.\",\n  equalto:        \"Värdena måste vara lika.\"\n});\n\nParsley.setLocale('sv');\n"
  },
  {
    "path": "dist/i18n/ta.js",
    "content": "// Validation errors messages for Parsley TAMIL language Translated by pitchaimuthu2050 AT GAMAIL DOT COM\n// This translation is part of the Project https://thanithamizhakarathikalanjiyam.github.io/\n// Load this after Parsley\n\nParsley.addMessages('ta', {\n  defaultMessage: \"இந்த மதிப்பு தவறானது எனத் தெரிகிறது.\",\n  type: {\n    email:        \"இந்த மதிப்பு சரியான மின்னஞ்சலாக இருக்க வேண்டும்.\",\n    url:          \"இந்த மதிப்பு சரியான URL ஆக இருக்க வேண்டும்.\",\n    number:       \"இந்த மதிப்பு சரியான எண்ணாக இருக்க வேண்டும்.\",\n    integer:      \"இந்த மதிப்பு சரியான முழு எண்ணாக இருக்க வேண்டும்.\",\n    digits:       \"இந்த மதிப்பு இலக்கங்களாக இருக்க வேண்டும்.\",\n    alphanum:     \"இந்த மதிப்பு எண்ணெழுதாக இருக்க வேண்டும்.\"\n  },\n  notblank:       \"இந்த மதிப்பு காலியாக இருக்கக்கூடாது.\",\n  required:       \"இந்த மதிப்பு தேவை.\",\n  pattern:        \"இந்த மதிப்பு தவறானது என்று தெரிகிறது.\",\n  min:            \"இந்த மதிப்பு அதிகமாகவோ அல்லது சமமாகவோ இருக்க வேண்டும் %s.\",\n  max:            \"இந்த மதிப்பு குறைவாகவோ அல்லது சமமாகவோ இருக்க வேண்டும் %s.\",\n  range:          \"இந்த மதிப்பு %s முதல் %s வரை இருக்க வேண்டும்.\",\n  minlength:      \"இந்த மதிப்பு மிகக் குறைவு. இது %s எழுத்துக்கள் அல்லது அதற்கு மேற்பட்டதாக இருக்க வேண்டும்.\",\n  maxlength:      \"இந்த மதிப்பு மிக நீளமானது. இது %s எழுத்துக்கள் அல்லது குறைவாக இருக்க வேண்டும்.\",\n  length:         \"இந்த மதிப்பு நீளம் தவறானது. இது %s மற்றும் %s எழுத்துக்களுக்கு இடையில் இருக்க வேண்டும்.\",\n  mincheck:       \"நீங்கள் குறைந்தது %s தேர்வுகளை தேர்ந்தெடுக்க வேண்டும்.\",\n  maxcheck:       \"நீங்கள் %s தேர்வுகள் அல்லது குறைவாக தேர்ந்தெடுக்க வேண்டும்.\",\n  check:          \"நீங்கள் %s மற்றும் %s தேர்வுகளுக்கு இடையே தேர்ந்தெடுக்க வேண்டும்.\",\n  equalto:        \"இந்த மதிப்பு ஒரே மாதிரியாக இருக்க வேண்டும்.\",\n  euvatin:        \"இது சரியான VAT அடையாள எண் அல்ல.\",\n});\n\nParsley.setLocale('ta');\n"
  },
  {
    "path": "dist/i18n/th.extra.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('th', {\n  dateiso:  \"วันที่ต้องมีรูปแบบเป็น YYYY-MM-DD\",\n  date:     \"วันที่ไม่ถูกต้องตามรูปแบบ %s\",\n  datebeforenow: \"วันที่ต้องมีรูปแบบเป็น %s และเป็นวันที่ก่อนวันปัจจุบัน\",\n  dateafternow: \"วันที่ต้องมีรูปแบบเป็น %s และเป็นวันที่หลังวันปัจจุบัน\",\n  minwords: \"กรุณากรอกอย่างน้อย %s คำ\",\n  maxwords: \"กรอกได้ไม่เกิน %s คำ\",\n  words:    \"จำนวนคำต้องอยู่ระหว่าง %s ถึง %s คำ\",\n  gt:       \"กรุณากรอกค่าที่มากกว่า %s\",\n  gte:      \"กรุณากรอกค่าที่มากกว่าหรือเท่ากับ %s\",\n  lt:       \"กรุณากรอกค่าที่น้อยกว่า %s\",\n  lte:      \"กรุณากรอกค่าที่น้อยกว่าหรือเท่ากับ %s\",\n  notequalto: \"ค่าที่กรอกต้องเหมือนกับ %s\"\n});\n"
  },
  {
    "path": "dist/i18n/th.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('th', {\n  defaultMessage: \"ค่านี้ดูเหมือนว่าจะไม่ถูกต้อง\",\n  type: {\n    email:        \"กรุณากรอกอีเมลให้ถูกต้อง\",\n    url:          \"กรุณากรอก url ให้ถูกต้อง\",\n    number:       \"กรุณากรอกตัวเลข\",\n    integer:      \"กรุณากรอกจำนวนเต็ม\",\n    digits:       \"กรุณากรอกเลขทศนิยม\",\n    alphanum:     \"กรุณากรอกตัวอักษรและตัวเลข\"\n  },\n  notblank:       \"ห้ามเป็นค่าว่าง\",\n  required:       \"จำเป็นต้องกรอก\",\n  pattern:        \"รูปแบบไม่ถูกต้อง\",\n  min:            \"ต้องมากกว่าหรือเท่ากับ %s\",\n  max:            \"ต้องน้อยกว่าหรือเท่ากับ %s\",\n  range:          \"ต้องอยู่ระหว่าง %s และ %s\",\n  minlength:      \"กรุณากรอกอย่างน้อย %s ตัวอักษร\",\n  maxlength:      \"กรอกได้ไม่เกิน %s ตัวอักษร\",\n  length:         \"ความยาวตัวอักษรต้องอยู่ระหว่าง %s ถึง %s ตัวอักษร\",\n  mincheck:       \"กรุณาเลือกอย่างน้อย %s ตัวเลือก\",\n  maxcheck:       \"เลือกได้ไม่เกิน %s ตัวเลือก\",\n  check:          \"กรุณาเลือกระหว่าง %s และ %s ตัวเลือก\",\n  equalto:        \"ค่าที่กรอกไม่เหมืิอนกัน\",\n  euvatin:        \"หมายเลขประจำตัวผู้เสียภาษีไม่ถูกต้อง\",\n});\n\nParsley.setLocale('th');\n"
  },
  {
    "path": "dist/i18n/tk.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('tk', {\n  defaultMessage: \"Bu maglumat nädogry.\",\n  type: {\n    email:        \"Dogry e-poçta adresi ýazmaly.\",\n    url:          \"Dogry web sahypa salgysy ýazmaly.\",\n    number:       \"Dogry san ýazmaly.\",\n    integer:      \"Dogry bitin san ýazmaly.\",\n    digits:       \"San ýazmaly.\",\n    alphanum:     \"San ýa-da harp ýazmaly.\"\n  },\n  notblank:       \"Bu ýeri boş goýmaly däl.\",\n  required:       \"Bu ýeri doldurmak hökmany.\",\n  pattern:        \"Bu maglumat nädogry.\",\n  min:            \"Iň azyndan %s ýa-da ondan uly bolmaly.\",\n  max:            \"Iň köp %s ýa-da ondan kiçi bolmaly.\",\n  range:          \"Bu ýer %s we %s aralygynda san bolmaly.\",\n  minlength:      \"Bu ýeriň uzynlygy iň azyndan %s harp ýa-da ondan köp bolmaly.\",\n  maxlength:      \"Bu ýeriň uzynlygy iň köp %s harp ýa-da ondan az bolmaly.\",\n  length:         \"Bu ýeriň uzynlygy %s we %s harp aralygynda bolmaly.\",\n  mincheck:       \"Iň azyndan %s sanysyny saýlamaly.\",\n  maxcheck:       \"Iň köp %s sanysyny saýlamaly.\",\n  check:          \"Iň az %s, iň köp %s sanysyny saýlamaly.\",\n  equalto:        \"Bu maglumat deň bolmaly.\"\n});\n\nParsley.setLocale('tk');\n"
  },
  {
    "path": "dist/i18n/tr.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('tr', {\n  defaultMessage: \"Girdiğiniz değer geçerli değil.\",\n  type: {\n    email:        \"Geçerli bir e-mail adresi yazmanız gerekiyor.\",\n    url:          \"Geçerli bir bağlantı adresi yazmanız gerekiyor.\",\n    number:       \"Geçerli bir sayı yazmanız gerekiyor.\",\n    integer:      \"Geçerli bir tamsayı yazmanız gerekiyor.\",\n    digits:       \"Geçerli bir rakam yazmanız gerekiyor.\",\n    alphanum:     \"Geçerli bir alfanümerik değer yazmanız gerekiyor.\"\n  },\n  notblank:       \"Bu alan boş bırakılamaz.\",\n  required:       \"Bu alan boş bırakılamaz.\",\n  pattern:        \"Girdiğiniz değer geçerli değil.\",\n  min:            \"Bu alan %s değerinden büyük ya da bu değere eşit olmalı.\",\n  max:            \"Bu alan %s değerinden küçük ya da bu değere eşit olmalı.\",\n  range:          \"Bu alan %s ve %s değerleri arasında olmalı.\",\n  minlength:      \"Bu alanın uzunluğu %s karakter veya daha fazla olmalı.\",\n  maxlength:      \"Bu alanın uzunluğu %s karakter veya daha az olmalı.\",\n  length:         \"Bu alanın uzunluğu %s ve %s karakter arasında olmalı.\",\n  mincheck:       \"En az %s adet seçim yapmalısınız.\",\n  maxcheck:       \"En fazla %s seçim yapabilirsiniz.\",\n  check:          \"Bu alan için en az %s, en fazla %s seçim yapmalısınız.\",\n  equalto:        \"Bu alanın değeri aynı olmalı.\"\n});\n\nParsley.setLocale('tr');\n"
  },
  {
    "path": "dist/i18n/ua.extra.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('ua', {\n  dateiso:  \"Це значення повинно бути коректною датою (РРРР-ММ-ДД).\",\n  minwords: \"Це значення повинно містити не менше %s слів.\",\n  maxwords: \"Це значення повинно містити не більше %s слів.\",\n  words:    \"Це значення повинно містити від %s до %s слів.\",\n  gt:       \"Це значення повинно бути більше.\",\n  gte:      \"Це значення повинно бути більше або дорівнює.\",\n  lt:       \"Це значення повинно бути менше.\",\n  lte:      \"Це значення повинно бути менше або дорівнює.\",\n  notequalto: \"Це значення повинно відрізнятися.\"\n});\n"
  },
  {
    "path": "dist/i18n/ua.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('ua', {\n  defaultMessage: \"Некоректне значення.\",\n  type: {\n    email:        \"Введіть адресу електронної пошти.\",\n    url:          \"Введіть URL адресу.\",\n    number:       \"Введіть число.\",\n    integer:      \"Введіть ціле число.\",\n    digits:       \"Введіть тільки цифри.\",\n    alphanum:     \"Введіть буквено-цифрове значення.\"\n  },\n  notblank:       \"Це поле має бути заповненим.\",\n  required:       \"Обов'язкове поле.\",\n  pattern:        \"Це значення некоректне.\",\n  min:            \"Це значення повинно бути не менше ніж %s.\",\n  max:            \"Це значення повинно бути не більше ніж %s.\",\n  range:          \"Це значення повинно бути від %s до %s.\",\n  minlength:      \"Це значення повинно містити не менше %s символів.\",\n  maxlength:      \"Це значення повинно містити не більше %s символів.\",\n  length:         \"Це значення повинно містити від %s до %s символів.\",\n  mincheck:       \"Виберіть не менше %s значень.\",\n  maxcheck:       \"Виберіть не більше %s значень.\",\n  check:          \"Виберіть від %s до %s значень.\",\n  equalto:        \"Це значення повинно співпадати.\"\n});\n\nParsley.setLocale('ua');\n"
  },
  {
    "path": "dist/i18n/uk.extra.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('uk', {\n  dateiso:  \"Це значення має бути коректною датою (РРРР-ММ-ДД).\",\n  minwords: \"Це значення повинно містити не менше %s слів.\",\n  maxwords: \"Це значення повинно містити не більше %s слів.\",\n  words:    \"Це значення повинно містити від %s до %s слів.\"\n});\n"
  },
  {
    "path": "dist/i18n/uk.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('uk', {\n  defaultMessage: \"Некоректне значення.\",\n  type: {\n    email:        \"Введіть адресу електронної пошти.\",\n    url:          \"Введіть URL-адресу.\",\n    number:       \"Введіть число.\",\n    integer:      \"Введіть ціле число.\",\n    digits:       \"Введіть тільки цифри.\",\n    alphanum:     \"Введіть буквено-цифрове значення.\"\n  },\n  notblank:       \"Це поле повинно бути заповнено.\",\n  required:       \"Обов'язкове поле\",\n  pattern:        \"Це значення некоректно.\",\n  min:            \"Це значення повинно бути не менше ніж %s.\",\n  max:            \"Це значення повинно бути не більше ніж %s.\",\n  range:          \"Це значення повинно бути від %s до %s.\",\n  minlength:      \"Це значення повинно містити не менше ніж %s символів.\",\n  maxlength:      \"Це значення повинно містити не більше ніж %s символів.\",\n  length:         \"Це значення повинно містити від %s до %s символів.\",\n  mincheck:       \"Виберіть не менше %s значень.\",\n  maxcheck:       \"Виберіть не більше %s значень.\",\n  check:          \"Виберіть від %s до %s значень.\",\n  equalto:        \"Це значення повинно збігатися.\"\n});\n\nParsley.setLocale('uk');\n"
  },
  {
    "path": "dist/i18n/ur.js",
    "content": "// This is included with the Parsley library itself,\n// thus there is no use in adding it to your project.\n\n\nParsley.addMessages('ur', {\n  defaultMessage: \"شائد یہ قیمت غلط ہے۔\",\n  type: {\n    email:        \"یہ قیمت ایک درست ای میل ہونی چاہیے۔\",\n    url:          \"یہ قیمت ایک درست یو آر ایل ہونا چاہیے۔ \",\n    number:       \"یہ قیمت ایک درست نمبر ہونا چاہیے۔\",\n    integer:      \"یہ قیمت ایک عدد صحیح ہونا چاہیے۔\",\n    digits:       \"یہ قیمت اعداد ہونے چاہیے۔\",\n    alphanum:     \"یہ قیمت حرفی ہندسی میں سے ہونا چاہیے۔\"\n  },\n  notblank:       \"یہ قیمت خالی نہیں ہونی چاہیے۔\",\n  required:       \"یہ قیمت ضروری ہے۔ \",\n  pattern:        \"شائد یہ قیمت غلط ہے۔\",\n  min:            \"یہ قیمت %s سے بڑی یا اسکے برابر ہونی چاہیے۔\",\n  max:            \"یہ قیمت %sسے چھوٹی یا اسکے برابر ہونی چاہیے۔\",\n  range:          \"یہ قیمت %sاور %s کے درمیان ہونی چاہیے۔\",\n  minlength:      \"یہ قیمت بہت کم احراف پر مشتمل ہے۔ یہ %sاحراف یا اس سے زیادہ ہونے چاہیے۔\",\n  maxlength:      \"یہ قیمت بہت زیادہ احراف پر مشتمل ہے۔ یہ %sاحراف یا اس سے کم ہونے چاہیے۔\",\n  length:         \"اس قیت کا طول غلط ہے۔ یہ %s اور %s احراف پر مشتمل ہونی چاہیے۔\",\n  mincheck:       \"آپکو کم سے کم %s قیمتوں کا انتخاب کرنا ہوگا۔\",\n  maxcheck:       \"آپکو %s یا اس سے کم قیمتوں کا انتخاب کرنا ہوگا۔\",\n  check:          \"آپکو %s اور %s کے درمیان کسی قیمت کا انتخاب کرنا ہوگا۔\",\n  equalto:        \"یہ قیت جیسی ہے ویسی ہی رہنی چاہیے۔ \"\n});\n\nParsley.setLocale('ur');\n"
  },
  {
    "path": "dist/i18n/vi.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('vi', {\n  defaultMessage: \"Trường này có vẻ không đúng.\",\n  type: {\n    email:        \"Trường này không phải là email.\",\n    url:          \"Trường này cần là một đường dẫn.\",\n    number:       \"Trường này cần là một số.\",\n    integer:      \"Trường này cần là số nguyên.\",\n    digits:       \"Trường này cần là ký tự số.\",\n    alphanum:     \"Trường này cần là chữ và số.\"\n  },\n  notblank:       \"Trường này không được để trống.\",\n  required:       \"Trường này là bắt buộc.\",\n  pattern:        \"Giá trị này có vẻ không đúng.\",\n  min:            \"Giá trị cần lớn hơn hoặc bằng %s.\",\n  max:            \"Giá trị cần bé hơn hoặc bằng %s.\",\n  range:          \"Giá trị cần nằm trong khoảng %s và %s.\",\n  minlength:      \"Giá trị quá ngắn. Cần là %s ký tự hoặc nhiều hơn.\",\n  maxlength:      \"Giá trị quá dài. Cần là %s ký tự hoặc ít hơn.\",\n  length:         \"Độ dài không đúng. Cần có độ dài ở giữa %s và %s ký tự.\",\n  mincheck:       \"Bạn cần chọn tối thiểu %s tùy chọn.\",\n  maxcheck:       \"Bạn cần chọn %s tùy chọn hoặc ít hơn.\",\n  check:          \"Bạn cần chọn giữa %s và %s tùy chọn.\",\n  equalto:        \"Giá trị này cần bằng.\",\n  euvatin:        \"Đây không phải là số VAT.\",\n});\n\nParsley.setLocale('vi');\n"
  },
  {
    "path": "dist/i18n/zh_cn.extra.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('zh-cn', {\n  dateiso: \"请输入正确格式的日期 (YYYY-MM-DD).\"\n});\n"
  },
  {
    "path": "dist/i18n/zh_cn.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('zh-cn', {\n  defaultMessage: \"不正确的值\",\n  type: {\n    email:        \"请输入一个有效的电子邮箱地址\",\n    url:          \"请输入一个有效的链接\",\n    number:       \"请输入正确的数字\",\n    integer:      \"请输入正确的整数\",\n    digits:       \"请输入正确的号码\",\n    alphanum:     \"请输入字母或数字\"\n  },\n  notblank:       \"请输入值\",\n  required:       \"必填项\",\n  pattern:        \"格式不正确\",\n  min:            \"输入值请大于或等于 %s\",\n  max:            \"输入值请小于或等于 %s\",\n  range:          \"输入值应该在 %s 到 %s 之间\",\n  minlength:      \"请输入至少 %s 个字符\",\n  maxlength:      \"请输入至多 %s 个字符\",\n  length:         \"字符长度应该在 %s 到 %s 之间\",\n  mincheck:       \"请至少选择 %s 个选项\",\n  maxcheck:       \"请选择不超过 %s 个选项\",\n  check:          \"请选择 %s 到 %s 个选项\",\n  equalto:        \"输入值不同\"\n});\n\nParsley.setLocale('zh-cn');\n"
  },
  {
    "path": "dist/i18n/zh_tw.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('zh-tw', {\n  defaultMessage: \"這個值似乎是無效的。\",\n  type: {\n    email:        \"請輸入一個正確的電子郵件地址。\",\n    url:          \"請輸入一個有效的網址。\",\n    number:       \"請輸入一個數字。\",\n    integer:      \"請輸入一個整數。\",\n    digits:       \"這個欄位只接受數字。\",\n    alphanum:     \"這個欄位只接受英文字母或是數字。\"\n  },\n  notblank:       \"這個欄位不能為空白。\",\n  required:       \"這個欄位必須填寫。\",\n  pattern:        \"這個值似乎是無效的。\",\n  min:            \"輸入的值應該大於或等於 %s\",\n  max:            \"輸入的值應該小於或等於 %s\",\n  range:          \"輸入的值應該在 %s 和 %s 之間。\",\n  minlength:      \"輸入的值至少要有 %s 個字元。\",\n  maxlength:      \"輸入的值最多可以有 %s 個字元。\",\n  length:         \"字元長度應該在 %s 和 %s 之間。\",\n  mincheck:       \"你至少要選擇 %s 個項目。\",\n  maxcheck:       \"你最多可選擇 %s 個項目。\",\n  check:          \"你必須選擇 %s 到 %s 個項目。\",\n  equalto:        \"輸入值不同。\"\n});\n\nParsley.setLocale('zh-tw');\n"
  },
  {
    "path": "dist/parsley.js",
    "content": "/*!\n* Parsley.js\n* Version 2.9.2 - built Tue, Dec 10th 2019, 6:18 pm\n* http://parsleyjs.org\n* Guillaume Potier - <guillaume@wisembly.com>\n* Marc-Andre Lafortune - <petroselinum@marc-andre.ca>\n* MIT Licensed\n*/\n\n// The source code below is generated by babel as\n// Parsley is written in ECMAScript 6\n//\n\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) :\n  typeof define === 'function' && define.amd ? define(['jquery'], factory) :\n  (global = global || self, global.parsley = factory(global.jQuery));\n}(this, (function ($) { 'use strict';\n\n  function _typeof(obj) {\n    if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n      _typeof = function (obj) {\n        return typeof obj;\n      };\n    } else {\n      _typeof = function (obj) {\n        return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n      };\n    }\n\n    return _typeof(obj);\n  }\n\n  function _extends() {\n    _extends = Object.assign || function (target) {\n      for (var i = 1; i < arguments.length; i++) {\n        var source = arguments[i];\n\n        for (var key in source) {\n          if (Object.prototype.hasOwnProperty.call(source, key)) {\n            target[key] = source[key];\n          }\n        }\n      }\n\n      return target;\n    };\n\n    return _extends.apply(this, arguments);\n  }\n\n  function _slicedToArray(arr, i) {\n    return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n  }\n\n  function _toConsumableArray(arr) {\n    return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();\n  }\n\n  function _arrayWithoutHoles(arr) {\n    if (Array.isArray(arr)) {\n      for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n      return arr2;\n    }\n  }\n\n  function _arrayWithHoles(arr) {\n    if (Array.isArray(arr)) return arr;\n  }\n\n  function _iterableToArray(iter) {\n    if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter);\n  }\n\n  function _iterableToArrayLimit(arr, i) {\n    if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === \"[object Arguments]\")) {\n      return;\n    }\n\n    var _arr = [];\n    var _n = true;\n    var _d = false;\n    var _e = undefined;\n\n    try {\n      for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n        _arr.push(_s.value);\n\n        if (i && _arr.length === i) break;\n      }\n    } catch (err) {\n      _d = true;\n      _e = err;\n    } finally {\n      try {\n        if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n      } finally {\n        if (_d) throw _e;\n      }\n    }\n\n    return _arr;\n  }\n\n  function _nonIterableSpread() {\n    throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n  }\n\n  function _nonIterableRest() {\n    throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n  }\n\n  var globalID = 1;\n  var pastWarnings = {};\n  var Utils = {\n    // Parsley DOM-API\n    // returns object from dom attributes and values\n    attr: function attr(element, namespace, obj) {\n      var i;\n      var attribute;\n      var attributes;\n      var regex = new RegExp('^' + namespace, 'i');\n      if ('undefined' === typeof obj) obj = {};else {\n        // Clear all own properties. This won't affect prototype's values\n        for (i in obj) {\n          if (obj.hasOwnProperty(i)) delete obj[i];\n        }\n      }\n      if (!element) return obj;\n      attributes = element.attributes;\n\n      for (i = attributes.length; i--;) {\n        attribute = attributes[i];\n\n        if (attribute && attribute.specified && regex.test(attribute.name)) {\n          obj[this.camelize(attribute.name.slice(namespace.length))] = this.deserializeValue(attribute.value);\n        }\n      }\n\n      return obj;\n    },\n    checkAttr: function checkAttr(element, namespace, _checkAttr) {\n      return element.hasAttribute(namespace + _checkAttr);\n    },\n    setAttr: function setAttr(element, namespace, attr, value) {\n      element.setAttribute(this.dasherize(namespace + attr), String(value));\n    },\n    getType: function getType(element) {\n      return element.getAttribute('type') || 'text';\n    },\n    generateID: function generateID() {\n      return '' + globalID++;\n    },\n\n    /** Third party functions **/\n    deserializeValue: function deserializeValue(value) {\n      var num;\n\n      try {\n        return value ? value == \"true\" || (value == \"false\" ? false : value == \"null\" ? null : !isNaN(num = Number(value)) ? num : /^[\\[\\{]/.test(value) ? JSON.parse(value) : value) : value;\n      } catch (e) {\n        return value;\n      }\n    },\n    // Zepto camelize function\n    camelize: function camelize(str) {\n      return str.replace(/-+(.)?/g, function (match, chr) {\n        return chr ? chr.toUpperCase() : '';\n      });\n    },\n    // Zepto dasherize function\n    dasherize: function dasherize(str) {\n      return str.replace(/::/g, '/').replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2').replace(/([a-z\\d])([A-Z])/g, '$1_$2').replace(/_/g, '-').toLowerCase();\n    },\n    warn: function warn() {\n      var _window$console;\n\n      if (window.console && 'function' === typeof window.console.warn) (_window$console = window.console).warn.apply(_window$console, arguments);\n    },\n    warnOnce: function warnOnce(msg) {\n      if (!pastWarnings[msg]) {\n        pastWarnings[msg] = true;\n        this.warn.apply(this, arguments);\n      }\n    },\n    _resetWarnings: function _resetWarnings() {\n      pastWarnings = {};\n    },\n    trimString: function trimString(string) {\n      return string.replace(/^\\s+|\\s+$/g, '');\n    },\n    parse: {\n      date: function date(string) {\n        var parsed = string.match(/^(\\d{4,})-(\\d\\d)-(\\d\\d)$/);\n        if (!parsed) return null;\n\n        var _parsed$map = parsed.map(function (x) {\n          return parseInt(x, 10);\n        }),\n            _parsed$map2 = _slicedToArray(_parsed$map, 4),\n            _ = _parsed$map2[0],\n            year = _parsed$map2[1],\n            month = _parsed$map2[2],\n            day = _parsed$map2[3];\n\n        var date = new Date(year, month - 1, day);\n        if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) return null;\n        return date;\n      },\n      string: function string(_string) {\n        return _string;\n      },\n      integer: function integer(string) {\n        if (isNaN(string)) return null;\n        return parseInt(string, 10);\n      },\n      number: function number(string) {\n        if (isNaN(string)) throw null;\n        return parseFloat(string);\n      },\n      'boolean': function _boolean(string) {\n        return !/^\\s*false\\s*$/i.test(string);\n      },\n      object: function object(string) {\n        return Utils.deserializeValue(string);\n      },\n      regexp: function regexp(_regexp) {\n        var flags = ''; // Test if RegExp is literal, if not, nothing to be done, otherwise, we need to isolate flags and pattern\n\n        if (/^\\/.*\\/(?:[gimy]*)$/.test(_regexp)) {\n          // Replace the regexp literal string with the first match group: ([gimy]*)\n          // If no flag is present, this will be a blank string\n          flags = _regexp.replace(/.*\\/([gimy]*)$/, '$1'); // Again, replace the regexp literal string with the first match group:\n          // everything excluding the opening and closing slashes and the flags\n\n          _regexp = _regexp.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1');\n        } else {\n          // Anchor regexp:\n          _regexp = '^' + _regexp + '$';\n        }\n\n        return new RegExp(_regexp, flags);\n      }\n    },\n    parseRequirement: function parseRequirement(requirementType, string) {\n      var converter = this.parse[requirementType || 'string'];\n      if (!converter) throw 'Unknown requirement specification: \"' + requirementType + '\"';\n      var converted = converter(string);\n      if (converted === null) throw \"Requirement is not a \".concat(requirementType, \": \\\"\").concat(string, \"\\\"\");\n      return converted;\n    },\n    namespaceEvents: function namespaceEvents(events, namespace) {\n      events = this.trimString(events || '').split(/\\s+/);\n      if (!events[0]) return '';\n      return $.map(events, function (evt) {\n        return \"\".concat(evt, \".\").concat(namespace);\n      }).join(' ');\n    },\n    difference: function difference(array, remove) {\n      // This is O(N^2), should be optimized\n      var result = [];\n      $.each(array, function (_, elem) {\n        if (remove.indexOf(elem) == -1) result.push(elem);\n      });\n      return result;\n    },\n    // Alter-ego to native Promise.all, but for jQuery\n    all: function all(promises) {\n      // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements\n      return $.when.apply($, _toConsumableArray(promises).concat([42, 42]));\n    },\n    // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n    objectCreate: Object.create || function () {\n      var Object = function Object() {};\n\n      return function (prototype) {\n        if (arguments.length > 1) {\n          throw Error('Second argument not supported');\n        }\n\n        if (_typeof(prototype) != 'object') {\n          throw TypeError('Argument must be an object');\n        }\n\n        Object.prototype = prototype;\n        var result = new Object();\n        Object.prototype = null;\n        return result;\n      };\n    }(),\n    _SubmitSelector: 'input[type=\"submit\"], button:submit'\n  };\n\n  // All these options could be overriden and specified directly in DOM using\n  // `data-parsley-` default DOM-API\n  // eg: `inputs` can be set in DOM using `data-parsley-inputs=\"input, textarea\"`\n  // eg: `data-parsley-stop-on-first-failing-constraint=\"false\"`\n  var Defaults = {\n    // ### General\n    // Default data-namespace for DOM API\n    namespace: 'data-parsley-',\n    // Supported inputs by default\n    inputs: 'input, textarea, select',\n    // Excluded inputs by default\n    excluded: 'input[type=button], input[type=submit], input[type=reset], input[type=hidden]',\n    // Stop validating field on highest priority failing constraint\n    priorityEnabled: true,\n    // ### Field only\n    // identifier used to group together inputs (e.g. radio buttons...)\n    multiple: null,\n    // identifier (or array of identifiers) used to validate only a select group of inputs\n    group: null,\n    // ### UI\n    // Enable\\Disable error messages\n    uiEnabled: true,\n    // Key events threshold before validation\n    validationThreshold: 3,\n    // Focused field on form validation error. 'first'|'last'|'none'\n    focus: 'first',\n    // event(s) that will trigger validation before first failure. eg: `input`...\n    trigger: false,\n    // event(s) that will trigger validation after first failure.\n    triggerAfterFailure: 'input',\n    // Class that would be added on every failing validation Parsley field\n    errorClass: 'parsley-error',\n    // Same for success validation\n    successClass: 'parsley-success',\n    // Return the `$element` that will receive these above success or error classes\n    // Could also be (and given directly from DOM) a valid selector like `'#div'`\n    classHandler: function classHandler(Field) {},\n    // Return the `$element` where errors will be appended\n    // Could also be (and given directly from DOM) a valid selector like `'#div'`\n    errorsContainer: function errorsContainer(Field) {},\n    // ul elem that would receive errors' list\n    errorsWrapper: '<ul class=\"parsley-errors-list\"></ul>',\n    // li elem that would receive error message\n    errorTemplate: '<li></li>'\n  };\n\n  var Base = function Base() {\n    this.__id__ = Utils.generateID();\n  };\n\n  Base.prototype = {\n    asyncSupport: true,\n    // Deprecated\n    _pipeAccordingToValidationResult: function _pipeAccordingToValidationResult() {\n      var _this = this;\n\n      var pipe = function pipe() {\n        var r = $.Deferred();\n        if (true !== _this.validationResult) r.reject();\n        return r.resolve().promise();\n      };\n\n      return [pipe, pipe];\n    },\n    actualizeOptions: function actualizeOptions() {\n      Utils.attr(this.element, this.options.namespace, this.domOptions);\n      if (this.parent && this.parent.actualizeOptions) this.parent.actualizeOptions();\n      return this;\n    },\n    _resetOptions: function _resetOptions(initOptions) {\n      this.domOptions = Utils.objectCreate(this.parent.options);\n      this.options = Utils.objectCreate(this.domOptions); // Shallow copy of ownProperties of initOptions:\n\n      for (var i in initOptions) {\n        if (initOptions.hasOwnProperty(i)) this.options[i] = initOptions[i];\n      }\n\n      this.actualizeOptions();\n    },\n    _listeners: null,\n    // Register a callback for the given event name\n    // Callback is called with context as the first argument and the `this`\n    // The context is the current parsley instance, or window.Parsley if global\n    // A return value of `false` will interrupt the calls\n    on: function on(name, fn) {\n      this._listeners = this._listeners || {};\n      var queue = this._listeners[name] = this._listeners[name] || [];\n      queue.push(fn);\n      return this;\n    },\n    // Deprecated. Use `on` instead\n    subscribe: function subscribe(name, fn) {\n      $.listenTo(this, name.toLowerCase(), fn);\n    },\n    // Unregister a callback (or all if none is given) for the given event name\n    off: function off(name, fn) {\n      var queue = this._listeners && this._listeners[name];\n\n      if (queue) {\n        if (!fn) {\n          delete this._listeners[name];\n        } else {\n          for (var i = queue.length; i--;) {\n            if (queue[i] === fn) queue.splice(i, 1);\n          }\n        }\n      }\n\n      return this;\n    },\n    // Deprecated. Use `off`\n    unsubscribe: function unsubscribe(name, fn) {\n      $.unsubscribeTo(this, name.toLowerCase());\n    },\n    // Trigger an event of the given name\n    // A return value of `false` interrupts the callback chain\n    // Returns false if execution was interrupted\n    trigger: function trigger(name, target, extraArg) {\n      target = target || this;\n      var queue = this._listeners && this._listeners[name];\n      var result;\n\n      if (queue) {\n        for (var i = queue.length; i--;) {\n          result = queue[i].call(target, target, extraArg);\n          if (result === false) return result;\n        }\n      }\n\n      if (this.parent) {\n        return this.parent.trigger(name, target, extraArg);\n      }\n\n      return true;\n    },\n    asyncIsValid: function asyncIsValid(group, force) {\n      Utils.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n      return this.whenValid({\n        group: group,\n        force: force\n      });\n    },\n    _findRelated: function _findRelated() {\n      return this.options.multiple ? $(this.parent.element.querySelectorAll(\"[\".concat(this.options.namespace, \"multiple=\\\"\").concat(this.options.multiple, \"\\\"]\"))) : this.$element;\n    }\n  };\n\n  var convertArrayRequirement = function convertArrayRequirement(string, length) {\n    var m = string.match(/^\\s*\\[(.*)\\]\\s*$/);\n    if (!m) throw 'Requirement is not an array: \"' + string + '\"';\n    var values = m[1].split(',').map(Utils.trimString);\n    if (values.length !== length) throw 'Requirement has ' + values.length + ' values when ' + length + ' are needed';\n    return values;\n  };\n\n  var convertExtraOptionRequirement = function convertExtraOptionRequirement(requirementSpec, string, extraOptionReader) {\n    var main = null;\n    var extra = {};\n\n    for (var key in requirementSpec) {\n      if (key) {\n        var value = extraOptionReader(key);\n        if ('string' === typeof value) value = Utils.parseRequirement(requirementSpec[key], value);\n        extra[key] = value;\n      } else {\n        main = Utils.parseRequirement(requirementSpec[key], string);\n      }\n    }\n\n    return [main, extra];\n  }; // A Validator needs to implement the methods `validate` and `parseRequirements`\n\n\n  var Validator = function Validator(spec) {\n    $.extend(true, this, spec);\n  };\n\n  Validator.prototype = {\n    // Returns `true` iff the given `value` is valid according the given requirements.\n    validate: function validate(value, requirementFirstArg) {\n      if (this.fn) {\n        // Legacy style validator\n        if (arguments.length > 3) // If more args then value, requirement, instance...\n          requirementFirstArg = [].slice.call(arguments, 1, -1); // Skip first arg (value) and last (instance), combining the rest\n\n        return this.fn(value, requirementFirstArg);\n      }\n\n      if (Array.isArray(value)) {\n        if (!this.validateMultiple) throw 'Validator `' + this.name + '` does not handle multiple values';\n        return this.validateMultiple.apply(this, arguments);\n      } else {\n        var instance = arguments[arguments.length - 1];\n\n        if (this.validateDate && instance._isDateInput()) {\n          arguments[0] = Utils.parse.date(arguments[0]);\n          if (arguments[0] === null) return false;\n          return this.validateDate.apply(this, arguments);\n        }\n\n        if (this.validateNumber) {\n          if (!value) // Builtin validators all accept empty strings, except `required` of course\n            return true;\n          if (isNaN(value)) return false;\n          arguments[0] = parseFloat(arguments[0]);\n          return this.validateNumber.apply(this, arguments);\n        }\n\n        if (this.validateString) {\n          return this.validateString.apply(this, arguments);\n        }\n\n        throw 'Validator `' + this.name + '` only handles multiple values';\n      }\n    },\n    // Parses `requirements` into an array of arguments,\n    // according to `this.requirementType`\n    parseRequirements: function parseRequirements(requirements, extraOptionReader) {\n      if ('string' !== typeof requirements) {\n        // Assume requirement already parsed\n        // but make sure we return an array\n        return Array.isArray(requirements) ? requirements : [requirements];\n      }\n\n      var type = this.requirementType;\n\n      if (Array.isArray(type)) {\n        var values = convertArrayRequirement(requirements, type.length);\n\n        for (var i = 0; i < values.length; i++) {\n          values[i] = Utils.parseRequirement(type[i], values[i]);\n        }\n\n        return values;\n      } else if ($.isPlainObject(type)) {\n        return convertExtraOptionRequirement(type, requirements, extraOptionReader);\n      } else {\n        return [Utils.parseRequirement(type, requirements)];\n      }\n    },\n    // Defaults:\n    requirementType: 'string',\n    priority: 2\n  };\n\n  var ValidatorRegistry = function ValidatorRegistry(validators, catalog) {\n    this.__class__ = 'ValidatorRegistry'; // Default Parsley locale is en\n\n    this.locale = 'en';\n    this.init(validators || {}, catalog || {});\n  };\n\n  var typeTesters = {\n    email: /^((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-zA-Z]|\\d|-|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-zA-Z]|\\d|-|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))$/,\n    // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n    number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n    integer: /^-?\\d+$/,\n    digits: /^\\d+$/,\n    alphanum: /^\\w+$/i,\n    date: {\n      test: function test(value) {\n        return Utils.parse.date(value) !== null;\n      }\n    },\n    url: new RegExp(\"^\" + // protocol identifier\n    \"(?:(?:https?|ftp)://)?\" + // ** mod: make scheme optional\n    // user:pass authentication\n    \"(?:\\\\S+(?::\\\\S*)?@)?\" + \"(?:\" + // IP address exclusion\n    // private & local networks\n    // \"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" +   // ** mod: allow local networks\n    // \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" +  // ** mod: allow local networks\n    // \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\" +  // ** mod: allow local networks\n    // IP address dotted notation octets\n    // excludes loopback network 0.0.0.0\n    // excludes reserved space >= 224.0.0.0\n    // excludes network & broacast addresses\n    // (first & last IP address of each class)\n    \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" + \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" + \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" + \"|\" + // host name\n    \"(?:(?:[a-zA-Z\\\\u00a1-\\\\uffff0-9]-*)*[a-zA-Z\\\\u00a1-\\\\uffff0-9]+)\" + // domain name\n    \"(?:\\\\.(?:[a-zA-Z\\\\u00a1-\\\\uffff0-9]-*)*[a-zA-Z\\\\u00a1-\\\\uffff0-9]+)*\" + // TLD identifier\n    \"(?:\\\\.(?:[a-zA-Z\\\\u00a1-\\\\uffff]{2,}))\" + \")\" + // port number\n    \"(?::\\\\d{2,5})?\" + // resource path\n    \"(?:/\\\\S*)?\" + \"$\")\n  };\n  typeTesters.range = typeTesters.number; // See http://stackoverflow.com/a/10454560/8279\n\n  var decimalPlaces = function decimalPlaces(num) {\n    var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n\n    if (!match) {\n      return 0;\n    }\n\n    return Math.max(0, // Number of digits right of decimal point.\n    (match[1] ? match[1].length : 0) - ( // Adjust for scientific notation.\n    match[2] ? +match[2] : 0));\n  }; // parseArguments('number', ['1', '2']) => [1, 2]\n\n\n  var parseArguments = function parseArguments(type, args) {\n    return args.map(Utils.parse[type]);\n  }; // operatorToValidator returns a validating function for an operator function, applied to the given type\n\n\n  var operatorToValidator = function operatorToValidator(type, operator) {\n    return function (value) {\n      for (var _len = arguments.length, requirementsAndInput = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        requirementsAndInput[_key - 1] = arguments[_key];\n      }\n\n      requirementsAndInput.pop(); // Get rid of `input` argument\n\n      return operator.apply(void 0, [value].concat(_toConsumableArray(parseArguments(type, requirementsAndInput))));\n    };\n  };\n\n  var comparisonOperator = function comparisonOperator(operator) {\n    return {\n      validateDate: operatorToValidator('date', operator),\n      validateNumber: operatorToValidator('number', operator),\n      requirementType: operator.length <= 2 ? 'string' : ['string', 'string'],\n      // Support operators with a 1 or 2 requirement(s)\n      priority: 30\n    };\n  };\n\n  ValidatorRegistry.prototype = {\n    init: function init(validators, catalog) {\n      this.catalog = catalog; // Copy prototype's validators:\n\n      this.validators = _extends({}, this.validators);\n\n      for (var name in validators) {\n        this.addValidator(name, validators[name].fn, validators[name].priority);\n      }\n\n      window.Parsley.trigger('parsley:validator:init');\n    },\n    // Set new messages locale if we have dictionary loaded in ParsleyConfig.i18n\n    setLocale: function setLocale(locale) {\n      if ('undefined' === typeof this.catalog[locale]) throw new Error(locale + ' is not available in the catalog');\n      this.locale = locale;\n      return this;\n    },\n    // Add a new messages catalog for a given locale. Set locale for this catalog if set === `true`\n    addCatalog: function addCatalog(locale, messages, set) {\n      if ('object' === _typeof(messages)) this.catalog[locale] = messages;\n      if (true === set) return this.setLocale(locale);\n      return this;\n    },\n    // Add a specific message for a given constraint in a given locale\n    addMessage: function addMessage(locale, name, message) {\n      if ('undefined' === typeof this.catalog[locale]) this.catalog[locale] = {};\n      this.catalog[locale][name] = message;\n      return this;\n    },\n    // Add messages for a given locale\n    addMessages: function addMessages(locale, nameMessageObject) {\n      for (var name in nameMessageObject) {\n        this.addMessage(locale, name, nameMessageObject[name]);\n      }\n\n      return this;\n    },\n    // Add a new validator\n    //\n    //    addValidator('custom', {\n    //        requirementType: ['integer', 'integer'],\n    //        validateString: function(value, from, to) {},\n    //        priority: 22,\n    //        messages: {\n    //          en: \"Hey, that's no good\",\n    //          fr: \"Aye aye, pas bon du tout\",\n    //        }\n    //    })\n    //\n    // Old API was addValidator(name, function, priority)\n    //\n    addValidator: function addValidator(name, arg1, arg2) {\n      if (this.validators[name]) Utils.warn('Validator \"' + name + '\" is already defined.');else if (Defaults.hasOwnProperty(name)) {\n        Utils.warn('\"' + name + '\" is a restricted keyword and is not a valid validator name.');\n        return;\n      }\n      return this._setValidator.apply(this, arguments);\n    },\n    hasValidator: function hasValidator(name) {\n      return !!this.validators[name];\n    },\n    updateValidator: function updateValidator(name, arg1, arg2) {\n      if (!this.validators[name]) {\n        Utils.warn('Validator \"' + name + '\" is not already defined.');\n        return this.addValidator.apply(this, arguments);\n      }\n\n      return this._setValidator.apply(this, arguments);\n    },\n    removeValidator: function removeValidator(name) {\n      if (!this.validators[name]) Utils.warn('Validator \"' + name + '\" is not defined.');\n      delete this.validators[name];\n      return this;\n    },\n    _setValidator: function _setValidator(name, validator, priority) {\n      if ('object' !== _typeof(validator)) {\n        // Old style validator, with `fn` and `priority`\n        validator = {\n          fn: validator,\n          priority: priority\n        };\n      }\n\n      if (!validator.validate) {\n        validator = new Validator(validator);\n      }\n\n      this.validators[name] = validator;\n\n      for (var locale in validator.messages || {}) {\n        this.addMessage(locale, name, validator.messages[locale]);\n      }\n\n      return this;\n    },\n    getErrorMessage: function getErrorMessage(constraint) {\n      var message; // Type constraints are a bit different, we have to match their requirements too to find right error message\n\n      if ('type' === constraint.name) {\n        var typeMessages = this.catalog[this.locale][constraint.name] || {};\n        message = typeMessages[constraint.requirements];\n      } else message = this.formatMessage(this.catalog[this.locale][constraint.name], constraint.requirements);\n\n      return message || this.catalog[this.locale].defaultMessage || this.catalog.en.defaultMessage;\n    },\n    // Kind of light `sprintf()` implementation\n    formatMessage: function formatMessage(string, parameters) {\n      if ('object' === _typeof(parameters)) {\n        for (var i in parameters) {\n          string = this.formatMessage(string, parameters[i]);\n        }\n\n        return string;\n      }\n\n      return 'string' === typeof string ? string.replace(/%s/i, parameters) : '';\n    },\n    // Here is the Parsley default validators list.\n    // A validator is an object with the following key values:\n    //  - priority: an integer\n    //  - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n    //  - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n    // Alternatively, a validator can be a function that returns such an object\n    //\n    validators: {\n      notblank: {\n        validateString: function validateString(value) {\n          return /\\S/.test(value);\n        },\n        priority: 2\n      },\n      required: {\n        validateMultiple: function validateMultiple(values) {\n          return values.length > 0;\n        },\n        validateString: function validateString(value) {\n          return /\\S/.test(value);\n        },\n        priority: 512\n      },\n      type: {\n        validateString: function validateString(value, type) {\n          var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n              _ref$step = _ref.step,\n              step = _ref$step === void 0 ? 'any' : _ref$step,\n              _ref$base = _ref.base,\n              base = _ref$base === void 0 ? 0 : _ref$base;\n\n          var tester = typeTesters[type];\n\n          if (!tester) {\n            throw new Error('validator type `' + type + '` is not supported');\n          }\n\n          if (!value) return true; // Builtin validators all accept empty strings, except `required` of course\n\n          if (!tester.test(value)) return false;\n\n          if ('number' === type) {\n            if (!/^any$/i.test(step || '')) {\n              var nb = Number(value);\n              var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n              if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n                return false; // Be careful of rounding errors by using integers.\n\n              var toInt = function toInt(f) {\n                return Math.round(f * Math.pow(10, decimals));\n              };\n\n              if ((toInt(nb) - toInt(base)) % toInt(step) != 0) return false;\n            }\n          }\n\n          return true;\n        },\n        requirementType: {\n          '': 'string',\n          step: 'string',\n          base: 'number'\n        },\n        priority: 256\n      },\n      pattern: {\n        validateString: function validateString(value, regexp) {\n          if (!value) return true; // Builtin validators all accept empty strings, except `required` of course\n\n          return regexp.test(value);\n        },\n        requirementType: 'regexp',\n        priority: 64\n      },\n      minlength: {\n        validateString: function validateString(value, requirement) {\n          if (!value) return true; // Builtin validators all accept empty strings, except `required` of course\n\n          return value.length >= requirement;\n        },\n        requirementType: 'integer',\n        priority: 30\n      },\n      maxlength: {\n        validateString: function validateString(value, requirement) {\n          return value.length <= requirement;\n        },\n        requirementType: 'integer',\n        priority: 30\n      },\n      length: {\n        validateString: function validateString(value, min, max) {\n          if (!value) return true; // Builtin validators all accept empty strings, except `required` of course\n\n          return value.length >= min && value.length <= max;\n        },\n        requirementType: ['integer', 'integer'],\n        priority: 30\n      },\n      mincheck: {\n        validateMultiple: function validateMultiple(values, requirement) {\n          return values.length >= requirement;\n        },\n        requirementType: 'integer',\n        priority: 30\n      },\n      maxcheck: {\n        validateMultiple: function validateMultiple(values, requirement) {\n          return values.length <= requirement;\n        },\n        requirementType: 'integer',\n        priority: 30\n      },\n      check: {\n        validateMultiple: function validateMultiple(values, min, max) {\n          return values.length >= min && values.length <= max;\n        },\n        requirementType: ['integer', 'integer'],\n        priority: 30\n      },\n      min: comparisonOperator(function (value, requirement) {\n        return value >= requirement;\n      }),\n      max: comparisonOperator(function (value, requirement) {\n        return value <= requirement;\n      }),\n      range: comparisonOperator(function (value, min, max) {\n        return value >= min && value <= max;\n      }),\n      equalto: {\n        validateString: function validateString(value, refOrValue) {\n          if (!value) return true; // Builtin validators all accept empty strings, except `required` of course\n\n          var $reference = $(refOrValue);\n          if ($reference.length) return value === $reference.val();else return value === refOrValue;\n        },\n        priority: 256\n      },\n      euvatin: {\n        validateString: function validateString(value, refOrValue) {\n          if (!value) {\n            return true; // Builtin validators all accept empty strings, except `required` of course\n          }\n\n          var re = /^[A-Z][A-Z][A-Za-z0-9 -]{2,}$/;\n          return re.test(value);\n        },\n        priority: 30\n      }\n    }\n  };\n\n  var UI = {};\n\n  var diffResults = function diffResults(newResult, oldResult, deep) {\n    var added = [];\n    var kept = [];\n\n    for (var i = 0; i < newResult.length; i++) {\n      var found = false;\n\n      for (var j = 0; j < oldResult.length; j++) {\n        if (newResult[i].assert.name === oldResult[j].assert.name) {\n          found = true;\n          break;\n        }\n      }\n\n      if (found) kept.push(newResult[i]);else added.push(newResult[i]);\n    }\n\n    return {\n      kept: kept,\n      added: added,\n      removed: !deep ? diffResults(oldResult, newResult, true).added : []\n    };\n  };\n\n  UI.Form = {\n    _actualizeTriggers: function _actualizeTriggers() {\n      var _this = this;\n\n      this.$element.on('submit.Parsley', function (evt) {\n        _this.onSubmitValidate(evt);\n      });\n      this.$element.on('click.Parsley', Utils._SubmitSelector, function (evt) {\n        _this.onSubmitButton(evt);\n      }); // UI could be disabled\n\n      if (false === this.options.uiEnabled) return;\n      this.element.setAttribute('novalidate', '');\n    },\n    focus: function focus() {\n      this._focusedField = null;\n      if (true === this.validationResult || 'none' === this.options.focus) return null;\n\n      for (var i = 0; i < this.fields.length; i++) {\n        var field = this.fields[i];\n\n        if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n          this._focusedField = field.$element;\n          if ('first' === this.options.focus) break;\n        }\n      }\n\n      if (null === this._focusedField) return null;\n      return this._focusedField.focus();\n    },\n    _destroyUI: function _destroyUI() {\n      // Reset all event listeners\n      this.$element.off('.Parsley');\n    }\n  };\n  UI.Field = {\n    _reflowUI: function _reflowUI() {\n      this._buildUI(); // If this field doesn't have an active UI don't bother doing something\n\n\n      if (!this._ui) return; // Diff between two validation results\n\n      var diff = diffResults(this.validationResult, this._ui.lastValidationResult); // Then store current validation result for next reflow\n\n      this._ui.lastValidationResult = this.validationResult; // Handle valid / invalid / none field class\n\n      this._manageStatusClass(); // Add, remove, updated errors messages\n\n\n      this._manageErrorsMessages(diff); // Triggers impl\n\n\n      this._actualizeTriggers(); // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n\n\n      if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n        this._failedOnce = true;\n\n        this._actualizeTriggers();\n      }\n    },\n    // Returns an array of field's error message(s)\n    getErrorsMessages: function getErrorsMessages() {\n      // No error message, field is valid\n      if (true === this.validationResult) return [];\n      var messages = [];\n\n      for (var i = 0; i < this.validationResult.length; i++) {\n        messages.push(this.validationResult[i].errorMessage || this._getErrorMessage(this.validationResult[i].assert));\n      }\n\n      return messages;\n    },\n    // It's a goal of Parsley that this method is no longer required [#1073]\n    addError: function addError(name) {\n      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          message = _ref.message,\n          assert = _ref.assert,\n          _ref$updateClass = _ref.updateClass,\n          updateClass = _ref$updateClass === void 0 ? true : _ref$updateClass;\n\n      this._buildUI();\n\n      this._addError(name, {\n        message: message,\n        assert: assert\n      });\n\n      if (updateClass) this._errorClass();\n    },\n    // It's a goal of Parsley that this method is no longer required [#1073]\n    updateError: function updateError(name) {\n      var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          message = _ref2.message,\n          assert = _ref2.assert,\n          _ref2$updateClass = _ref2.updateClass,\n          updateClass = _ref2$updateClass === void 0 ? true : _ref2$updateClass;\n\n      this._buildUI();\n\n      this._updateError(name, {\n        message: message,\n        assert: assert\n      });\n\n      if (updateClass) this._errorClass();\n    },\n    // It's a goal of Parsley that this method is no longer required [#1073]\n    removeError: function removeError(name) {\n      var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          _ref3$updateClass = _ref3.updateClass,\n          updateClass = _ref3$updateClass === void 0 ? true : _ref3$updateClass;\n\n      this._buildUI();\n\n      this._removeError(name); // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n      // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n\n\n      if (updateClass) this._manageStatusClass();\n    },\n    _manageStatusClass: function _manageStatusClass() {\n      if (this.hasConstraints() && this.needsValidation() && true === this.validationResult) this._successClass();else if (this.validationResult.length > 0) this._errorClass();else this._resetClass();\n    },\n    _manageErrorsMessages: function _manageErrorsMessages(diff) {\n      if ('undefined' !== typeof this.options.errorsMessagesDisabled) return; // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n\n      if ('undefined' !== typeof this.options.errorMessage) {\n        if (diff.added.length || diff.kept.length) {\n          this._insertErrorWrapper();\n\n          if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length) this._ui.$errorsWrapper.append($(this.options.errorTemplate).addClass('parsley-custom-error-message'));\n\n          this._ui.$errorClassHandler.attr('aria-describedby', this._ui.errorsWrapperId);\n\n          return this._ui.$errorsWrapper.addClass('filled').attr('aria-hidden', 'false').find('.parsley-custom-error-message').html(this.options.errorMessage);\n        }\n\n        this._ui.$errorClassHandler.removeAttr('aria-describedby');\n\n        return this._ui.$errorsWrapper.removeClass('filled').attr('aria-hidden', 'true').find('.parsley-custom-error-message').remove();\n      } // Show, hide, update failing constraints messages\n\n\n      for (var i = 0; i < diff.removed.length; i++) {\n        this._removeError(diff.removed[i].assert.name);\n      }\n\n      for (i = 0; i < diff.added.length; i++) {\n        this._addError(diff.added[i].assert.name, {\n          message: diff.added[i].errorMessage,\n          assert: diff.added[i].assert\n        });\n      }\n\n      for (i = 0; i < diff.kept.length; i++) {\n        this._updateError(diff.kept[i].assert.name, {\n          message: diff.kept[i].errorMessage,\n          assert: diff.kept[i].assert\n        });\n      }\n    },\n    _addError: function _addError(name, _ref4) {\n      var message = _ref4.message,\n          assert = _ref4.assert;\n\n      this._insertErrorWrapper();\n\n      this._ui.$errorClassHandler.attr('aria-describedby', this._ui.errorsWrapperId);\n\n      this._ui.$errorsWrapper.addClass('filled').attr('aria-hidden', 'false').append($(this.options.errorTemplate).addClass('parsley-' + name).html(message || this._getErrorMessage(assert)));\n    },\n    _updateError: function _updateError(name, _ref5) {\n      var message = _ref5.message,\n          assert = _ref5.assert;\n\n      this._ui.$errorsWrapper.addClass('filled').find('.parsley-' + name).html(message || this._getErrorMessage(assert));\n    },\n    _removeError: function _removeError(name) {\n      this._ui.$errorClassHandler.removeAttr('aria-describedby');\n\n      this._ui.$errorsWrapper.removeClass('filled').attr('aria-hidden', 'true').find('.parsley-' + name).remove();\n    },\n    _getErrorMessage: function _getErrorMessage(constraint) {\n      var customConstraintErrorMessage = constraint.name + 'Message';\n      if ('undefined' !== typeof this.options[customConstraintErrorMessage]) return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n      return window.Parsley.getErrorMessage(constraint);\n    },\n    _buildUI: function _buildUI() {\n      // UI could be already built or disabled\n      if (this._ui || false === this.options.uiEnabled) return;\n      var _ui = {}; // Give field its Parsley id in DOM\n\n      this.element.setAttribute(this.options.namespace + 'id', this.__id__);\n      /** Generate important UI elements and store them in this **/\n      // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n\n      _ui.$errorClassHandler = this._manageClassHandler(); // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n\n      _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n      _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId); // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n\n      _ui.lastValidationResult = [];\n      _ui.validationInformationVisible = false; // Store it in this for later\n\n      this._ui = _ui;\n    },\n    // Determine which element will have `parsley-error` and `parsley-success` classes\n    _manageClassHandler: function _manageClassHandler() {\n      // Class handled could also be determined by function given in Parsley options\n      if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length) return $(this.options.classHandler); // Class handled could also be determined by function given in Parsley options\n\n      var $handlerFunction = this.options.classHandler; // It might also be the function name of a global function\n\n      if ('string' === typeof this.options.classHandler && 'function' === typeof window[this.options.classHandler]) $handlerFunction = window[this.options.classHandler];\n\n      if ('function' === typeof $handlerFunction) {\n        var $handler = $handlerFunction.call(this, this); // If this function returned a valid existing DOM element, go for it\n\n        if ('undefined' !== typeof $handler && $handler.length) return $handler;\n      } else if ('object' === _typeof($handlerFunction) && $handlerFunction instanceof jQuery && $handlerFunction.length) {\n        return $handlerFunction;\n      } else if ($handlerFunction) {\n        Utils.warn('The class handler `' + $handlerFunction + '` does not exist in DOM nor as a global JS function');\n      }\n\n      return this._inputHolder();\n    },\n    _inputHolder: function _inputHolder() {\n      // if simple element (input, texatrea, select...) it will perfectly host the classes and precede the error container\n      if (!this.options.multiple || this.element.nodeName === 'SELECT') return this.$element; // But if multiple element (radio, checkbox), that would be their parent\n\n      return this.$element.parent();\n    },\n    _insertErrorWrapper: function _insertErrorWrapper() {\n      var $errorsContainer = this.options.errorsContainer; // Nothing to do if already inserted\n\n      if (0 !== this._ui.$errorsWrapper.parent().length) return this._ui.$errorsWrapper.parent();\n\n      if ('string' === typeof $errorsContainer) {\n        if ($($errorsContainer).length) return $($errorsContainer).append(this._ui.$errorsWrapper);else if ('function' === typeof window[$errorsContainer]) $errorsContainer = window[$errorsContainer];else Utils.warn('The errors container `' + $errorsContainer + '` does not exist in DOM nor as a global JS function');\n      }\n\n      if ('function' === typeof $errorsContainer) $errorsContainer = $errorsContainer.call(this, this);\n      if ('object' === _typeof($errorsContainer) && $errorsContainer.length) return $errorsContainer.append(this._ui.$errorsWrapper);\n      return this._inputHolder().after(this._ui.$errorsWrapper);\n    },\n    _actualizeTriggers: function _actualizeTriggers() {\n      var _this2 = this;\n\n      var $toBind = this._findRelated();\n\n      var trigger; // Remove Parsley events already bound on this field\n\n      $toBind.off('.Parsley');\n      if (this._failedOnce) $toBind.on(Utils.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), function () {\n        _this2._validateIfNeeded();\n      });else if (trigger = Utils.namespaceEvents(this.options.trigger, 'Parsley')) {\n        $toBind.on(trigger, function (event) {\n          _this2._validateIfNeeded(event);\n        });\n      }\n    },\n    _validateIfNeeded: function _validateIfNeeded(event) {\n      var _this3 = this;\n\n      // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n      // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n      // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n      if (event && /key|input/.test(event.type)) if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold) return;\n\n      if (this.options.debounce) {\n        window.clearTimeout(this._debounced);\n        this._debounced = window.setTimeout(function () {\n          return _this3.validate();\n        }, this.options.debounce);\n      } else this.validate();\n    },\n    _resetUI: function _resetUI() {\n      // Reset all event listeners\n      this._failedOnce = false;\n\n      this._actualizeTriggers(); // Nothing to do if UI never initialized for this field\n\n\n      if ('undefined' === typeof this._ui) return; // Reset all errors' li\n\n      this._ui.$errorsWrapper.removeClass('filled').children().remove(); // Reset validation class\n\n\n      this._resetClass(); // Reset validation flags and last validation result\n\n\n      this._ui.lastValidationResult = [];\n      this._ui.validationInformationVisible = false;\n    },\n    _destroyUI: function _destroyUI() {\n      this._resetUI();\n\n      if ('undefined' !== typeof this._ui) this._ui.$errorsWrapper.remove();\n      delete this._ui;\n    },\n    _successClass: function _successClass() {\n      this._ui.validationInformationVisible = true;\n\n      this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n    },\n    _errorClass: function _errorClass() {\n      this._ui.validationInformationVisible = true;\n\n      this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n    },\n    _resetClass: function _resetClass() {\n      this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n    }\n  };\n\n  var Form = function Form(element, domOptions, options) {\n    this.__class__ = 'Form';\n    this.element = element;\n    this.$element = $(element);\n    this.domOptions = domOptions;\n    this.options = options;\n    this.parent = window.Parsley;\n    this.fields = [];\n    this.validationResult = null;\n  };\n\n  var statusMapping = {\n    pending: null,\n    resolved: true,\n    rejected: false\n  };\n  Form.prototype = {\n    onSubmitValidate: function onSubmitValidate(event) {\n      var _this = this;\n\n      // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n      if (true === event.parsley) return; // If we didn't come here through a submit button, use the first one in the form\n\n      var submitSource = this._submitSource || this.$element.find(Utils._SubmitSelector)[0];\n      this._submitSource = null;\n      this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true);\n      if (submitSource && null !== submitSource.getAttribute('formnovalidate')) return;\n      window.Parsley._remoteCache = {};\n      var promise = this.whenValidate({\n        event: event\n      });\n\n      if ('resolved' === promise.state() && false !== this._trigger('submit')) ; else {\n        // Rejected or pending: cancel this submit\n        event.stopImmediatePropagation();\n        event.preventDefault();\n        if ('pending' === promise.state()) promise.done(function () {\n          _this._submit(submitSource);\n        });\n      }\n    },\n    onSubmitButton: function onSubmitButton(event) {\n      this._submitSource = event.currentTarget;\n    },\n    // internal\n    // _submit submits the form, this time without going through the validations.\n    // Care must be taken to \"fake\" the actual submit button being clicked.\n    _submit: function _submit(submitSource) {\n      if (false === this._trigger('submit')) return; // Add submit button's data\n\n      if (submitSource) {\n        var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n        if (0 === $synthetic.length) $synthetic = $('<input class=\"parsley-synthetic-submit-button\" type=\"hidden\">').appendTo(this.$element);\n        $synthetic.attr({\n          name: submitSource.getAttribute('name'),\n          value: submitSource.getAttribute('value')\n        });\n      }\n\n      this.$element.trigger(_extends($.Event('submit'), {\n        parsley: true\n      }));\n    },\n    // Performs validation on fields while triggering events.\n    // @returns `true` if all validations succeeds, `false`\n    // if a failure is immediately detected, or `null`\n    // if dependant on a promise.\n    // Consider using `whenValidate` instead.\n    validate: function validate(options) {\n      if (arguments.length >= 1 && !$.isPlainObject(options)) {\n        Utils.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n\n        var _arguments = Array.prototype.slice.call(arguments),\n            group = _arguments[0],\n            force = _arguments[1],\n            event = _arguments[2];\n\n        options = {\n          group: group,\n          force: force,\n          event: event\n        };\n      }\n\n      return statusMapping[this.whenValidate(options).state()];\n    },\n    whenValidate: function whenValidate() {\n      var _this2 = this,\n          _Utils$all$done$fail$;\n\n      var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          group = _ref.group,\n          force = _ref.force,\n          event = _ref.event;\n\n      this.submitEvent = event;\n\n      if (event) {\n        this.submitEvent = _extends({}, event, {\n          preventDefault: function preventDefault() {\n            Utils.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n            _this2.validationResult = false;\n          }\n        });\n      }\n\n      this.validationResult = true; // fire validate event to eventually modify things before every validation\n\n      this._trigger('validate'); // Refresh form DOM options and form's fields that could have changed\n\n\n      this._refreshFields();\n\n      var promises = this._withoutReactualizingFormOptions(function () {\n        return $.map(_this2.fields, function (field) {\n          return field.whenValidate({\n            force: force,\n            group: group\n          });\n        });\n      });\n\n      return (_Utils$all$done$fail$ = Utils.all(promises).done(function () {\n        _this2._trigger('success');\n      }).fail(function () {\n        _this2.validationResult = false;\n\n        _this2.focus();\n\n        _this2._trigger('error');\n      }).always(function () {\n        _this2._trigger('validated');\n      })).pipe.apply(_Utils$all$done$fail$, _toConsumableArray(this._pipeAccordingToValidationResult()));\n    },\n    // Iterate over refreshed fields, and stop on first failure.\n    // Returns `true` if all fields are valid, `false` if a failure is detected\n    // or `null` if the result depends on an unresolved promise.\n    // Prefer using `whenValid` instead.\n    isValid: function isValid(options) {\n      if (arguments.length >= 1 && !$.isPlainObject(options)) {\n        Utils.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n\n        var _arguments2 = Array.prototype.slice.call(arguments),\n            group = _arguments2[0],\n            force = _arguments2[1];\n\n        options = {\n          group: group,\n          force: force\n        };\n      }\n\n      return statusMapping[this.whenValid(options).state()];\n    },\n    // Iterate over refreshed fields and validate them.\n    // Returns a promise.\n    // A validation that immediately fails will interrupt the validations.\n    whenValid: function whenValid() {\n      var _this3 = this;\n\n      var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          group = _ref2.group,\n          force = _ref2.force;\n\n      this._refreshFields();\n\n      var promises = this._withoutReactualizingFormOptions(function () {\n        return $.map(_this3.fields, function (field) {\n          return field.whenValid({\n            group: group,\n            force: force\n          });\n        });\n      });\n\n      return Utils.all(promises);\n    },\n    refresh: function refresh() {\n      this._refreshFields();\n\n      return this;\n    },\n    // Reset UI\n    reset: function reset() {\n      // Form case: emit a reset event for each field\n      for (var i = 0; i < this.fields.length; i++) {\n        this.fields[i].reset();\n      }\n\n      this._trigger('reset');\n    },\n    // Destroy Parsley instance (+ UI)\n    destroy: function destroy() {\n      // Field case: emit destroy event to clean UI and then destroy stored instance\n      this._destroyUI(); // Form case: destroy all its fields and then destroy stored instance\n\n\n      for (var i = 0; i < this.fields.length; i++) {\n        this.fields[i].destroy();\n      }\n\n      this.$element.removeData('Parsley');\n\n      this._trigger('destroy');\n    },\n    _refreshFields: function _refreshFields() {\n      return this.actualizeOptions()._bindFields();\n    },\n    _bindFields: function _bindFields() {\n      var _this4 = this;\n\n      var oldFields = this.fields;\n      this.fields = [];\n      this.fieldsMappedById = {};\n\n      this._withoutReactualizingFormOptions(function () {\n        _this4.$element.find(_this4.options.inputs).not(_this4.options.excluded).not(\"[\".concat(_this4.options.namespace, \"excluded=true]\")).each(function (_, element) {\n          var fieldInstance = new window.Parsley.Factory(element, {}, _this4); // Only add valid and not excluded `Field` and `FieldMultiple` children\n\n          if ('Field' === fieldInstance.__class__ || 'FieldMultiple' === fieldInstance.__class__) {\n            var uniqueId = fieldInstance.__class__ + '-' + fieldInstance.__id__;\n\n            if ('undefined' === typeof _this4.fieldsMappedById[uniqueId]) {\n              _this4.fieldsMappedById[uniqueId] = fieldInstance;\n\n              _this4.fields.push(fieldInstance);\n            }\n          }\n        });\n\n        $.each(Utils.difference(oldFields, _this4.fields), function (_, field) {\n          field.reset();\n        });\n      });\n\n      return this;\n    },\n    // Internal only.\n    // Looping on a form's fields to do validation or similar\n    // will trigger reactualizing options on all of them, which\n    // in turn will reactualize the form's options.\n    // To avoid calling actualizeOptions so many times on the form\n    // for nothing, _withoutReactualizingFormOptions temporarily disables\n    // the method actualizeOptions on this form while `fn` is called.\n    _withoutReactualizingFormOptions: function _withoutReactualizingFormOptions(fn) {\n      var oldActualizeOptions = this.actualizeOptions;\n\n      this.actualizeOptions = function () {\n        return this;\n      };\n\n      var result = fn();\n      this.actualizeOptions = oldActualizeOptions;\n      return result;\n    },\n    // Internal only.\n    // Shortcut to trigger an event\n    // Returns true iff event is not interrupted and default not prevented.\n    _trigger: function _trigger(eventName) {\n      return this.trigger('form:' + eventName);\n    }\n  };\n\n  var Constraint = function Constraint(parsleyField, name, requirements, priority, isDomConstraint) {\n    var validatorSpec = window.Parsley._validatorRegistry.validators[name];\n    var validator = new Validator(validatorSpec);\n    priority = priority || parsleyField.options[name + 'Priority'] || validator.priority;\n    isDomConstraint = true === isDomConstraint;\n\n    _extends(this, {\n      validator: validator,\n      name: name,\n      requirements: requirements,\n      priority: priority,\n      isDomConstraint: isDomConstraint\n    });\n\n    this._parseRequirements(parsleyField.options);\n  };\n\n  var capitalize = function capitalize(str) {\n    var cap = str[0].toUpperCase();\n    return cap + str.slice(1);\n  };\n\n  Constraint.prototype = {\n    validate: function validate(value, instance) {\n      var _this$validator;\n\n      return (_this$validator = this.validator).validate.apply(_this$validator, [value].concat(_toConsumableArray(this.requirementList), [instance]));\n    },\n    _parseRequirements: function _parseRequirements(options) {\n      var _this = this;\n\n      this.requirementList = this.validator.parseRequirements(this.requirements, function (key) {\n        return options[_this.name + capitalize(key)];\n      });\n    }\n  };\n\n  var Field = function Field(field, domOptions, options, parsleyFormInstance) {\n    this.__class__ = 'Field';\n    this.element = field;\n    this.$element = $(field); // Set parent if we have one\n\n    if ('undefined' !== typeof parsleyFormInstance) {\n      this.parent = parsleyFormInstance;\n    }\n\n    this.options = options;\n    this.domOptions = domOptions; // Initialize some properties\n\n    this.constraints = [];\n    this.constraintsByName = {};\n    this.validationResult = true; // Bind constraints\n\n    this._bindConstraints();\n  };\n\n  var statusMapping$1 = {\n    pending: null,\n    resolved: true,\n    rejected: false\n  };\n  Field.prototype = {\n    // # Public API\n    // Validate field and trigger some events for mainly `UI`\n    // @returns `true`, an array of the validators that failed, or\n    // `null` if validation is not finished. Prefer using whenValidate\n    validate: function validate(options) {\n      if (arguments.length >= 1 && !$.isPlainObject(options)) {\n        Utils.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n        options = {\n          options: options\n        };\n      }\n\n      var promise = this.whenValidate(options);\n      if (!promise) // If excluded with `group` option\n        return true;\n\n      switch (promise.state()) {\n        case 'pending':\n          return null;\n\n        case 'resolved':\n          return true;\n\n        case 'rejected':\n          return this.validationResult;\n      }\n    },\n    // Validate field and trigger some events for mainly `UI`\n    // @returns a promise that succeeds only when all validations do\n    // or `undefined` if field is not in the given `group`.\n    whenValidate: function whenValidate() {\n      var _this$whenValid$alway,\n          _this = this;\n\n      var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          force = _ref.force,\n          group = _ref.group;\n\n      // do not validate a field if not the same as given validation group\n      this.refresh();\n      if (group && !this._isInGroup(group)) return;\n      this.value = this.getValue(); // Field Validate event. `this.value` could be altered for custom needs\n\n      this._trigger('validate');\n\n      return (_this$whenValid$alway = this.whenValid({\n        force: force,\n        value: this.value,\n        _refreshed: true\n      }).always(function () {\n        _this._reflowUI();\n      }).done(function () {\n        _this._trigger('success');\n      }).fail(function () {\n        _this._trigger('error');\n      }).always(function () {\n        _this._trigger('validated');\n      })).pipe.apply(_this$whenValid$alway, _toConsumableArray(this._pipeAccordingToValidationResult()));\n    },\n    hasConstraints: function hasConstraints() {\n      return 0 !== this.constraints.length;\n    },\n    // An empty optional field does not need validation\n    needsValidation: function needsValidation(value) {\n      if ('undefined' === typeof value) value = this.getValue(); // If a field is empty and not required, it is valid\n      // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n\n      if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty) return false;\n      return true;\n    },\n    _isInGroup: function _isInGroup(group) {\n      if (Array.isArray(this.options.group)) return -1 !== $.inArray(group, this.options.group);\n      return this.options.group === group;\n    },\n    // Just validate field. Do not trigger any event.\n    // Returns `true` iff all constraints pass, `false` if there are failures,\n    // or `null` if the result can not be determined yet (depends on a promise)\n    // See also `whenValid`.\n    isValid: function isValid(options) {\n      if (arguments.length >= 1 && !$.isPlainObject(options)) {\n        Utils.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n\n        var _arguments = Array.prototype.slice.call(arguments),\n            force = _arguments[0],\n            value = _arguments[1];\n\n        options = {\n          force: force,\n          value: value\n        };\n      }\n\n      var promise = this.whenValid(options);\n      if (!promise) // Excluded via `group`\n        return true;\n      return statusMapping$1[promise.state()];\n    },\n    // Just validate field. Do not trigger any event.\n    // @returns a promise that succeeds only when all validations do\n    // or `undefined` if the field is not in the given `group`.\n    // The argument `force` will force validation of empty fields.\n    // If a `value` is given, it will be validated instead of the value of the input.\n    whenValid: function whenValid() {\n      var _this2 = this;\n\n      var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref2$force = _ref2.force,\n          force = _ref2$force === void 0 ? false : _ref2$force,\n          value = _ref2.value,\n          group = _ref2.group,\n          _refreshed = _ref2._refreshed;\n\n      // Recompute options and rebind constraints to have latest changes\n      if (!_refreshed) this.refresh(); // do not validate a field if not the same as given validation group\n\n      if (group && !this._isInGroup(group)) return;\n      this.validationResult = true; // A field without constraint is valid\n\n      if (!this.hasConstraints()) return $.when(); // Value could be passed as argument, needed to add more power to 'field:validate'\n\n      if ('undefined' === typeof value || null === value) value = this.getValue();\n      if (!this.needsValidation(value) && true !== force) return $.when();\n\n      var groupedConstraints = this._getGroupedConstraints();\n\n      var promises = [];\n      $.each(groupedConstraints, function (_, constraints) {\n        // Process one group of constraints at a time, we validate the constraints\n        // and combine the promises together.\n        var promise = Utils.all($.map(constraints, function (constraint) {\n          return _this2._validateConstraint(value, constraint);\n        }));\n        promises.push(promise);\n        if (promise.state() === 'rejected') return false; // Interrupt processing if a group has already failed\n      });\n      return Utils.all(promises);\n    },\n    // @returns a promise\n    _validateConstraint: function _validateConstraint(value, constraint) {\n      var _this3 = this;\n\n      var result = constraint.validate(value, this); // Map false to a failed promise\n\n      if (false === result) result = $.Deferred().reject(); // Make sure we return a promise and that we record failures\n\n      return Utils.all([result]).fail(function (errorMessage) {\n        if (!(_this3.validationResult instanceof Array)) _this3.validationResult = [];\n\n        _this3.validationResult.push({\n          assert: constraint,\n          errorMessage: 'string' === typeof errorMessage && errorMessage\n        });\n      });\n    },\n    // @returns Parsley field computed value that could be overrided or configured in DOM\n    getValue: function getValue() {\n      var value; // Value could be overriden in DOM or with explicit options\n\n      if ('function' === typeof this.options.value) value = this.options.value(this);else if ('undefined' !== typeof this.options.value) value = this.options.value;else value = this.$element.val(); // Handle wrong DOM or configurations\n\n      if ('undefined' === typeof value || null === value) return '';\n      return this._handleWhitespace(value);\n    },\n    // Reset UI\n    reset: function reset() {\n      this._resetUI();\n\n      return this._trigger('reset');\n    },\n    // Destroy Parsley instance (+ UI)\n    destroy: function destroy() {\n      // Field case: emit destroy event to clean UI and then destroy stored instance\n      this._destroyUI();\n\n      this.$element.removeData('Parsley');\n      this.$element.removeData('FieldMultiple');\n\n      this._trigger('destroy');\n    },\n    // Actualize options and rebind constraints\n    refresh: function refresh() {\n      this._refreshConstraints();\n\n      return this;\n    },\n    _refreshConstraints: function _refreshConstraints() {\n      return this.actualizeOptions()._bindConstraints();\n    },\n    refreshConstraints: function refreshConstraints() {\n      Utils.warnOnce(\"Parsley's refreshConstraints is deprecated. Please use refresh\");\n      return this.refresh();\n    },\n\n    /**\n    * Add a new constraint to a field\n    *\n    * @param {String}   name\n    * @param {Mixed}    requirements      optional\n    * @param {Number}   priority          optional\n    * @param {Boolean}  isDomConstraint   optional\n    */\n    addConstraint: function addConstraint(name, requirements, priority, isDomConstraint) {\n      if (window.Parsley._validatorRegistry.validators[name]) {\n        var constraint = new Constraint(this, name, requirements, priority, isDomConstraint); // if constraint already exist, delete it and push new version\n\n        if ('undefined' !== this.constraintsByName[constraint.name]) this.removeConstraint(constraint.name);\n        this.constraints.push(constraint);\n        this.constraintsByName[constraint.name] = constraint;\n      }\n\n      return this;\n    },\n    // Remove a constraint\n    removeConstraint: function removeConstraint(name) {\n      for (var i = 0; i < this.constraints.length; i++) {\n        if (name === this.constraints[i].name) {\n          this.constraints.splice(i, 1);\n          break;\n        }\n      }\n\n      delete this.constraintsByName[name];\n      return this;\n    },\n    // Update a constraint (Remove + re-add)\n    updateConstraint: function updateConstraint(name, parameters, priority) {\n      return this.removeConstraint(name).addConstraint(name, parameters, priority);\n    },\n    // # Internals\n    // Internal only.\n    // Bind constraints from config + options + DOM\n    _bindConstraints: function _bindConstraints() {\n      var constraints = [];\n      var constraintsByName = {}; // clean all existing DOM constraints to only keep javascript user constraints\n\n      for (var i = 0; i < this.constraints.length; i++) {\n        if (false === this.constraints[i].isDomConstraint) {\n          constraints.push(this.constraints[i]);\n          constraintsByName[this.constraints[i].name] = this.constraints[i];\n        }\n      }\n\n      this.constraints = constraints;\n      this.constraintsByName = constraintsByName; // then re-add Parsley DOM-API constraints\n\n      for (var name in this.options) {\n        this.addConstraint(name, this.options[name], undefined, true);\n      } // finally, bind special HTML5 constraints\n\n\n      return this._bindHtml5Constraints();\n    },\n    // Internal only.\n    // Bind specific HTML5 constraints to be HTML5 compliant\n    _bindHtml5Constraints: function _bindHtml5Constraints() {\n      // html5 required\n      if (null !== this.element.getAttribute('required')) this.addConstraint('required', true, undefined, true); // html5 pattern\n\n      if (null !== this.element.getAttribute('pattern')) this.addConstraint('pattern', this.element.getAttribute('pattern'), undefined, true); // range\n\n      var min = this.element.getAttribute('min');\n      var max = this.element.getAttribute('max');\n      if (null !== min && null !== max) this.addConstraint('range', [min, max], undefined, true); // HTML5 min\n      else if (null !== min) this.addConstraint('min', min, undefined, true); // HTML5 max\n        else if (null !== max) this.addConstraint('max', max, undefined, true); // length\n\n      if (null !== this.element.getAttribute('minlength') && null !== this.element.getAttribute('maxlength')) this.addConstraint('length', [this.element.getAttribute('minlength'), this.element.getAttribute('maxlength')], undefined, true); // HTML5 minlength\n      else if (null !== this.element.getAttribute('minlength')) this.addConstraint('minlength', this.element.getAttribute('minlength'), undefined, true); // HTML5 maxlength\n        else if (null !== this.element.getAttribute('maxlength')) this.addConstraint('maxlength', this.element.getAttribute('maxlength'), undefined, true); // html5 types\n\n      var type = Utils.getType(this.element); // Small special case here for HTML5 number: integer validator if step attribute is undefined or an integer value, number otherwise\n\n      if ('number' === type) {\n        return this.addConstraint('type', ['number', {\n          step: this.element.getAttribute('step') || '1',\n          base: min || this.element.getAttribute('value')\n        }], undefined, true); // Regular other HTML5 supported types\n      } else if (/^(email|url|range|date)$/i.test(type)) {\n        return this.addConstraint('type', type, undefined, true);\n      }\n\n      return this;\n    },\n    // Internal only.\n    // Field is required if have required constraint without `false` value\n    _isRequired: function _isRequired() {\n      if ('undefined' === typeof this.constraintsByName.required) return false;\n      return false !== this.constraintsByName.required.requirements;\n    },\n    // Internal only.\n    // Shortcut to trigger an event\n    _trigger: function _trigger(eventName) {\n      return this.trigger('field:' + eventName);\n    },\n    // Internal only\n    // Handles whitespace in a value\n    // Use `data-parsley-whitespace=\"squish\"` to auto squish input value\n    // Use `data-parsley-whitespace=\"trim\"` to auto trim input value\n    _handleWhitespace: function _handleWhitespace(value) {\n      if (true === this.options.trimValue) Utils.warnOnce('data-parsley-trim-value=\"true\" is deprecated, please use data-parsley-whitespace=\"trim\"');\n      if ('squish' === this.options.whitespace) value = value.replace(/\\s{2,}/g, ' ');\n      if ('trim' === this.options.whitespace || 'squish' === this.options.whitespace || true === this.options.trimValue) value = Utils.trimString(value);\n      return value;\n    },\n    _isDateInput: function _isDateInput() {\n      var c = this.constraintsByName.type;\n      return c && c.requirements === 'date';\n    },\n    // Internal only.\n    // Returns the constraints, grouped by descending priority.\n    // The result is thus an array of arrays of constraints.\n    _getGroupedConstraints: function _getGroupedConstraints() {\n      if (false === this.options.priorityEnabled) return [this.constraints];\n      var groupedConstraints = [];\n      var index = {}; // Create array unique of priorities\n\n      for (var i = 0; i < this.constraints.length; i++) {\n        var p = this.constraints[i].priority;\n        if (!index[p]) groupedConstraints.push(index[p] = []);\n        index[p].push(this.constraints[i]);\n      } // Sort them by priority DESC\n\n\n      groupedConstraints.sort(function (a, b) {\n        return b[0].priority - a[0].priority;\n      });\n      return groupedConstraints;\n    }\n  };\n\n  var Multiple = function Multiple() {\n    this.__class__ = 'FieldMultiple';\n  };\n\n  Multiple.prototype = {\n    // Add new `$element` sibling for multiple field\n    addElement: function addElement($element) {\n      this.$elements.push($element);\n      return this;\n    },\n    // See `Field._refreshConstraints()`\n    _refreshConstraints: function _refreshConstraints() {\n      var fieldConstraints;\n      this.constraints = []; // Select multiple special treatment\n\n      if (this.element.nodeName === 'SELECT') {\n        this.actualizeOptions()._bindConstraints();\n\n        return this;\n      } // Gather all constraints for each input in the multiple group\n\n\n      for (var i = 0; i < this.$elements.length; i++) {\n        // Check if element have not been dynamically removed since last binding\n        if (!$('html').has(this.$elements[i]).length) {\n          this.$elements.splice(i, 1);\n          continue;\n        }\n\n        fieldConstraints = this.$elements[i].data('FieldMultiple')._refreshConstraints().constraints;\n\n        for (var j = 0; j < fieldConstraints.length; j++) {\n          this.addConstraint(fieldConstraints[j].name, fieldConstraints[j].requirements, fieldConstraints[j].priority, fieldConstraints[j].isDomConstraint);\n        }\n      }\n\n      return this;\n    },\n    // See `Field.getValue()`\n    getValue: function getValue() {\n      // Value could be overriden in DOM\n      if ('function' === typeof this.options.value) return this.options.value(this);else if ('undefined' !== typeof this.options.value) return this.options.value; // Radio input case\n\n      if (this.element.nodeName === 'INPUT') {\n        var type = Utils.getType(this.element);\n        if (type === 'radio') return this._findRelated().filter(':checked').val() || ''; // checkbox input case\n\n        if (type === 'checkbox') {\n          var values = [];\n\n          this._findRelated().filter(':checked').each(function () {\n            values.push($(this).val());\n          });\n\n          return values;\n        }\n      } // Select multiple case\n\n\n      if (this.element.nodeName === 'SELECT' && null === this.$element.val()) return []; // Default case that should never happen\n\n      return this.$element.val();\n    },\n    _init: function _init() {\n      this.$elements = [this.$element];\n      return this;\n    }\n  };\n\n  var Factory = function Factory(element, options, parsleyFormInstance) {\n    this.element = element;\n    this.$element = $(element); // If the element has already been bound, returns its saved Parsley instance\n\n    var savedparsleyFormInstance = this.$element.data('Parsley');\n\n    if (savedparsleyFormInstance) {\n      // If the saved instance has been bound without a Form parent and there is one given in this call, add it\n      if ('undefined' !== typeof parsleyFormInstance && savedparsleyFormInstance.parent === window.Parsley) {\n        savedparsleyFormInstance.parent = parsleyFormInstance;\n\n        savedparsleyFormInstance._resetOptions(savedparsleyFormInstance.options);\n      }\n\n      if ('object' === _typeof(options)) {\n        _extends(savedparsleyFormInstance.options, options);\n      }\n\n      return savedparsleyFormInstance;\n    } // Parsley must be instantiated with a DOM element or jQuery $element\n\n\n    if (!this.$element.length) throw new Error('You must bind Parsley on an existing element.');\n    if ('undefined' !== typeof parsleyFormInstance && 'Form' !== parsleyFormInstance.__class__) throw new Error('Parent instance must be a Form instance');\n    this.parent = parsleyFormInstance || window.Parsley;\n    return this.init(options);\n  };\n\n  Factory.prototype = {\n    init: function init(options) {\n      this.__class__ = 'Parsley';\n      this.__version__ = '2.9.2';\n      this.__id__ = Utils.generateID(); // Pre-compute options\n\n      this._resetOptions(options); // A Form instance is obviously a `<form>` element but also every node that is not an input and has the `data-parsley-validate` attribute\n\n\n      if (this.element.nodeName === 'FORM' || Utils.checkAttr(this.element, this.options.namespace, 'validate') && !this.$element.is(this.options.inputs)) return this.bind('parsleyForm'); // Every other element is bound as a `Field` or `FieldMultiple`\n\n      return this.isMultiple() ? this.handleMultiple() : this.bind('parsleyField');\n    },\n    isMultiple: function isMultiple() {\n      var type = Utils.getType(this.element);\n      return type === 'radio' || type === 'checkbox' || this.element.nodeName === 'SELECT' && null !== this.element.getAttribute('multiple');\n    },\n    // Multiples fields are a real nightmare :(\n    // Maybe some refactoring would be appreciated here...\n    handleMultiple: function handleMultiple() {\n      var _this = this;\n\n      var name;\n      var parsleyMultipleInstance; // Handle multiple name\n\n      this.options.multiple = this.options.multiple || (name = this.element.getAttribute('name')) || this.element.getAttribute('id'); // Special select multiple input\n\n      if (this.element.nodeName === 'SELECT' && null !== this.element.getAttribute('multiple')) {\n        this.options.multiple = this.options.multiple || this.__id__;\n        return this.bind('parsleyFieldMultiple'); // Else for radio / checkboxes, we need a `name` or `data-parsley-multiple` to properly bind it\n      } else if (!this.options.multiple) {\n        Utils.warn('To be bound by Parsley, a radio, a checkbox and a multiple select input must have either a name or a multiple option.', this.$element);\n        return this;\n      } // Remove special chars\n\n\n      this.options.multiple = this.options.multiple.replace(/(:|\\.|\\[|\\]|\\{|\\}|\\$)/g, ''); // Add proper `data-parsley-multiple` to siblings if we have a valid multiple name\n\n      if (name) {\n        $('input[name=\"' + name + '\"]').each(function (i, input) {\n          var type = Utils.getType(input);\n          if (type === 'radio' || type === 'checkbox') input.setAttribute(_this.options.namespace + 'multiple', _this.options.multiple);\n        });\n      } // Check here if we don't already have a related multiple instance saved\n\n\n      var $previouslyRelated = this._findRelated();\n\n      for (var i = 0; i < $previouslyRelated.length; i++) {\n        parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley');\n\n        if ('undefined' !== typeof parsleyMultipleInstance) {\n          if (!this.$element.data('FieldMultiple')) {\n            parsleyMultipleInstance.addElement(this.$element);\n          }\n\n          break;\n        }\n      } // Create a secret Field instance for every multiple field. It will be stored in `data('FieldMultiple')`\n      // And will be useful later to access classic `Field` stuff while being in a `FieldMultiple` instance\n\n\n      this.bind('parsleyField', true);\n      return parsleyMultipleInstance || this.bind('parsleyFieldMultiple');\n    },\n    // Return proper `Form`, `Field` or `FieldMultiple`\n    bind: function bind(type, doNotStore) {\n      var parsleyInstance;\n\n      switch (type) {\n        case 'parsleyForm':\n          parsleyInstance = $.extend(new Form(this.element, this.domOptions, this.options), new Base(), window.ParsleyExtend)._bindFields();\n          break;\n\n        case 'parsleyField':\n          parsleyInstance = $.extend(new Field(this.element, this.domOptions, this.options, this.parent), new Base(), window.ParsleyExtend);\n          break;\n\n        case 'parsleyFieldMultiple':\n          parsleyInstance = $.extend(new Field(this.element, this.domOptions, this.options, this.parent), new Multiple(), new Base(), window.ParsleyExtend)._init();\n          break;\n\n        default:\n          throw new Error(type + 'is not a supported Parsley type');\n      }\n\n      if (this.options.multiple) Utils.setAttr(this.element, this.options.namespace, 'multiple', this.options.multiple);\n\n      if ('undefined' !== typeof doNotStore) {\n        this.$element.data('FieldMultiple', parsleyInstance);\n        return parsleyInstance;\n      } // Store the freshly bound instance in a DOM element for later access using jQuery `data()`\n\n\n      this.$element.data('Parsley', parsleyInstance); // Tell the world we have a new Form or Field instance!\n\n      parsleyInstance._actualizeTriggers();\n\n      parsleyInstance._trigger('init');\n\n      return parsleyInstance;\n    }\n  };\n\n  var vernums = $.fn.jquery.split('.');\n\n  if (parseInt(vernums[0]) <= 1 && parseInt(vernums[1]) < 8) {\n    throw \"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.\";\n  }\n\n  if (!vernums.forEach) {\n    Utils.warn('Parsley requires ES5 to run properly. Please include https://github.com/es-shims/es5-shim');\n  } // Inherit `on`, `off` & `trigger` to Parsley:\n\n\n  var Parsley = _extends(new Base(), {\n    element: document,\n    $element: $(document),\n    actualizeOptions: null,\n    _resetOptions: null,\n    Factory: Factory,\n    version: '2.9.2'\n  }); // Supplement Field and Form with Base\n  // This way, the constructors will have access to those methods\n\n\n  _extends(Field.prototype, UI.Field, Base.prototype);\n\n  _extends(Form.prototype, UI.Form, Base.prototype); // Inherit actualizeOptions and _resetOptions:\n\n\n  _extends(Factory.prototype, Base.prototype); // ### jQuery API\n  // `$('.elem').parsley(options)` or `$('.elem').psly(options)`\n\n\n  $.fn.parsley = $.fn.psly = function (options) {\n    if (this.length > 1) {\n      var instances = [];\n      this.each(function () {\n        instances.push($(this).parsley(options));\n      });\n      return instances;\n    } // Return undefined if applied to non existing DOM element\n\n\n    if (this.length == 0) {\n      return;\n    }\n\n    return new Factory(this[0], options);\n  }; // ### Field and Form extension\n  // Ensure the extension is now defined if it wasn't previously\n\n\n  if ('undefined' === typeof window.ParsleyExtend) window.ParsleyExtend = {}; // ### Parsley config\n  // Inherit from ParsleyDefault, and copy over any existing values\n\n  Parsley.options = _extends(Utils.objectCreate(Defaults), window.ParsleyConfig);\n  window.ParsleyConfig = Parsley.options; // Old way of accessing global options\n  // ### Globals\n\n  window.Parsley = window.psly = Parsley;\n  Parsley.Utils = Utils;\n  window.ParsleyUtils = {};\n  $.each(Utils, function (key, value) {\n    if ('function' === typeof value) {\n      window.ParsleyUtils[key] = function () {\n        Utils.warnOnce('Accessing `window.ParsleyUtils` is deprecated. Use `window.Parsley.Utils` instead.');\n        return Utils[key].apply(Utils, arguments);\n      };\n    }\n  }); // ### Define methods that forward to the registry, and deprecate all access except through window.Parsley\n\n  var registry = window.Parsley._validatorRegistry = new ValidatorRegistry(window.ParsleyConfig.validators, window.ParsleyConfig.i18n);\n  window.ParsleyValidator = {};\n  $.each('setLocale addCatalog addMessage addMessages getErrorMessage formatMessage addValidator updateValidator removeValidator hasValidator'.split(' '), function (i, method) {\n    window.Parsley[method] = function () {\n      return registry[method].apply(registry, arguments);\n    };\n\n    window.ParsleyValidator[method] = function () {\n      var _window$Parsley;\n\n      Utils.warnOnce(\"Accessing the method '\".concat(method, \"' through Validator is deprecated. Simply call 'window.Parsley.\").concat(method, \"(...)'\"));\n      return (_window$Parsley = window.Parsley)[method].apply(_window$Parsley, arguments);\n    };\n  }); // ### UI\n  // Deprecated global object\n\n  window.Parsley.UI = UI;\n  window.ParsleyUI = {\n    removeError: function removeError(instance, name, doNotUpdateClass) {\n      var updateClass = true !== doNotUpdateClass;\n      Utils.warnOnce(\"Accessing UI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method.\");\n      return instance.removeError(name, {\n        updateClass: updateClass\n      });\n    },\n    getErrorsMessages: function getErrorsMessages(instance) {\n      Utils.warnOnce(\"Accessing UI is deprecated. Call 'getErrorsMessages' on the instance directly.\");\n      return instance.getErrorsMessages();\n    }\n  };\n  $.each('addError updateError'.split(' '), function (i, method) {\n    window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n      var updateClass = true !== doNotUpdateClass;\n      Utils.warnOnce(\"Accessing UI is deprecated. Call '\".concat(method, \"' on the instance directly. Please comment in issue 1073 as to your need to call this method.\"));\n      return instance[method](name, {\n        message: message,\n        assert: assert,\n        updateClass: updateClass\n      });\n    };\n  }); // ### PARSLEY auto-binding\n  // Prevent it by setting `ParsleyConfig.autoBind` to `false`\n\n  if (false !== window.ParsleyConfig.autoBind) {\n    $(function () {\n      // Works only on `data-parsley-validate`.\n      if ($('[data-parsley-validate]').length) $('[data-parsley-validate]').parsley();\n    });\n  }\n\n  var o = $({});\n\n  var deprecated = function deprecated() {\n    Utils.warnOnce(\"Parsley's pubsub module is deprecated; use the 'on' and 'off' methods on parsley instances or window.Parsley\");\n  }; // Returns an event handler that calls `fn` with the arguments it expects\n\n\n  function adapt(fn, context) {\n    // Store to allow unbinding\n    if (!fn.parsleyAdaptedCallback) {\n      fn.parsleyAdaptedCallback = function () {\n        var args = Array.prototype.slice.call(arguments, 0);\n        args.unshift(this);\n        fn.apply(context || o, args);\n      };\n    }\n\n    return fn.parsleyAdaptedCallback;\n  }\n\n  var eventPrefix = 'parsley:'; // Converts 'parsley:form:validate' into 'form:validate'\n\n  function eventName(name) {\n    if (name.lastIndexOf(eventPrefix, 0) === 0) return name.substr(eventPrefix.length);\n    return name;\n  } // $.listen is deprecated. Use Parsley.on instead.\n\n\n  $.listen = function (name, callback) {\n    var context;\n    deprecated();\n\n    if ('object' === _typeof(arguments[1]) && 'function' === typeof arguments[2]) {\n      context = arguments[1];\n      callback = arguments[2];\n    }\n\n    if ('function' !== typeof callback) throw new Error('Wrong parameters');\n    window.Parsley.on(eventName(name), adapt(callback, context));\n  };\n\n  $.listenTo = function (instance, name, fn) {\n    deprecated();\n    if (!(instance instanceof Field) && !(instance instanceof Form)) throw new Error('Must give Parsley instance');\n    if ('string' !== typeof name || 'function' !== typeof fn) throw new Error('Wrong parameters');\n    instance.on(eventName(name), adapt(fn));\n  };\n\n  $.unsubscribe = function (name, fn) {\n    deprecated();\n    if ('string' !== typeof name || 'function' !== typeof fn) throw new Error('Wrong arguments');\n    window.Parsley.off(eventName(name), fn.parsleyAdaptedCallback);\n  };\n\n  $.unsubscribeTo = function (instance, name) {\n    deprecated();\n    if (!(instance instanceof Field) && !(instance instanceof Form)) throw new Error('Must give Parsley instance');\n    instance.off(eventName(name));\n  };\n\n  $.unsubscribeAll = function (name) {\n    deprecated();\n    window.Parsley.off(eventName(name));\n    $('form,input,textarea,select').each(function () {\n      var instance = $(this).data('Parsley');\n\n      if (instance) {\n        instance.off(eventName(name));\n      }\n    });\n  }; // $.emit is deprecated. Use jQuery events instead.\n\n\n  $.emit = function (name, instance) {\n    var _instance;\n\n    deprecated();\n    var instanceGiven = instance instanceof Field || instance instanceof Form;\n    var args = Array.prototype.slice.call(arguments, instanceGiven ? 2 : 1);\n    args.unshift(eventName(name));\n\n    if (!instanceGiven) {\n      instance = window.Parsley;\n    }\n\n    (_instance = instance).trigger.apply(_instance, _toConsumableArray(args));\n  };\n\n  $.extend(true, Parsley, {\n    asyncValidators: {\n      'default': {\n        fn: function fn(xhr) {\n          // By default, only status 2xx are deemed successful.\n          // Note: we use status instead of state() because responses with status 200\n          // but invalid messages (e.g. an empty body for content type set to JSON) will\n          // result in state() === 'rejected'.\n          return xhr.status >= 200 && xhr.status < 300;\n        },\n        url: false\n      },\n      reverse: {\n        fn: function fn(xhr) {\n          // If reverse option is set, a failing ajax request is considered successful\n          return xhr.status < 200 || xhr.status >= 300;\n        },\n        url: false\n      }\n    },\n    addAsyncValidator: function addAsyncValidator(name, fn, url, options) {\n      Parsley.asyncValidators[name] = {\n        fn: fn,\n        url: url || false,\n        options: options || {}\n      };\n      return this;\n    }\n  });\n  Parsley.addValidator('remote', {\n    requirementType: {\n      '': 'string',\n      'validator': 'string',\n      'reverse': 'boolean',\n      'options': 'object'\n    },\n    validateString: function validateString(value, url, options, instance) {\n      var data = {};\n      var ajaxOptions;\n      var csr;\n      var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n      if ('undefined' === typeof Parsley.asyncValidators[validator]) throw new Error('Calling an undefined async validator: `' + validator + '`');\n      url = Parsley.asyncValidators[validator].url || url; // Fill current value\n\n      if (url.indexOf('{value}') > -1) {\n        url = url.replace('{value}', encodeURIComponent(value));\n      } else {\n        data[instance.element.getAttribute('name') || instance.element.getAttribute('id')] = value;\n      } // Merge options passed in from the function with the ones in the attribute\n\n\n      var remoteOptions = $.extend(true, options.options || {}, Parsley.asyncValidators[validator].options); // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n\n      ajaxOptions = $.extend(true, {}, {\n        url: url,\n        data: data,\n        type: 'GET'\n      }, remoteOptions); // Generate store key based on ajax options\n\n      instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n      csr = $.param(ajaxOptions); // Initialise query cache\n\n      if ('undefined' === typeof Parsley._remoteCache) Parsley._remoteCache = {}; // Try to retrieve stored xhr\n\n      var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n      var handleXhr = function handleXhr() {\n        var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n        if (!result) // Map falsy results to rejected promise\n          result = $.Deferred().reject();\n        return $.when(result);\n      };\n\n      return xhr.then(handleXhr, handleXhr);\n    },\n    priority: -1\n  });\n  Parsley.on('form:submit', function () {\n    Parsley._remoteCache = {};\n  });\n\n  Base.prototype.addAsyncValidator = function () {\n    Utils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n    return Parsley.addAsyncValidator.apply(Parsley, arguments);\n  };\n\n  // This is included with the Parsley library itself,\n  Parsley.addMessages('en', {\n    defaultMessage: \"This value seems to be invalid.\",\n    type: {\n      email: \"This value should be a valid email.\",\n      url: \"This value should be a valid url.\",\n      number: \"This value should be a valid number.\",\n      integer: \"This value should be a valid integer.\",\n      digits: \"This value should be digits.\",\n      alphanum: \"This value should be alphanumeric.\"\n    },\n    notblank: \"This value should not be blank.\",\n    required: \"This value is required.\",\n    pattern: \"This value seems to be invalid.\",\n    min: \"This value should be greater than or equal to %s.\",\n    max: \"This value should be lower than or equal to %s.\",\n    range: \"This value should be between %s and %s.\",\n    minlength: \"This value is too short. It should have %s characters or more.\",\n    maxlength: \"This value is too long. It should have %s characters or fewer.\",\n    length: \"This value length is invalid. It should be between %s and %s characters long.\",\n    mincheck: \"You must select at least %s choices.\",\n    maxcheck: \"You must select %s choices or fewer.\",\n    check: \"You must select between %s and %s choices.\",\n    equalto: \"This value should be the same.\",\n    euvatin: \"It's not a valid VAT Identification Number.\"\n  });\n  Parsley.setLocale('en');\n\n  function InputEvent() {\n    var _this = this;\n\n    var globals = window || global; // Slightly odd way construct our object. This way methods are force bound.\n    // Used to test for duplicate library.\n\n    _extends(this, {\n      // For browsers that do not support isTrusted, assumes event is native.\n      isNativeEvent: function isNativeEvent(evt) {\n        return evt.originalEvent && evt.originalEvent.isTrusted !== false;\n      },\n      fakeInputEvent: function fakeInputEvent(evt) {\n        if (_this.isNativeEvent(evt)) {\n          $(evt.target).trigger('input');\n        }\n      },\n      misbehaves: function misbehaves(evt) {\n        if (_this.isNativeEvent(evt)) {\n          _this.behavesOk(evt);\n\n          $(document).on('change.inputevent', evt.data.selector, _this.fakeInputEvent);\n\n          _this.fakeInputEvent(evt);\n        }\n      },\n      behavesOk: function behavesOk(evt) {\n        if (_this.isNativeEvent(evt)) {\n          $(document) // Simply unbinds the testing handler\n          .off('input.inputevent', evt.data.selector, _this.behavesOk).off('change.inputevent', evt.data.selector, _this.misbehaves);\n        }\n      },\n      // Bind the testing handlers\n      install: function install() {\n        if (globals.inputEventPatched) {\n          return;\n        }\n\n        globals.inputEventPatched = '0.0.3';\n\n        for (var _i = 0, _arr = ['select', 'input[type=\"checkbox\"]', 'input[type=\"radio\"]', 'input[type=\"file\"]']; _i < _arr.length; _i++) {\n          var selector = _arr[_i];\n          $(document).on('input.inputevent', selector, {\n            selector: selector\n          }, _this.behavesOk).on('change.inputevent', selector, {\n            selector: selector\n          }, _this.misbehaves);\n        }\n      },\n      uninstall: function uninstall() {\n        delete globals.inputEventPatched;\n        $(document).off('.inputevent');\n      }\n    });\n  }\n  var inputevent = new InputEvent();\n\n  inputevent.install();\n\n  return Parsley;\n\n})));\n//# sourceMappingURL=parsley.js.map\n"
  },
  {
    "path": "doc/about.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Parsley, the ultimate frontend javascript form validation library\">\n    <meta name=\"author\" content=\"Guillaume Potier\">\n\n    <title>Parsley - About</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../bower_components/bootstrap/dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"assets/docs.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js\"></script>\n      <script src=\"https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js\"></script>\n    <![endif]-->\n    <style>\n      body {\n        color: #111111;\n      }\n      h2 {\n        color: #FF851B;\n      }\n    </style>\n  </head>\n\n  <body>\n\n    <div class=\"container\">\n      <div class=\"masthead\">\n        <div class=\"header\">\n          <h3 class=\"text-muted\"><a href=\"../\">Parsley</a></h3>\n\n          <span class=\"social-buttons inline-block\">\n            <a href=\"https://twitter.com/share\" class=\"twitter-share-button\" data-url=\"http://parsleyjs.org\" data-text=\"Parsley, the ultimate javascript form validation library. #parsleyjs\" data-via=\"guillaumepotier\" data-related=\"guillaumepotier\" data-hashtags=\"parsleyjs\">Tweet</a>\n            <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>\n\n            <iframe src=\"http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=watch&count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"110\" height=\"20\"></iframe>\n\n            <iframe src=\"http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=fork&count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"110\" height=\"20\"></iframe>\n          </span>\n\n        </div>\n\n        <ul class=\"nav nav-justified\">\n          <li><a href=\"../\">Home</a></li>\n          <li><a href=\"examples.html\">Examples</a></li>\n          <li><a href=\"index.html\">Documentation</a></li>\n          <li><a href=\"download.html\">Download</a></li>\n          <li><a href=\"help.html\">Help</a></li>\n          <li><a href=\"annotated-source/main.html\">Annotated&nbsp;source</a></li>\n          <li><a href=\"tests.html\">Tests</a></li>\n          <li class=\"active\"><a href=\"about.html\">About</a></li>\n        </ul>\n      </div>\n\n      <!-- Jumbotron -->\n      <div class=\"jumbotron\">\n        <h1>About Parsley</h1>\n          <hr>\n\n          <div class=\"col-md-12\">Parsley is an open source, MIT licensed project created by <a href=\"https://github.com/guillaumepotier\" target=\"_blank\">Guillaume Potier</a> and co-maintened by <a href=\"https://github.com/marcandre\" target=\"_blank\">Marc-André</a> now.</div>\n\n\n          <div class=\"col-md-12\">While independant, Parsley is sponsored by <a href=\"http://wisembly.com\" target=\"_blank\">Wisembly</a>. At Wisembly, we love open-source software, see our <a href=\"https://github.com/Wisembly\" target=\"_blank\">other open-source projects here</a> and don't hesitate to give a try to <a href=\"http://getsolid.io/?utm_source=parsleyjs.org&utm_medium=referral&utm_campaign=parsley#i-love-parsley\" target=\"_blank\" style=\"font-weight:bolder;text-decoration:underline;\">Solid</a>, our latest product that will get you more productive during your meetings.</div>\n\n      </div>\n\n      <div class=\"clearfix\"></div>\n\n      <!-- Site footer -->\n      <div class=\"footer\">\n        <p>&copy; <a href=\"https://twitter.com/guillaumepotier\" title=\"Guillaume Potier on Twitter\">Guillaume Potier</a> 2014 - <a href=\"http://wisembly.com\">@Wisembly</a></p>\n      </div>\n    </div>\n\n    <script src=\"../bower_components/jquery/dist/jquery.min.js\"></script>\n    <script>\n      $(document).ready(function () {\n        $('.download').on('click', function (event) {\n          _gaq.push(['_trackEvent','download', 'download ' + $(this).data('version'), $(this).data('version')]);\n          _gaq.push(['_trackPageview','/download/' + $(this).data('version')]);\n        });\n      });\n    </script>\n    <script>\n      var _gaq = _gaq || [];\n      _gaq.push(['_setAccount', 'UA-37229467-1']);\n      _gaq.push(['_trackPageview']);\n\n      (function() {\n        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;\n        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';\n        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);\n      })();\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "doc/annotated-source/base.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>base.js</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page\"><a class=\"source\" href=\"../index.html\">&lt;&lt;&lt; back to documentation</a>\n            \n              \n              <a class=\"source\" href=\"base.html\">\n                base.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"constraint.html\">\n                constraint.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"defaults.html\">\n                defaults.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"factory.html\">\n                factory.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"field.html\">\n                field.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"form.html\">\n                form.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"main.html\">\n                main.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"multiple.html\">\n                multiple.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"pubsub.html\">\n                pubsub.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"remote.html\">\n                remote.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"ui.html\">\n                ui.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"utils.html\">\n                utils.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator.html\">\n                validator.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator_registry.html\">\n                validator_registry.js\n              </a>\n            \n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>base.js</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              \n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">import</span> $ <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'jquery'</span>;\n<span class=\"hljs-keyword\">import</span> Utils <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./utils'</span>;\n\n<span class=\"hljs-keyword\">var</span> Base = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n  <span class=\"hljs-keyword\">this</span>.__id__ = Utils.generateID();\n};\n\nBase.prototype = {\n  <span class=\"hljs-attr\">asyncSupport</span>: <span class=\"hljs-literal\">true</span>, <span class=\"hljs-comment\">// Deprecated</span>\n\n  <span class=\"hljs-attr\">_pipeAccordingToValidationResult</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">var</span> pipe = <span class=\"hljs-function\"><span class=\"hljs-params\">()</span> =&gt;</span> {\n      <span class=\"hljs-keyword\">var</span> r = $.Deferred();\n      <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-literal\">true</span> !== <span class=\"hljs-keyword\">this</span>.validationResult)\n        r.reject();\n      <span class=\"hljs-keyword\">return</span> r.resolve().promise();\n    };\n    <span class=\"hljs-keyword\">return</span> [pipe, pipe];\n  },\n\n  <span class=\"hljs-attr\">actualizeOptions</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    Utils.attr(<span class=\"hljs-keyword\">this</span>.element, <span class=\"hljs-keyword\">this</span>.options.namespace, <span class=\"hljs-keyword\">this</span>.domOptions);\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-keyword\">this</span>.parent &amp;&amp; <span class=\"hljs-keyword\">this</span>.parent.actualizeOptions)\n      <span class=\"hljs-keyword\">this</span>.parent.actualizeOptions();\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>;\n  },\n\n  <span class=\"hljs-attr\">_resetOptions</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">initOptions</span>) </span>{\n    <span class=\"hljs-keyword\">this</span>.domOptions = Utils.objectCreate(<span class=\"hljs-keyword\">this</span>.parent.options);\n    <span class=\"hljs-keyword\">this</span>.options = Utils.objectCreate(<span class=\"hljs-keyword\">this</span>.domOptions);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <p>Shallow copy of ownProperties of initOptions:</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">var</span> i <span class=\"hljs-keyword\">in</span> initOptions) {\n      <span class=\"hljs-keyword\">if</span> (initOptions.hasOwnProperty(i))\n        <span class=\"hljs-keyword\">this</span>.options[i] = initOptions[i];\n    }\n    <span class=\"hljs-keyword\">this</span>.actualizeOptions();\n  },\n\n  <span class=\"hljs-attr\">_listeners</span>: <span class=\"hljs-literal\">null</span>,</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <p>Register a callback for the given event name\nCallback is called with context as the first argument and the <code>this</code>\nThe context is the current parsley instance, or window.Parsley if global\nA return value of <code>false</code> will interrupt the calls</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  on: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">name, fn</span>) </span>{\n    <span class=\"hljs-keyword\">this</span>._listeners = <span class=\"hljs-keyword\">this</span>._listeners || {};\n    <span class=\"hljs-keyword\">var</span> queue = <span class=\"hljs-keyword\">this</span>._listeners[name] = <span class=\"hljs-keyword\">this</span>._listeners[name] || [];\n    queue.push(fn);\n\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>;\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              <p>Deprecated. Use <code>on</code> instead</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  subscribe: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">name, fn</span>) </span>{\n    $.listenTo(<span class=\"hljs-keyword\">this</span>, name.toLowerCase(), fn);\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <p>Unregister a callback (or all if none is given) for the given event name</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  off: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">name, fn</span>) </span>{\n    <span class=\"hljs-keyword\">var</span> queue = <span class=\"hljs-keyword\">this</span>._listeners &amp;&amp; <span class=\"hljs-keyword\">this</span>._listeners[name];\n    <span class=\"hljs-keyword\">if</span> (queue) {\n      <span class=\"hljs-keyword\">if</span> (!fn) {\n        <span class=\"hljs-keyword\">delete</span> <span class=\"hljs-keyword\">this</span>._listeners[name];\n      } <span class=\"hljs-keyword\">else</span> {\n        <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">var</span> i = queue.length; i--; )\n          <span class=\"hljs-keyword\">if</span> (queue[i] === fn)\n            queue.splice(i, <span class=\"hljs-number\">1</span>);\n      }\n    }\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>;\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p>Deprecated. Use <code>off</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  unsubscribe: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">name, fn</span>) </span>{\n    $.unsubscribeTo(<span class=\"hljs-keyword\">this</span>, name.toLowerCase());\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>\n              </div>\n              <p>Trigger an event of the given name\nA return value of <code>false</code> interrupts the callback chain\nReturns false if execution was interrupted</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  trigger: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">name, target, extraArg</span>) </span>{\n    target = target || <span class=\"hljs-keyword\">this</span>;\n    <span class=\"hljs-keyword\">var</span> queue = <span class=\"hljs-keyword\">this</span>._listeners &amp;&amp; <span class=\"hljs-keyword\">this</span>._listeners[name];\n    <span class=\"hljs-keyword\">var</span> result;\n    <span class=\"hljs-keyword\">var</span> parentResult;\n    <span class=\"hljs-keyword\">if</span> (queue) {\n      <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">var</span> i = queue.length; i--; ) {\n        result = queue[i].call(target, target, extraArg);\n        <span class=\"hljs-keyword\">if</span> (result === <span class=\"hljs-literal\">false</span>) <span class=\"hljs-keyword\">return</span> result;\n      }\n    }\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-keyword\">this</span>.parent) {\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.parent.trigger(name, target, extraArg);\n    }\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">true</span>;\n  },\n\n  <span class=\"hljs-attr\">asyncIsValid</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">group, force</span>) </span>{\n    Utils.warnOnce(<span class=\"hljs-string\">\"asyncIsValid is deprecated; please use whenValid instead\"</span>);\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.whenValid({group, force});\n  },\n\n  <span class=\"hljs-attr\">_findRelated</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.options.multiple ?\n      $(<span class=\"hljs-keyword\">this</span>.parent.element.querySelectorAll(<span class=\"hljs-string\">`[<span class=\"hljs-subst\">${<span class=\"hljs-keyword\">this</span>.options.namespace}</span>multiple=\"<span class=\"hljs-subst\">${<span class=\"hljs-keyword\">this</span>.options.multiple}</span>\"]`</span>))\n    : <span class=\"hljs-keyword\">this</span>.$element;\n  }\n};\n\n<span class=\"hljs-keyword\">export</span> <span class=\"hljs-keyword\">default</span> Base;</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n<script>var _gaq=_gaq||[];_gaq.push([\"_setAccount\",\"UA-37229467-1\"]);_gaq.push([\"_trackPageview\"]);(function(){var e=document.createElement(\"script\");e.type=\"text/javascript\";e.async=true;e.src=(\"https:\"==document.location.protocol?\"https://ssl\":\"http://www\")+\".google-analytics.com/ga.js\";var t=document.getElementsByTagName(\"script\")[0];t.parentNode.insertBefore(e,t)})();</script></body>\n</html>\n"
  },
  {
    "path": "doc/annotated-source/constraint.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>constraint.js</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page\"><a class=\"source\" href=\"../index.html\">&lt;&lt;&lt; back to documentation</a>\n            \n              \n              <a class=\"source\" href=\"base.html\">\n                base.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"constraint.html\">\n                constraint.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"defaults.html\">\n                defaults.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"factory.html\">\n                factory.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"field.html\">\n                field.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"form.html\">\n                form.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"main.html\">\n                main.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"multiple.html\">\n                multiple.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"pubsub.html\">\n                pubsub.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"remote.html\">\n                remote.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"ui.html\">\n                ui.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"utils.html\">\n                utils.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator.html\">\n                validator.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator_registry.html\">\n                validator_registry.js\n              </a>\n            \n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>constraint.js</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              \n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">import</span> Utils <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./utils'</span>;\n<span class=\"hljs-keyword\">import</span> Validator <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./validator'</span>;\n\n<span class=\"hljs-keyword\">const</span> Constraint = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">parsleyField, name, requirements, priority, isDomConstraint</span>) </span>{\n  <span class=\"hljs-keyword\">const</span> validatorSpec = <span class=\"hljs-built_in\">window</span>.Parsley._validatorRegistry.validators[name];\n  <span class=\"hljs-keyword\">const</span> validator = <span class=\"hljs-keyword\">new</span> Validator(validatorSpec);\n  priority = priority || parsleyField.options[name + <span class=\"hljs-string\">'Priority'</span>] || validator.priority;\n  isDomConstraint = (<span class=\"hljs-literal\">true</span> === isDomConstraint);\n\n  <span class=\"hljs-built_in\">Object</span>.assign(<span class=\"hljs-keyword\">this</span>, {\n    validator,\n    name,\n    requirements,\n    priority,\n    isDomConstraint\n  });\n  <span class=\"hljs-keyword\">this</span>._parseRequirements(parsleyField.options);\n};\n\n<span class=\"hljs-keyword\">const</span> capitalize = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">str</span>) </span>{\n  <span class=\"hljs-keyword\">const</span> cap = str[<span class=\"hljs-number\">0</span>].toUpperCase();\n  <span class=\"hljs-keyword\">return</span> cap + str.slice(<span class=\"hljs-number\">1</span>);\n};\n\nConstraint.prototype = {\n  <span class=\"hljs-attr\">validate</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">value, instance</span>) </span>{\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.validator.validate(value, ...this.requirementList, instance);\n  },\n\n  <span class=\"hljs-attr\">_parseRequirements</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">options</span>) </span>{\n    <span class=\"hljs-keyword\">this</span>.requirementList = <span class=\"hljs-keyword\">this</span>.validator.parseRequirements(<span class=\"hljs-keyword\">this</span>.requirements,\n      key =&gt; options[<span class=\"hljs-keyword\">this</span>.name + capitalize(key)]\n    );\n  }\n};\n\n<span class=\"hljs-keyword\">export</span> <span class=\"hljs-keyword\">default</span> Constraint;</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n<script>var _gaq=_gaq||[];_gaq.push([\"_setAccount\",\"UA-37229467-1\"]);_gaq.push([\"_trackPageview\"]);(function(){var e=document.createElement(\"script\");e.type=\"text/javascript\";e.async=true;e.src=(\"https:\"==document.location.protocol?\"https://ssl\":\"http://www\")+\".google-analytics.com/ga.js\";var t=document.getElementsByTagName(\"script\")[0];t.parentNode.insertBefore(e,t)})();</script></body>\n</html>\n"
  },
  {
    "path": "doc/annotated-source/defaults.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>defaults.js</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page\"><a class=\"source\" href=\"../index.html\">&lt;&lt;&lt; back to documentation</a>\n            \n              \n              <a class=\"source\" href=\"base.html\">\n                base.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"constraint.html\">\n                constraint.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"defaults.html\">\n                defaults.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"factory.html\">\n                factory.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"field.html\">\n                field.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"form.html\">\n                form.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"main.html\">\n                main.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"multiple.html\">\n                multiple.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"pubsub.html\">\n                pubsub.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"remote.html\">\n                remote.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"ui.html\">\n                ui.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"utils.html\">\n                utils.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator.html\">\n                validator.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator_registry.html\">\n                validator_registry.js\n              </a>\n            \n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>defaults.js</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              <p>All these options could be overriden and specified directly in DOM using\n<code>data-parsley-</code> default DOM-API\neg: <code>inputs</code> can be set in DOM using <code>data-parsley-inputs=&quot;input, textarea&quot;</code>\neg: <code>data-parsley-stop-on-first-failing-constraint=&quot;false&quot;</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>\n<span class=\"hljs-keyword\">var</span> Defaults = {</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <h3 id=\"general\">General</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <p>Default data-namespace for DOM API</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  namespace: <span class=\"hljs-string\">'data-parsley-'</span>,</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              <p>Supported inputs by default</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  inputs: <span class=\"hljs-string\">'input, textarea, select'</span>,</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <p>Excluded inputs by default</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  excluded: <span class=\"hljs-string\">'input[type=button], input[type=submit], input[type=reset], input[type=hidden]'</span>,</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p>Stop validating field on highest priority failing constraint</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  priorityEnabled: <span class=\"hljs-literal\">true</span>,</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>\n              </div>\n              <h3 id=\"field-only\">Field only</h3>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>\n              </div>\n              <p>identifier used to group together inputs (e.g. radio buttons…)</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  multiple: <span class=\"hljs-literal\">null</span>,</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>\n              </div>\n              <p>identifier (or array of identifiers) used to validate only a select group of inputs</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  group: <span class=\"hljs-literal\">null</span>,</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>\n              </div>\n              <h3 id=\"ui\">UI</h3>\n<p>Enable\\Disable error messages</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  uiEnabled: <span class=\"hljs-literal\">true</span>,</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>\n              </div>\n              <p>Key events threshold before validation</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  validationThreshold: <span class=\"hljs-number\">3</span>,</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>\n              </div>\n              <p>Focused field on form validation error. ‘first’|’last’|’none’</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  focus: <span class=\"hljs-string\">'first'</span>,</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>\n              </div>\n              <p>event(s) that will trigger validation before first failure. eg: <code>input</code>…</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  trigger: <span class=\"hljs-literal\">false</span>,</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>\n              </div>\n              <p>event(s) that will trigger validation after first failure.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  triggerAfterFailure: <span class=\"hljs-string\">'input'</span>,</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>\n              </div>\n              <p>Class that would be added on every failing validation Parsley field</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  errorClass: <span class=\"hljs-string\">'parsley-error'</span>,</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-16\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>\n              </div>\n              <p>Same for success validation</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  successClass: <span class=\"hljs-string\">'parsley-success'</span>,</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-17\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>\n              </div>\n              <p>Return the <code>$element</code> that will receive these above success or error classes\nCould also be (and given directly from DOM) a valid selector like <code>&#39;#div&#39;</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  classHandler: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">Field</span>) </span>{},</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-18\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>\n              </div>\n              <p>Return the <code>$element</code> where errors will be appended\nCould also be (and given directly from DOM) a valid selector like <code>&#39;#div&#39;</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  errorsContainer: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">Field</span>) </span>{},</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-19\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>\n              </div>\n              <p>ul elem that would receive errors’ list</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  errorsWrapper: <span class=\"hljs-string\">'&lt;ul class=\"parsley-errors-list\"&gt;&lt;/ul&gt;'</span>,</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-20\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>\n              </div>\n              <p>li elem that would receive error message</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  errorTemplate: <span class=\"hljs-string\">'&lt;li&gt;&lt;/li&gt;'</span>\n};\n\n<span class=\"hljs-keyword\">export</span> <span class=\"hljs-keyword\">default</span> Defaults;</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n<script>var _gaq=_gaq||[];_gaq.push([\"_setAccount\",\"UA-37229467-1\"]);_gaq.push([\"_trackPageview\"]);(function(){var e=document.createElement(\"script\");e.type=\"text/javascript\";e.async=true;e.src=(\"https:\"==document.location.protocol?\"https://ssl\":\"http://www\")+\".google-analytics.com/ga.js\";var t=document.getElementsByTagName(\"script\")[0];t.parentNode.insertBefore(e,t)})();</script></body>\n</html>\n"
  },
  {
    "path": "doc/annotated-source/docco.css",
    "content": "/*--------------------- Typography ----------------------------*/\n\n@font-face {\n    font-family: 'aller-light';\n    src: url('public/fonts/aller-light.eot');\n    src: url('public/fonts/aller-light.eot?#iefix') format('embedded-opentype'),\n         url('public/fonts/aller-light.woff') format('woff'),\n         url('public/fonts/aller-light.ttf') format('truetype');\n    font-weight: normal;\n    font-style: normal;\n}\n\n@font-face {\n    font-family: 'aller-bold';\n    src: url('public/fonts/aller-bold.eot');\n    src: url('public/fonts/aller-bold.eot?#iefix') format('embedded-opentype'),\n         url('public/fonts/aller-bold.woff') format('woff'),\n         url('public/fonts/aller-bold.ttf') format('truetype');\n    font-weight: normal;\n    font-style: normal;\n}\n\n@font-face {\n    font-family: 'novecento-bold';\n    src: url('public/fonts/novecento-bold.eot');\n    src: url('public/fonts/novecento-bold.eot?#iefix') format('embedded-opentype'),\n         url('public/fonts/novecento-bold.woff') format('woff'),\n         url('public/fonts/novecento-bold.ttf') format('truetype');\n    font-weight: normal;\n    font-style: normal;\n}\n\n/*--------------------- Layout ----------------------------*/\nhtml { height: 100%; }\nbody {\n  font-family: \"aller-light\";\n  font-size: 14px;\n  line-height: 18px;\n  color: #30404f;\n  margin: 0; padding: 0;\n  height:100%;\n}\n#container { min-height: 100%; }\n\na {\n  color: #000;\n}\n\nb, strong {\n  font-weight: normal;\n  font-family: \"aller-bold\";\n}\n\np {\n  margin: 15px 0 0px;\n}\n  .annotation ul, .annotation ol {\n    margin: 25px 0;\n  }\n    .annotation ul li, .annotation ol li {\n      font-size: 14px;\n      line-height: 18px;\n      margin: 10px 0;\n    }\n\nh1, h2, h3, h4, h5, h6 {\n  color: #112233;\n  line-height: 1em;\n  font-weight: normal;\n  font-family: \"novecento-bold\";\n  text-transform: uppercase;\n  margin: 30px 0 15px 0;\n}\n\nh1 {\n  margin-top: 40px;\n}\n\nhr {\n  border: 0;\n  background: 1px #ddd;\n  height: 1px;\n  margin: 20px 0;\n}\n\npre, tt, code {\n  font-size: 12px; line-height: 16px;\n  font-family: Menlo, Monaco, Consolas, \"Lucida Console\", monospace;\n  margin: 0; padding: 0;\n}\n  .annotation pre {\n    display: block;\n    margin: 0;\n    padding: 7px 10px;\n    background: #fcfcfc;\n    -moz-box-shadow:    inset 0 0 10px rgba(0,0,0,0.1);\n    -webkit-box-shadow: inset 0 0 10px rgba(0,0,0,0.1);\n    box-shadow:         inset 0 0 10px rgba(0,0,0,0.1);\n    overflow-x: auto;\n  }\n    .annotation pre code {\n      border: 0;\n      padding: 0;\n      background: transparent;\n    }\n\n\nblockquote {\n  border-left: 5px solid #ccc;\n  margin: 0;\n  padding: 1px 0 1px 1em;\n}\n  .sections blockquote p {\n    font-family: Menlo, Consolas, Monaco, monospace;\n    font-size: 12px; line-height: 16px;\n    color: #999;\n    margin: 10px 0 0;\n    white-space: pre-wrap;\n  }\n\nul.sections {\n  list-style: none;\n  padding:0 0 5px 0;;\n  margin:0;\n}\n\n/*\n  Force border-box so that % widths fit the parent\n  container without overlap because of margin/padding.\n\n  More Info : http://www.quirksmode.org/css/box.html\n*/\nul.sections > li > div {\n  -moz-box-sizing: border-box;    /* firefox */\n  -ms-box-sizing: border-box;     /* ie */\n  -webkit-box-sizing: border-box; /* webkit */\n  -khtml-box-sizing: border-box;  /* konqueror */\n  box-sizing: border-box;         /* css3 */\n}\n\n\n/*---------------------- Jump Page -----------------------------*/\n#jump_to, #jump_page {\n  margin: 0;\n  background: white;\n  -webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777;\n  -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px;\n  font: 16px Arial;\n  cursor: pointer;\n  text-align: right;\n  list-style: none;\n}\n\n#jump_to a {\n  text-decoration: none;\n}\n\n#jump_to a.large {\n  display: none;\n}\n#jump_to a.small {\n  font-size: 22px;\n  font-weight: bold;\n  color: #676767;\n}\n\n#jump_to, #jump_wrapper {\n  position: fixed;\n  right: 0; top: 0;\n  padding: 10px 15px;\n  margin:0;\n}\n\n#jump_wrapper {\n  display: none;\n  padding:0;\n}\n\n#jump_to:hover #jump_wrapper {\n  display: block;\n}\n\n#jump_page {\n  padding: 5px 0 3px;\n  margin: 0 0 25px 25px;\n}\n\n#jump_page .source {\n  display: block;\n  padding: 15px;\n  text-decoration: none;\n  border-top: 1px solid #eee;\n}\n\n#jump_page .source:hover {\n  background: #f5f5ff;\n}\n\n#jump_page .source:first-child {\n}\n\n/*---------------------- Low resolutions (> 320px) ---------------------*/\n@media only screen and (min-width: 320px) {\n  .pilwrap { display: none; }\n\n  ul.sections > li > div {\n    display: block;\n    padding:5px 10px 0 10px;\n  }\n\n  ul.sections > li > div.annotation ul, ul.sections > li > div.annotation ol {\n    padding-left: 30px;\n  }\n\n  ul.sections > li > div.content {\n    overflow-x:auto;\n    -webkit-box-shadow: inset 0 0 5px #e5e5ee;\n    box-shadow: inset 0 0 5px #e5e5ee;\n    border: 1px solid #dedede;\n    margin:5px 10px 5px 10px;\n    padding-bottom: 5px;\n  }\n\n  ul.sections > li > div.annotation pre {\n    margin: 7px 0 7px;\n    padding-left: 15px;\n  }\n\n  ul.sections > li > div.annotation p tt, .annotation code {\n    background: #f8f8ff;\n    border: 1px solid #dedede;\n    font-size: 12px;\n    padding: 0 0.2em;\n  }\n}\n\n/*----------------------  (> 481px) ---------------------*/\n@media only screen and (min-width: 481px) {\n  #container {\n    position: relative;\n  }\n  body {\n    background-color: #F5F5FF;\n    font-size: 15px;\n    line-height: 21px;\n  }\n  pre, tt, code {\n    line-height: 18px;\n  }\n  p, ul, ol {\n    margin: 0 0 15px;\n  }\n\n\n  #jump_to {\n    padding: 5px 10px;\n  }\n  #jump_wrapper {\n    padding: 0;\n  }\n  #jump_to, #jump_page {\n    font: 10px Arial;\n    text-transform: uppercase;\n  }\n  #jump_page .source {\n    padding: 5px 10px;\n  }\n  #jump_to a.large {\n    display: inline-block;\n  }\n  #jump_to a.small {\n    display: none;\n  }\n\n\n\n  #background {\n    position: absolute;\n    top: 0; bottom: 0;\n    width: 350px;\n    background: #fff;\n    border-right: 1px solid #e5e5ee;\n    z-index: -1;\n  }\n\n  ul.sections > li > div.annotation ul, ul.sections > li > div.annotation ol {\n    padding-left: 40px;\n  }\n\n  ul.sections > li {\n    white-space: nowrap;\n  }\n\n  ul.sections > li > div {\n    display: inline-block;\n  }\n\n  ul.sections > li > div.annotation {\n    max-width: 350px;\n    min-width: 350px;\n    min-height: 5px;\n    padding: 13px;\n    overflow-x: hidden;\n    white-space: normal;\n    vertical-align: top;\n    text-align: left;\n  }\n  ul.sections > li > div.annotation pre {\n    margin: 15px 0 15px;\n    padding-left: 15px;\n  }\n\n  ul.sections > li > div.content {\n    padding: 13px;\n    vertical-align: top;\n    border: none;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n  }\n\n  .pilwrap {\n    position: relative;\n    display: inline;\n  }\n\n  .pilcrow {\n    font: 12px Arial;\n    text-decoration: none;\n    color: #454545;\n    position: absolute;\n    top: 3px; left: -20px;\n    padding: 1px 2px;\n    opacity: 0;\n    -webkit-transition: opacity 0.2s linear;\n  }\n    .for-h1 .pilcrow {\n      top: 47px;\n    }\n    .for-h2 .pilcrow, .for-h3 .pilcrow, .for-h4 .pilcrow {\n      top: 35px;\n    }\n\n  ul.sections > li > div.annotation:hover .pilcrow {\n    opacity: 1;\n  }\n}\n\n/*---------------------- (> 1025px) ---------------------*/\n@media only screen and (min-width: 1025px) {\n\n  body {\n    font-size: 16px;\n    line-height: 24px;\n  }\n\n  #background {\n    width: 525px;\n  }\n  ul.sections > li > div.annotation {\n    max-width: 525px;\n    min-width: 525px;\n    padding: 10px 25px 1px 50px;\n  }\n  ul.sections > li > div.content {\n    padding: 9px 15px 16px 25px;\n  }\n}\n\n/*---------------------- Syntax Highlighting -----------------------------*/\n\ntd.linenos { background-color: #f0f0f0; padding-right: 10px; }\nspan.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }\n/*\n\ngithub.com style (c) Vasily Polovnyov <vast@whiteants.net>\n\n*/\n\npre code {\n  display: block; padding: 0.5em;\n  color: #000;\n  background: #f8f8ff\n}\n\npre .hljs-comment,\npre .hljs-template_comment,\npre .hljs-diff .hljs-header,\npre .hljs-javadoc {\n  color: #408080;\n  font-style: italic\n}\n\npre .hljs-keyword,\npre .hljs-assignment,\npre .hljs-literal,\npre .hljs-css .hljs-rule .hljs-keyword,\npre .hljs-winutils,\npre .hljs-javascript .hljs-title,\npre .hljs-lisp .hljs-title,\npre .hljs-subst {\n  color: #954121;\n  /*font-weight: bold*/\n}\n\npre .hljs-number,\npre .hljs-hexcolor {\n  color: #40a070\n}\n\npre .hljs-string,\npre .hljs-tag .hljs-value,\npre .hljs-phpdoc,\npre .hljs-tex .hljs-formula {\n  color: #219161;\n}\n\npre .hljs-title,\npre .hljs-id {\n  color: #19469D;\n}\npre .hljs-params {\n  color: #00F;\n}\n\npre .hljs-javascript .hljs-title,\npre .hljs-lisp .hljs-title,\npre .hljs-subst {\n  font-weight: normal\n}\n\npre .hljs-class .hljs-title,\npre .hljs-haskell .hljs-label,\npre .hljs-tex .hljs-command {\n  color: #458;\n  font-weight: bold\n}\n\npre .hljs-tag,\npre .hljs-tag .hljs-title,\npre .hljs-rules .hljs-property,\npre .hljs-django .hljs-tag .hljs-keyword {\n  color: #000080;\n  font-weight: normal\n}\n\npre .hljs-attribute,\npre .hljs-variable,\npre .hljs-instancevar,\npre .hljs-lisp .hljs-body {\n  color: #008080\n}\n\npre .hljs-regexp {\n  color: #B68\n}\n\npre .hljs-class {\n  color: #458;\n  font-weight: bold\n}\n\npre .hljs-symbol,\npre .hljs-ruby .hljs-symbol .hljs-string,\npre .hljs-ruby .hljs-symbol .hljs-keyword,\npre .hljs-ruby .hljs-symbol .hljs-keymethods,\npre .hljs-lisp .hljs-keyword,\npre .hljs-tex .hljs-special,\npre .hljs-input_number {\n  color: #990073\n}\n\npre .hljs-builtin,\npre .hljs-constructor,\npre .hljs-built_in,\npre .hljs-lisp .hljs-title {\n  color: #0086b3\n}\n\npre .hljs-preprocessor,\npre .hljs-pi,\npre .hljs-doctype,\npre .hljs-shebang,\npre .hljs-cdata {\n  color: #999;\n  font-weight: bold\n}\n\npre .hljs-deletion {\n  background: #fdd\n}\n\npre .hljs-addition {\n  background: #dfd\n}\n\npre .hljs-diff .hljs-change {\n  background: #0086b3\n}\n\npre .hljs-chunk {\n  color: #aaa\n}\n\npre .hljs-tex .hljs-formula {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "doc/annotated-source/factory.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>factory.js</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page\"><a class=\"source\" href=\"../index.html\">&lt;&lt;&lt; back to documentation</a>\n            \n              \n              <a class=\"source\" href=\"base.html\">\n                base.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"constraint.html\">\n                constraint.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"defaults.html\">\n                defaults.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"factory.html\">\n                factory.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"field.html\">\n                field.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"form.html\">\n                form.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"main.html\">\n                main.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"multiple.html\">\n                multiple.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"pubsub.html\">\n                pubsub.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"remote.html\">\n                remote.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"ui.html\">\n                ui.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"utils.html\">\n                utils.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator.html\">\n                validator.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator_registry.html\">\n                validator_registry.js\n              </a>\n            \n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>factory.js</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              \n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">import</span> $ <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'jquery'</span>;\n<span class=\"hljs-keyword\">import</span> Utils <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./utils'</span>;\n<span class=\"hljs-keyword\">import</span> Base <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./base'</span>;\n<span class=\"hljs-keyword\">import</span> Form <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./form'</span>;\n<span class=\"hljs-keyword\">import</span> Field <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./field'</span>;\n<span class=\"hljs-keyword\">import</span> Multiple <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./multiple'</span>;\n\n<span class=\"hljs-keyword\">var</span> Factory = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">element, options, parsleyFormInstance</span>) </span>{\n  <span class=\"hljs-keyword\">this</span>.element = element;\n  <span class=\"hljs-keyword\">this</span>.$element = $(element);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <p>If the element has already been bound, returns its saved Parsley instance</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  <span class=\"hljs-keyword\">var</span> savedparsleyFormInstance = <span class=\"hljs-keyword\">this</span>.$element.data(<span class=\"hljs-string\">'Parsley'</span>);\n  <span class=\"hljs-keyword\">if</span> (savedparsleyFormInstance) {</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <p>If the saved instance has been bound without a Form parent and there is one given in this call, add it</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'undefined'</span> !== <span class=\"hljs-keyword\">typeof</span> parsleyFormInstance &amp;&amp; savedparsleyFormInstance.parent === <span class=\"hljs-built_in\">window</span>.Parsley) {\n      savedparsleyFormInstance.parent = parsleyFormInstance;\n      savedparsleyFormInstance._resetOptions(savedparsleyFormInstance.options);\n    }\n\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'object'</span> === <span class=\"hljs-keyword\">typeof</span> options) {\n      <span class=\"hljs-built_in\">Object</span>.assign(savedparsleyFormInstance.options, options);\n    }\n\n    <span class=\"hljs-keyword\">return</span> savedparsleyFormInstance;\n  }</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              <p>Parsley must be instantiated with a DOM element or jQuery $element</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  <span class=\"hljs-keyword\">if</span> (!<span class=\"hljs-keyword\">this</span>.$element.length)\n    <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Error</span>(<span class=\"hljs-string\">'You must bind Parsley on an existing element.'</span>);\n\n  <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'undefined'</span> !== <span class=\"hljs-keyword\">typeof</span> parsleyFormInstance &amp;&amp; <span class=\"hljs-string\">'Form'</span> !== parsleyFormInstance.__class__)\n    <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Error</span>(<span class=\"hljs-string\">'Parent instance must be a Form instance'</span>);\n\n  <span class=\"hljs-keyword\">this</span>.parent = parsleyFormInstance || <span class=\"hljs-built_in\">window</span>.Parsley;\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.init(options);\n};\n\nFactory.prototype = {\n  <span class=\"hljs-attr\">init</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">options</span>) </span>{\n    <span class=\"hljs-keyword\">this</span>.__class__ = <span class=\"hljs-string\">'Parsley'</span>;\n    <span class=\"hljs-keyword\">this</span>.__version__ = <span class=\"hljs-string\">'VERSION'</span>;\n    <span class=\"hljs-keyword\">this</span>.__id__ = Utils.generateID();</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <p>Pre-compute options</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">this</span>._resetOptions(options);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p>A Form instance is obviously a <code>&lt;form&gt;</code> element but also every node that is not an input and has the <code>data-parsley-validate</code> attribute</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-keyword\">this</span>.element.nodeName === <span class=\"hljs-string\">'FORM'</span> || (Utils.checkAttr(<span class=\"hljs-keyword\">this</span>.element, <span class=\"hljs-keyword\">this</span>.options.namespace, <span class=\"hljs-string\">'validate'</span>) &amp;&amp; !<span class=\"hljs-keyword\">this</span>.$element.is(<span class=\"hljs-keyword\">this</span>.options.inputs)))\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.bind(<span class=\"hljs-string\">'parsleyForm'</span>);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>\n              </div>\n              <p>Every other element is bound as a <code>Field</code> or <code>FieldMultiple</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.isMultiple() ? <span class=\"hljs-keyword\">this</span>.handleMultiple() : <span class=\"hljs-keyword\">this</span>.bind(<span class=\"hljs-string\">'parsleyField'</span>);\n  },\n\n  <span class=\"hljs-attr\">isMultiple</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">var</span> type = Utils.getType(<span class=\"hljs-keyword\">this</span>.element);\n    <span class=\"hljs-keyword\">return</span> ((type === <span class=\"hljs-string\">'radio'</span> || type === <span class=\"hljs-string\">'checkbox'</span>) ||\n      (<span class=\"hljs-keyword\">this</span>.element.nodeName === <span class=\"hljs-string\">'SELECT'</span> &amp;&amp; <span class=\"hljs-literal\">null</span> !== <span class=\"hljs-keyword\">this</span>.element.getAttribute(<span class=\"hljs-string\">'multiple'</span>)));\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>\n              </div>\n              <p>Multiples fields are a real nightmare :(\nMaybe some refactoring would be appreciated here…</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  handleMultiple: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">var</span> name;\n    <span class=\"hljs-keyword\">var</span> multiple;\n    <span class=\"hljs-keyword\">var</span> parsleyMultipleInstance;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>\n              </div>\n              <p>Handle multiple name</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">this</span>.options.multiple = <span class=\"hljs-keyword\">this</span>.options.multiple ||\n      (name = <span class=\"hljs-keyword\">this</span>.element.getAttribute(<span class=\"hljs-string\">'name'</span>)) ||\n      <span class=\"hljs-keyword\">this</span>.element.getAttribute(<span class=\"hljs-string\">'id'</span>);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>\n              </div>\n              <p>Special select multiple input</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-keyword\">this</span>.element.nodeName === <span class=\"hljs-string\">'SELECT'</span> &amp;&amp; <span class=\"hljs-literal\">null</span> !== <span class=\"hljs-keyword\">this</span>.element.getAttribute(<span class=\"hljs-string\">'multiple'</span>)) {\n      <span class=\"hljs-keyword\">this</span>.options.multiple = <span class=\"hljs-keyword\">this</span>.options.multiple || <span class=\"hljs-keyword\">this</span>.__id__;\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.bind(<span class=\"hljs-string\">'parsleyFieldMultiple'</span>);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>\n              </div>\n              <p>Else for radio / checkboxes, we need a <code>name</code> or <code>data-parsley-multiple</code> to properly bind it</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    } <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> (!<span class=\"hljs-keyword\">this</span>.options.multiple) {\n      Utils.warn(<span class=\"hljs-string\">'To be bound by Parsley, a radio, a checkbox and a multiple select input must have either a name or a multiple option.'</span>, <span class=\"hljs-keyword\">this</span>.$element);\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>;\n    }</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>\n              </div>\n              <p>Remove special chars</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">this</span>.options.multiple = <span class=\"hljs-keyword\">this</span>.options.multiple.replace(<span class=\"hljs-regexp\">/(:|\\.|\\[|\\]|\\{|\\}|\\$)/g</span>, <span class=\"hljs-string\">''</span>);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>\n              </div>\n              <p>Add proper <code>data-parsley-multiple</code> to siblings if we have a valid multiple name</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (name) {\n      $(<span class=\"hljs-string\">'input[name=\"'</span> + name + <span class=\"hljs-string\">'\"]'</span>).each(<span class=\"hljs-function\">(<span class=\"hljs-params\">i, input</span>) =&gt;</span> {\n        <span class=\"hljs-keyword\">var</span> type = Utils.getType(input);\n        <span class=\"hljs-keyword\">if</span> ((type === <span class=\"hljs-string\">'radio'</span> || type === <span class=\"hljs-string\">'checkbox'</span>))\n          input.setAttribute(<span class=\"hljs-keyword\">this</span>.options.namespace + <span class=\"hljs-string\">'multiple'</span>, <span class=\"hljs-keyword\">this</span>.options.multiple);\n      });\n    }</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>\n              </div>\n              <p>Check here if we don’t already have a related multiple instance saved</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">var</span> $previouslyRelated = <span class=\"hljs-keyword\">this</span>._findRelated();\n    <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">var</span> i = <span class=\"hljs-number\">0</span>; i &lt; $previouslyRelated.length; i++) {\n      parsleyMultipleInstance = $($previouslyRelated.get(i)).data(<span class=\"hljs-string\">'Parsley'</span>);\n      <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'undefined'</span> !== <span class=\"hljs-keyword\">typeof</span> parsleyMultipleInstance) {\n\n        <span class=\"hljs-keyword\">if</span> (!<span class=\"hljs-keyword\">this</span>.$element.data(<span class=\"hljs-string\">'FieldMultiple'</span>)) {\n          parsleyMultipleInstance.addElement(<span class=\"hljs-keyword\">this</span>.$element);\n        }\n\n        <span class=\"hljs-keyword\">break</span>;\n      }\n    }</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>\n              </div>\n              <p>Create a secret Field instance for every multiple field. It will be stored in <code>data(&#39;FieldMultiple&#39;)</code>\nAnd will be useful later to access classic <code>Field</code> stuff while being in a <code>FieldMultiple</code> instance</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">this</span>.bind(<span class=\"hljs-string\">'parsleyField'</span>, <span class=\"hljs-literal\">true</span>);\n\n    <span class=\"hljs-keyword\">return</span> parsleyMultipleInstance || <span class=\"hljs-keyword\">this</span>.bind(<span class=\"hljs-string\">'parsleyFieldMultiple'</span>);\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-16\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>\n              </div>\n              <p>Return proper <code>Form</code>, <code>Field</code> or <code>FieldMultiple</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  bind: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">type, doNotStore</span>) </span>{\n    <span class=\"hljs-keyword\">var</span> parsleyInstance;\n\n    <span class=\"hljs-keyword\">switch</span> (type) {\n      <span class=\"hljs-keyword\">case</span> <span class=\"hljs-string\">'parsleyForm'</span>:\n        parsleyInstance = $.extend(\n          <span class=\"hljs-keyword\">new</span> Form(<span class=\"hljs-keyword\">this</span>.element, <span class=\"hljs-keyword\">this</span>.domOptions, <span class=\"hljs-keyword\">this</span>.options),\n          <span class=\"hljs-keyword\">new</span> Base(),\n          <span class=\"hljs-built_in\">window</span>.ParsleyExtend\n        )._bindFields();\n        <span class=\"hljs-keyword\">break</span>;\n      <span class=\"hljs-keyword\">case</span> <span class=\"hljs-string\">'parsleyField'</span>:\n        parsleyInstance = $.extend(\n          <span class=\"hljs-keyword\">new</span> Field(<span class=\"hljs-keyword\">this</span>.element, <span class=\"hljs-keyword\">this</span>.domOptions, <span class=\"hljs-keyword\">this</span>.options, <span class=\"hljs-keyword\">this</span>.parent),\n          <span class=\"hljs-keyword\">new</span> Base(),\n          <span class=\"hljs-built_in\">window</span>.ParsleyExtend\n        );\n        <span class=\"hljs-keyword\">break</span>;\n      <span class=\"hljs-keyword\">case</span> <span class=\"hljs-string\">'parsleyFieldMultiple'</span>:\n        parsleyInstance = $.extend(\n          <span class=\"hljs-keyword\">new</span> Field(<span class=\"hljs-keyword\">this</span>.element, <span class=\"hljs-keyword\">this</span>.domOptions, <span class=\"hljs-keyword\">this</span>.options, <span class=\"hljs-keyword\">this</span>.parent),\n          <span class=\"hljs-keyword\">new</span> Multiple(),\n          <span class=\"hljs-keyword\">new</span> Base(),\n          <span class=\"hljs-built_in\">window</span>.ParsleyExtend\n        )._init();\n        <span class=\"hljs-keyword\">break</span>;\n      <span class=\"hljs-keyword\">default</span>:\n        <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Error</span>(type + <span class=\"hljs-string\">'is not a supported Parsley type'</span>);\n    }\n\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-keyword\">this</span>.options.multiple)\n      Utils.setAttr(<span class=\"hljs-keyword\">this</span>.element, <span class=\"hljs-keyword\">this</span>.options.namespace, <span class=\"hljs-string\">'multiple'</span>, <span class=\"hljs-keyword\">this</span>.options.multiple);\n\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'undefined'</span> !== <span class=\"hljs-keyword\">typeof</span> doNotStore) {\n      <span class=\"hljs-keyword\">this</span>.$element.data(<span class=\"hljs-string\">'FieldMultiple'</span>, parsleyInstance);\n\n      <span class=\"hljs-keyword\">return</span> parsleyInstance;\n    }</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-17\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>\n              </div>\n              <p>Store the freshly bound instance in a DOM element for later access using jQuery <code>data()</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">this</span>.$element.data(<span class=\"hljs-string\">'Parsley'</span>, parsleyInstance);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-18\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>\n              </div>\n              <p>Tell the world we have a new Form or Field instance!</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    parsleyInstance._actualizeTriggers();\n    parsleyInstance._trigger(<span class=\"hljs-string\">'init'</span>);\n\n    <span class=\"hljs-keyword\">return</span> parsleyInstance;\n  }\n};\n\n<span class=\"hljs-keyword\">export</span> <span class=\"hljs-keyword\">default</span> Factory;</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n<script>var _gaq=_gaq||[];_gaq.push([\"_setAccount\",\"UA-37229467-1\"]);_gaq.push([\"_trackPageview\"]);(function(){var e=document.createElement(\"script\");e.type=\"text/javascript\";e.async=true;e.src=(\"https:\"==document.location.protocol?\"https://ssl\":\"http://www\")+\".google-analytics.com/ga.js\";var t=document.getElementsByTagName(\"script\")[0];t.parentNode.insertBefore(e,t)})();</script></body>\n</html>\n"
  },
  {
    "path": "doc/annotated-source/field.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>field.js</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page\"><a class=\"source\" href=\"../index.html\">&lt;&lt;&lt; back to documentation</a>\n            \n              \n              <a class=\"source\" href=\"base.html\">\n                base.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"constraint.html\">\n                constraint.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"defaults.html\">\n                defaults.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"factory.html\">\n                factory.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"field.html\">\n                field.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"form.html\">\n                form.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"main.html\">\n                main.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"multiple.html\">\n                multiple.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"pubsub.html\">\n                pubsub.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"remote.html\">\n                remote.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"ui.html\">\n                ui.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"utils.html\">\n                utils.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator.html\">\n                validator.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator_registry.html\">\n                validator_registry.js\n              </a>\n            \n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>field.js</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              \n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">import</span> $ <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'jquery'</span>;\n<span class=\"hljs-keyword\">import</span> Constraint <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./constraint'</span>;\n<span class=\"hljs-keyword\">import</span> UI <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./ui'</span>;\n<span class=\"hljs-keyword\">import</span> Utils <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./utils'</span>;\n\n<span class=\"hljs-keyword\">var</span> Field = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">field, domOptions, options, parsleyFormInstance</span>) </span>{\n  <span class=\"hljs-keyword\">this</span>.__class__ = <span class=\"hljs-string\">'Field'</span>;\n\n  <span class=\"hljs-keyword\">this</span>.element = field;\n  <span class=\"hljs-keyword\">this</span>.$element = $(field);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <p>Set parent if we have one</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'undefined'</span> !== <span class=\"hljs-keyword\">typeof</span> parsleyFormInstance) {\n    <span class=\"hljs-keyword\">this</span>.parent = parsleyFormInstance;\n  }\n\n  <span class=\"hljs-keyword\">this</span>.options = options;\n  <span class=\"hljs-keyword\">this</span>.domOptions = domOptions;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <p>Initialize some properties</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  <span class=\"hljs-keyword\">this</span>.constraints = [];\n  <span class=\"hljs-keyword\">this</span>.constraintsByName = {};\n  <span class=\"hljs-keyword\">this</span>.validationResult = <span class=\"hljs-literal\">true</span>;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              <p>Bind constraints</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  <span class=\"hljs-keyword\">this</span>._bindConstraints();\n};\n\n<span class=\"hljs-keyword\">var</span> statusMapping = {<span class=\"hljs-attr\">pending</span>: <span class=\"hljs-literal\">null</span>, <span class=\"hljs-attr\">resolved</span>: <span class=\"hljs-literal\">true</span>, <span class=\"hljs-attr\">rejected</span>: <span class=\"hljs-literal\">false</span>};\n\nField.prototype = {</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <h1 id=\"public-api\">Public API</h1>\n<p>Validate field and trigger some events for mainly <code>UI</code>\n@returns <code>true</code>, an array of the validators that failed, or\n<code>null</code> if validation is not finished. Prefer using whenValidate</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  validate: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">options</span>) </span>{\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-built_in\">arguments</span>.length &gt;= <span class=\"hljs-number\">1</span> &amp;&amp; !$.isPlainObject(options)) {\n      Utils.warnOnce(<span class=\"hljs-string\">'Calling validate on a parsley field without passing arguments as an object is deprecated.'</span>);\n      options = {options};\n    }\n    <span class=\"hljs-keyword\">var</span> promise = <span class=\"hljs-keyword\">this</span>.whenValidate(options);\n    <span class=\"hljs-keyword\">if</span> (!promise)  <span class=\"hljs-comment\">// If excluded with `group` option</span>\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">true</span>;\n    <span class=\"hljs-keyword\">switch</span> (promise.state()) {\n      <span class=\"hljs-keyword\">case</span> <span class=\"hljs-string\">'pending'</span>: <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">null</span>;\n      <span class=\"hljs-keyword\">case</span> <span class=\"hljs-string\">'resolved'</span>: <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">true</span>;\n      <span class=\"hljs-keyword\">case</span> <span class=\"hljs-string\">'rejected'</span>: <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.validationResult;\n    }\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p>Validate field and trigger some events for mainly <code>UI</code>\n@returns a promise that succeeds only when all validations do\nor <code>undefined</code> if field is not in the given <code>group</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  whenValidate: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">{force, group} =  {}</span>) </span>{</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>\n              </div>\n              <p>do not validate a field if not the same as given validation group</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">this</span>.refresh();\n    <span class=\"hljs-keyword\">if</span> (group &amp;&amp; !<span class=\"hljs-keyword\">this</span>._isInGroup(group))\n      <span class=\"hljs-keyword\">return</span>;\n\n    <span class=\"hljs-keyword\">this</span>.value = <span class=\"hljs-keyword\">this</span>.getValue();</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>\n              </div>\n              <p>Field Validate event. <code>this.value</code> could be altered for custom needs</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">this</span>._trigger(<span class=\"hljs-string\">'validate'</span>);\n\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.whenValid({force, <span class=\"hljs-attr\">value</span>: <span class=\"hljs-keyword\">this</span>.value, <span class=\"hljs-attr\">_refreshed</span>: <span class=\"hljs-literal\">true</span>})\n      .always(<span class=\"hljs-function\"><span class=\"hljs-params\">()</span> =&gt;</span> { <span class=\"hljs-keyword\">this</span>._reflowUI(); })\n      .done(<span class=\"hljs-function\"><span class=\"hljs-params\">()</span> =&gt;</span>   { <span class=\"hljs-keyword\">this</span>._trigger(<span class=\"hljs-string\">'success'</span>); })\n      .fail(<span class=\"hljs-function\"><span class=\"hljs-params\">()</span> =&gt;</span>   { <span class=\"hljs-keyword\">this</span>._trigger(<span class=\"hljs-string\">'error'</span>); })\n      .always(<span class=\"hljs-function\"><span class=\"hljs-params\">()</span> =&gt;</span> { <span class=\"hljs-keyword\">this</span>._trigger(<span class=\"hljs-string\">'validated'</span>); })\n      .pipe(...this._pipeAccordingToValidationResult());\n  },\n\n  <span class=\"hljs-attr\">hasConstraints</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span> !== <span class=\"hljs-keyword\">this</span>.constraints.length;\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>\n              </div>\n              <p>An empty optional field does not need validation</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  needsValidation: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">value</span>) </span>{\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'undefined'</span> === <span class=\"hljs-keyword\">typeof</span> value)\n      value = <span class=\"hljs-keyword\">this</span>.getValue();</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>\n              </div>\n              <p>If a field is empty and not required, it is valid\nExcept if <code>data-parsley-validate-if-empty</code> explicitely added, useful for some custom validators</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (!value.length &amp;&amp; !<span class=\"hljs-keyword\">this</span>._isRequired() &amp;&amp; <span class=\"hljs-string\">'undefined'</span> === <span class=\"hljs-keyword\">typeof</span> <span class=\"hljs-keyword\">this</span>.options.validateIfEmpty)\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">false</span>;\n\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">true</span>;\n  },\n\n  <span class=\"hljs-attr\">_isInGroup</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">group</span>) </span>{\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-built_in\">Array</span>.isArray(<span class=\"hljs-keyword\">this</span>.options.group))\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">-1</span> !== $.inArray(group, <span class=\"hljs-keyword\">this</span>.options.group);\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.options.group === group;\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>\n              </div>\n              <p>Just validate field. Do not trigger any event.\nReturns <code>true</code> iff all constraints pass, <code>false</code> if there are failures,\nor <code>null</code> if the result can not be determined yet (depends on a promise)\nSee also <code>whenValid</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  isValid: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">options</span>) </span>{\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-built_in\">arguments</span>.length &gt;= <span class=\"hljs-number\">1</span> &amp;&amp; !$.isPlainObject(options)) {\n      Utils.warnOnce(<span class=\"hljs-string\">'Calling isValid on a parsley field without passing arguments as an object is deprecated.'</span>);\n      <span class=\"hljs-keyword\">var</span> [force, value] = <span class=\"hljs-built_in\">arguments</span>;\n      options = {force, value};\n    }\n    <span class=\"hljs-keyword\">var</span> promise = <span class=\"hljs-keyword\">this</span>.whenValid(options);\n    <span class=\"hljs-keyword\">if</span> (!promise) <span class=\"hljs-comment\">// Excluded via `group`</span>\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">true</span>;\n    <span class=\"hljs-keyword\">return</span> statusMapping[promise.state()];\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>\n              </div>\n              <p>Just validate field. Do not trigger any event.\n@returns a promise that succeeds only when all validations do\nor <code>undefined</code> if the field is not in the given <code>group</code>.\nThe argument <code>force</code> will force validation of empty fields.\nIf a <code>value</code> is given, it will be validated instead of the value of the input.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  whenValid: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">{force = false, value, group, _refreshed} = {}</span>) </span>{</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>\n              </div>\n              <p>Recompute options and rebind constraints to have latest changes</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (!_refreshed)\n      <span class=\"hljs-keyword\">this</span>.refresh();</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>\n              </div>\n              <p>do not validate a field if not the same as given validation group</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (group &amp;&amp; !<span class=\"hljs-keyword\">this</span>._isInGroup(group))\n      <span class=\"hljs-keyword\">return</span>;\n\n    <span class=\"hljs-keyword\">this</span>.validationResult = <span class=\"hljs-literal\">true</span>;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>\n              </div>\n              <p>A field without constraint is valid</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (!<span class=\"hljs-keyword\">this</span>.hasConstraints())\n      <span class=\"hljs-keyword\">return</span> $.when();</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-16\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>\n              </div>\n              <p>Value could be passed as argument, needed to add more power to ‘field:validate’</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'undefined'</span> === <span class=\"hljs-keyword\">typeof</span> value || <span class=\"hljs-literal\">null</span> === value)\n      value = <span class=\"hljs-keyword\">this</span>.getValue();\n\n    <span class=\"hljs-keyword\">if</span> (!<span class=\"hljs-keyword\">this</span>.needsValidation(value) &amp;&amp; <span class=\"hljs-literal\">true</span> !== force)\n      <span class=\"hljs-keyword\">return</span> $.when();\n\n    <span class=\"hljs-keyword\">var</span> groupedConstraints = <span class=\"hljs-keyword\">this</span>._getGroupedConstraints();\n    <span class=\"hljs-keyword\">var</span> promises = [];\n    $.each(groupedConstraints, (_, constraints) =&gt; {</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-17\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>\n              </div>\n              <p>Process one group of constraints at a time, we validate the constraints\nand combine the promises together.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">var</span> promise = Utils.all(\n        $.map(constraints, constraint =&gt; <span class=\"hljs-keyword\">this</span>._validateConstraint(value, constraint))\n      );\n      promises.push(promise);\n      <span class=\"hljs-keyword\">if</span> (promise.state() === <span class=\"hljs-string\">'rejected'</span>)\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">false</span>; <span class=\"hljs-comment\">// Interrupt processing if a group has already failed</span>\n    });\n    <span class=\"hljs-keyword\">return</span> Utils.all(promises);\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-18\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>\n              </div>\n              <p>@returns a promise</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  _validateConstraint: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">value, constraint</span>) </span>{\n    <span class=\"hljs-keyword\">var</span> result = constraint.validate(value, <span class=\"hljs-keyword\">this</span>);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-19\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>\n              </div>\n              <p>Map false to a failed promise</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-literal\">false</span> === result)\n      result = $.Deferred().reject();</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-20\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>\n              </div>\n              <p>Make sure we return a promise and that we record failures</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">return</span> Utils.all([result]).fail(<span class=\"hljs-function\"><span class=\"hljs-params\">errorMessage</span> =&gt;</span> {\n      <span class=\"hljs-keyword\">if</span> (!(<span class=\"hljs-keyword\">this</span>.validationResult <span class=\"hljs-keyword\">instanceof</span> <span class=\"hljs-built_in\">Array</span>))\n        <span class=\"hljs-keyword\">this</span>.validationResult = [];\n      <span class=\"hljs-keyword\">this</span>.validationResult.push({\n        <span class=\"hljs-attr\">assert</span>: constraint,\n        <span class=\"hljs-attr\">errorMessage</span>: <span class=\"hljs-string\">'string'</span> === <span class=\"hljs-keyword\">typeof</span> errorMessage &amp;&amp; errorMessage\n      });\n    });\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-21\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>\n              </div>\n              <p>@returns Parsley field computed value that could be overrided or configured in DOM</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  getValue: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">var</span> value;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-22\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-22\">&#182;</a>\n              </div>\n              <p>Value could be overriden in DOM or with explicit options</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'function'</span> === <span class=\"hljs-keyword\">typeof</span> <span class=\"hljs-keyword\">this</span>.options.value)\n      value = <span class=\"hljs-keyword\">this</span>.options.value(<span class=\"hljs-keyword\">this</span>);\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'undefined'</span> !== <span class=\"hljs-keyword\">typeof</span> <span class=\"hljs-keyword\">this</span>.options.value)\n      value = <span class=\"hljs-keyword\">this</span>.options.value;\n    <span class=\"hljs-keyword\">else</span>\n      value = <span class=\"hljs-keyword\">this</span>.$element.val();</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-23\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-23\">&#182;</a>\n              </div>\n              <p>Handle wrong DOM or configurations</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'undefined'</span> === <span class=\"hljs-keyword\">typeof</span> value || <span class=\"hljs-literal\">null</span> === value)\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">''</span>;\n\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>._handleWhitespace(value);\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-24\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-24\">&#182;</a>\n              </div>\n              <p>Reset UI</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  reset: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">this</span>._resetUI();\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>._trigger(<span class=\"hljs-string\">'reset'</span>);\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-25\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-25\">&#182;</a>\n              </div>\n              <p>Destroy Parsley instance (+ UI)</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  destroy: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-26\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-26\">&#182;</a>\n              </div>\n              <p>Field case: emit destroy event to clean UI and then destroy stored instance</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">this</span>._destroyUI();\n    <span class=\"hljs-keyword\">this</span>.$element.removeData(<span class=\"hljs-string\">'Parsley'</span>);\n    <span class=\"hljs-keyword\">this</span>.$element.removeData(<span class=\"hljs-string\">'FieldMultiple'</span>);\n    <span class=\"hljs-keyword\">this</span>._trigger(<span class=\"hljs-string\">'destroy'</span>);\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-27\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-27\">&#182;</a>\n              </div>\n              <p>Actualize options and rebind constraints</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  refresh: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">this</span>._refreshConstraints();\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>;\n  },\n\n  <span class=\"hljs-attr\">_refreshConstraints</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.actualizeOptions()._bindConstraints();\n  },\n\n  <span class=\"hljs-attr\">refreshConstraints</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\"></span>) </span>{\n    Utils.warnOnce(<span class=\"hljs-string\">\"Parsley's refreshConstraints is deprecated. Please use refresh\"</span>);\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.refresh();\n  },\n\n  <span class=\"hljs-comment\">/**\n  * Add a new constraint to a field\n  *\n  * @param {String}   name\n  * @param {Mixed}    requirements      optional\n  * @param {Number}   priority          optional\n  * @param {Boolean}  isDomConstraint   optional\n  */</span>\n  <span class=\"hljs-attr\">addConstraint</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">name, requirements, priority, isDomConstraint</span>) </span>{\n\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-built_in\">window</span>.Parsley._validatorRegistry.validators[name]) {\n      <span class=\"hljs-keyword\">var</span> constraint = <span class=\"hljs-keyword\">new</span> Constraint(<span class=\"hljs-keyword\">this</span>, name, requirements, priority, isDomConstraint);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-28\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-28\">&#182;</a>\n              </div>\n              <p>if constraint already exist, delete it and push new version</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'undefined'</span> !== <span class=\"hljs-keyword\">this</span>.constraintsByName[constraint.name])\n        <span class=\"hljs-keyword\">this</span>.removeConstraint(constraint.name);\n\n      <span class=\"hljs-keyword\">this</span>.constraints.push(constraint);\n      <span class=\"hljs-keyword\">this</span>.constraintsByName[constraint.name] = constraint;\n    }\n\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>;\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-29\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-29\">&#182;</a>\n              </div>\n              <p>Remove a constraint</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  removeConstraint: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">name</span>) </span>{\n    <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">var</span> i = <span class=\"hljs-number\">0</span>; i &lt; <span class=\"hljs-keyword\">this</span>.constraints.length; i++)\n      <span class=\"hljs-keyword\">if</span> (name === <span class=\"hljs-keyword\">this</span>.constraints[i].name) {\n        <span class=\"hljs-keyword\">this</span>.constraints.splice(i, <span class=\"hljs-number\">1</span>);\n        <span class=\"hljs-keyword\">break</span>;\n      }\n    <span class=\"hljs-keyword\">delete</span> <span class=\"hljs-keyword\">this</span>.constraintsByName[name];\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>;\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-30\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-30\">&#182;</a>\n              </div>\n              <p>Update a constraint (Remove + re-add)</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  updateConstraint: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">name, parameters, priority</span>) </span>{\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.removeConstraint(name)\n      .addConstraint(name, parameters, priority);\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-31\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-31\">&#182;</a>\n              </div>\n              <h1 id=\"internals\">Internals</h1>\n\n            </div>\n            \n        </li>\n        \n        \n        <li id=\"section-32\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-32\">&#182;</a>\n              </div>\n              <p>Internal only.\nBind constraints from config + options + DOM</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  _bindConstraints: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">var</span> constraints = [];\n    <span class=\"hljs-keyword\">var</span> constraintsByName = {};</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-33\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-33\">&#182;</a>\n              </div>\n              <p>clean all existing DOM constraints to only keep javascript user constraints</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">var</span> i = <span class=\"hljs-number\">0</span>; i &lt; <span class=\"hljs-keyword\">this</span>.constraints.length; i++)\n      <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-literal\">false</span> === <span class=\"hljs-keyword\">this</span>.constraints[i].isDomConstraint) {\n        constraints.push(<span class=\"hljs-keyword\">this</span>.constraints[i]);\n        constraintsByName[<span class=\"hljs-keyword\">this</span>.constraints[i].name] = <span class=\"hljs-keyword\">this</span>.constraints[i];\n      }\n\n    <span class=\"hljs-keyword\">this</span>.constraints = constraints;\n    <span class=\"hljs-keyword\">this</span>.constraintsByName = constraintsByName;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-34\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-34\">&#182;</a>\n              </div>\n              <p>then re-add Parsley DOM-API constraints</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">var</span> name <span class=\"hljs-keyword\">in</span> <span class=\"hljs-keyword\">this</span>.options)\n      <span class=\"hljs-keyword\">this</span>.addConstraint(name, <span class=\"hljs-keyword\">this</span>.options[name], <span class=\"hljs-literal\">undefined</span>, <span class=\"hljs-literal\">true</span>);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-35\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-35\">&#182;</a>\n              </div>\n              <p>finally, bind special HTML5 constraints</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>._bindHtml5Constraints();\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-36\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-36\">&#182;</a>\n              </div>\n              <p>Internal only.\nBind specific HTML5 constraints to be HTML5 compliant</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  _bindHtml5Constraints: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-37\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-37\">&#182;</a>\n              </div>\n              <p>html5 required</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-literal\">null</span> !== <span class=\"hljs-keyword\">this</span>.element.getAttribute(<span class=\"hljs-string\">'required'</span>))\n      <span class=\"hljs-keyword\">this</span>.addConstraint(<span class=\"hljs-string\">'required'</span>, <span class=\"hljs-literal\">true</span>, <span class=\"hljs-literal\">undefined</span>, <span class=\"hljs-literal\">true</span>);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-38\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-38\">&#182;</a>\n              </div>\n              <p>html5 pattern</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-literal\">null</span> !== <span class=\"hljs-keyword\">this</span>.element.getAttribute(<span class=\"hljs-string\">'pattern'</span>))\n      <span class=\"hljs-keyword\">this</span>.addConstraint(<span class=\"hljs-string\">'pattern'</span>, <span class=\"hljs-keyword\">this</span>.element.getAttribute(<span class=\"hljs-string\">'pattern'</span>), <span class=\"hljs-literal\">undefined</span>, <span class=\"hljs-literal\">true</span>);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-39\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-39\">&#182;</a>\n              </div>\n              <p>range</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">let</span> min = <span class=\"hljs-keyword\">this</span>.element.getAttribute(<span class=\"hljs-string\">'min'</span>);\n    <span class=\"hljs-keyword\">let</span> max = <span class=\"hljs-keyword\">this</span>.element.getAttribute(<span class=\"hljs-string\">'max'</span>);\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-literal\">null</span> !== min &amp;&amp; <span class=\"hljs-literal\">null</span> !== max)\n      <span class=\"hljs-keyword\">this</span>.addConstraint(<span class=\"hljs-string\">'range'</span>, [min, max], <span class=\"hljs-literal\">undefined</span>, <span class=\"hljs-literal\">true</span>);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-40\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-40\">&#182;</a>\n              </div>\n              <p>HTML5 min</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-literal\">null</span> !== min)\n      <span class=\"hljs-keyword\">this</span>.addConstraint(<span class=\"hljs-string\">'min'</span>, min, <span class=\"hljs-literal\">undefined</span>, <span class=\"hljs-literal\">true</span>);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-41\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-41\">&#182;</a>\n              </div>\n              <p>HTML5 max</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-literal\">null</span> !== max)\n      <span class=\"hljs-keyword\">this</span>.addConstraint(<span class=\"hljs-string\">'max'</span>, max, <span class=\"hljs-literal\">undefined</span>, <span class=\"hljs-literal\">true</span>);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-42\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-42\">&#182;</a>\n              </div>\n              <p>length</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-literal\">null</span> !== <span class=\"hljs-keyword\">this</span>.element.getAttribute(<span class=\"hljs-string\">'minlength'</span>) &amp;&amp; <span class=\"hljs-literal\">null</span> !== <span class=\"hljs-keyword\">this</span>.element.getAttribute(<span class=\"hljs-string\">'maxlength'</span>))\n      <span class=\"hljs-keyword\">this</span>.addConstraint(<span class=\"hljs-string\">'length'</span>, [<span class=\"hljs-keyword\">this</span>.element.getAttribute(<span class=\"hljs-string\">'minlength'</span>), <span class=\"hljs-keyword\">this</span>.element.getAttribute(<span class=\"hljs-string\">'maxlength'</span>)], <span class=\"hljs-literal\">undefined</span>, <span class=\"hljs-literal\">true</span>);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-43\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-43\">&#182;</a>\n              </div>\n              <p>HTML5 minlength</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-literal\">null</span> !== <span class=\"hljs-keyword\">this</span>.element.getAttribute(<span class=\"hljs-string\">'minlength'</span>))\n      <span class=\"hljs-keyword\">this</span>.addConstraint(<span class=\"hljs-string\">'minlength'</span>, <span class=\"hljs-keyword\">this</span>.element.getAttribute(<span class=\"hljs-string\">'minlength'</span>), <span class=\"hljs-literal\">undefined</span>, <span class=\"hljs-literal\">true</span>);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-44\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-44\">&#182;</a>\n              </div>\n              <p>HTML5 maxlength</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-literal\">null</span> !== <span class=\"hljs-keyword\">this</span>.element.getAttribute(<span class=\"hljs-string\">'maxlength'</span>))\n      <span class=\"hljs-keyword\">this</span>.addConstraint(<span class=\"hljs-string\">'maxlength'</span>, <span class=\"hljs-keyword\">this</span>.element.getAttribute(<span class=\"hljs-string\">'maxlength'</span>), <span class=\"hljs-literal\">undefined</span>, <span class=\"hljs-literal\">true</span>);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-45\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-45\">&#182;</a>\n              </div>\n              <p>html5 types</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">var</span> type = Utils.getType(<span class=\"hljs-keyword\">this</span>.element);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-46\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-46\">&#182;</a>\n              </div>\n              <p>Small special case here for HTML5 number: integer validator if step attribute is undefined or an integer value, number otherwise</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'number'</span> === type) {\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.addConstraint(<span class=\"hljs-string\">'type'</span>, [<span class=\"hljs-string\">'number'</span>, {\n        <span class=\"hljs-attr\">step</span>: <span class=\"hljs-keyword\">this</span>.element.getAttribute(<span class=\"hljs-string\">'step'</span>) || <span class=\"hljs-string\">'1'</span>,\n        <span class=\"hljs-attr\">base</span>: min || <span class=\"hljs-keyword\">this</span>.element.getAttribute(<span class=\"hljs-string\">'value'</span>)\n      }], <span class=\"hljs-literal\">undefined</span>, <span class=\"hljs-literal\">true</span>);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-47\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-47\">&#182;</a>\n              </div>\n              <p>Regular other HTML5 supported types</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    } <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-regexp\">/^(email|url|range|date)$/i</span>.test(type)) {\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.addConstraint(<span class=\"hljs-string\">'type'</span>, type, <span class=\"hljs-literal\">undefined</span>, <span class=\"hljs-literal\">true</span>);\n    }\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>;\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-48\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-48\">&#182;</a>\n              </div>\n              <p>Internal only.\nField is required if have required constraint without <code>false</code> value</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  _isRequired: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'undefined'</span> === <span class=\"hljs-keyword\">typeof</span> <span class=\"hljs-keyword\">this</span>.constraintsByName.required)\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">false</span>;\n\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">false</span> !== <span class=\"hljs-keyword\">this</span>.constraintsByName.required.requirements;\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-49\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-49\">&#182;</a>\n              </div>\n              <p>Internal only.\nShortcut to trigger an event</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  _trigger: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">eventName</span>) </span>{\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.trigger(<span class=\"hljs-string\">'field:'</span> + eventName);\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-50\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-50\">&#182;</a>\n              </div>\n              <p>Internal only\nHandles whitespace in a value\nUse <code>data-parsley-whitespace=&quot;squish&quot;</code> to auto squish input value\nUse <code>data-parsley-whitespace=&quot;trim&quot;</code> to auto trim input value</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  _handleWhitespace: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">value</span>) </span>{\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-literal\">true</span> === <span class=\"hljs-keyword\">this</span>.options.trimValue)\n      Utils.warnOnce(<span class=\"hljs-string\">'data-parsley-trim-value=\"true\" is deprecated, please use data-parsley-whitespace=\"trim\"'</span>);\n\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'squish'</span> === <span class=\"hljs-keyword\">this</span>.options.whitespace)\n      value = value.replace(<span class=\"hljs-regexp\">/\\s{2,}/g</span>, <span class=\"hljs-string\">' '</span>);\n\n    <span class=\"hljs-keyword\">if</span> ((<span class=\"hljs-string\">'trim'</span> === <span class=\"hljs-keyword\">this</span>.options.whitespace) || (<span class=\"hljs-string\">'squish'</span> === <span class=\"hljs-keyword\">this</span>.options.whitespace) || (<span class=\"hljs-literal\">true</span> === <span class=\"hljs-keyword\">this</span>.options.trimValue))\n      value = Utils.trimString(value);\n\n    <span class=\"hljs-keyword\">return</span> value;\n  },\n\n  <span class=\"hljs-attr\">_isDateInput</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">var</span> c = <span class=\"hljs-keyword\">this</span>.constraintsByName.type;\n    <span class=\"hljs-keyword\">return</span> c &amp;&amp; c.requirements === <span class=\"hljs-string\">'date'</span>;\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-51\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-51\">&#182;</a>\n              </div>\n              <p>Internal only.\nReturns the constraints, grouped by descending priority.\nThe result is thus an array of arrays of constraints.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  _getGroupedConstraints: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-literal\">false</span> === <span class=\"hljs-keyword\">this</span>.options.priorityEnabled)\n      <span class=\"hljs-keyword\">return</span> [<span class=\"hljs-keyword\">this</span>.constraints];\n\n    <span class=\"hljs-keyword\">var</span> groupedConstraints = [];\n    <span class=\"hljs-keyword\">var</span> index = {};</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-52\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-52\">&#182;</a>\n              </div>\n              <p>Create array unique of priorities</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">var</span> i = <span class=\"hljs-number\">0</span>; i &lt; <span class=\"hljs-keyword\">this</span>.constraints.length; i++) {\n      <span class=\"hljs-keyword\">var</span> p = <span class=\"hljs-keyword\">this</span>.constraints[i].priority;\n      <span class=\"hljs-keyword\">if</span> (!index[p])\n        groupedConstraints.push(index[p] = []);\n      index[p].push(<span class=\"hljs-keyword\">this</span>.constraints[i]);\n    }</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-53\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-53\">&#182;</a>\n              </div>\n              <p>Sort them by priority DESC</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    groupedConstraints.sort(<span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">a, b</span>) </span>{ <span class=\"hljs-keyword\">return</span> b[<span class=\"hljs-number\">0</span>].priority - a[<span class=\"hljs-number\">0</span>].priority; });\n\n    <span class=\"hljs-keyword\">return</span> groupedConstraints;\n  }\n\n};\n\n<span class=\"hljs-keyword\">export</span> <span class=\"hljs-keyword\">default</span> Field;</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n<script>var _gaq=_gaq||[];_gaq.push([\"_setAccount\",\"UA-37229467-1\"]);_gaq.push([\"_trackPageview\"]);(function(){var e=document.createElement(\"script\");e.type=\"text/javascript\";e.async=true;e.src=(\"https:\"==document.location.protocol?\"https://ssl\":\"http://www\")+\".google-analytics.com/ga.js\";var t=document.getElementsByTagName(\"script\")[0];t.parentNode.insertBefore(e,t)})();</script></body>\n</html>\n"
  },
  {
    "path": "doc/annotated-source/form.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>form.js</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page\"><a class=\"source\" href=\"../index.html\">&lt;&lt;&lt; back to documentation</a>\n            \n              \n              <a class=\"source\" href=\"base.html\">\n                base.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"constraint.html\">\n                constraint.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"defaults.html\">\n                defaults.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"factory.html\">\n                factory.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"field.html\">\n                field.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"form.html\">\n                form.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"main.html\">\n                main.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"multiple.html\">\n                multiple.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"pubsub.html\">\n                pubsub.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"remote.html\">\n                remote.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"ui.html\">\n                ui.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"utils.html\">\n                utils.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator.html\">\n                validator.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator_registry.html\">\n                validator_registry.js\n              </a>\n            \n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>form.js</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              \n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">import</span> $ <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'jquery'</span>;\n<span class=\"hljs-keyword\">import</span> Base <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./base'</span>;\n<span class=\"hljs-keyword\">import</span> Utils <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./utils'</span>;\n\n<span class=\"hljs-keyword\">var</span> Form = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">element, domOptions, options</span>) </span>{\n  <span class=\"hljs-keyword\">this</span>.__class__ = <span class=\"hljs-string\">'Form'</span>;\n\n  <span class=\"hljs-keyword\">this</span>.element = element;\n  <span class=\"hljs-keyword\">this</span>.$element = $(element);\n  <span class=\"hljs-keyword\">this</span>.domOptions = domOptions;\n  <span class=\"hljs-keyword\">this</span>.options = options;\n  <span class=\"hljs-keyword\">this</span>.parent = <span class=\"hljs-built_in\">window</span>.Parsley;\n\n  <span class=\"hljs-keyword\">this</span>.fields = [];\n  <span class=\"hljs-keyword\">this</span>.validationResult = <span class=\"hljs-literal\">null</span>;\n};\n\n<span class=\"hljs-keyword\">var</span> statusMapping = {<span class=\"hljs-attr\">pending</span>: <span class=\"hljs-literal\">null</span>, <span class=\"hljs-attr\">resolved</span>: <span class=\"hljs-literal\">true</span>, <span class=\"hljs-attr\">rejected</span>: <span class=\"hljs-literal\">false</span>};\n\nForm.prototype = {\n  <span class=\"hljs-attr\">onSubmitValidate</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">event</span>) </span>{</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <p>This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-literal\">true</span> === event.parsley)\n      <span class=\"hljs-keyword\">return</span>;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <p>If we didn’t come here through a submit button, use the first one in the form</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">var</span> submitSource = <span class=\"hljs-keyword\">this</span>._submitSource || <span class=\"hljs-keyword\">this</span>.$element.find(Utils._SubmitSelector)[<span class=\"hljs-number\">0</span>];\n    <span class=\"hljs-keyword\">this</span>._submitSource = <span class=\"hljs-literal\">null</span>;\n    <span class=\"hljs-keyword\">this</span>.$element.find(<span class=\"hljs-string\">'.parsley-synthetic-submit-button'</span>).prop(<span class=\"hljs-string\">'disabled'</span>, <span class=\"hljs-literal\">true</span>);\n    <span class=\"hljs-keyword\">if</span> (submitSource &amp;&amp; <span class=\"hljs-literal\">null</span> !== submitSource.getAttribute(<span class=\"hljs-string\">'formnovalidate'</span>))\n      <span class=\"hljs-keyword\">return</span>;\n\n    <span class=\"hljs-built_in\">window</span>.Parsley._remoteCache = {};\n\n    <span class=\"hljs-keyword\">var</span> promise = <span class=\"hljs-keyword\">this</span>.whenValidate({event});\n\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'resolved'</span> === promise.state() &amp;&amp; <span class=\"hljs-literal\">false</span> !== <span class=\"hljs-keyword\">this</span>._trigger(<span class=\"hljs-string\">'submit'</span>)) {</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              <p>All good, let event go through. We make this distinction because browsers\ndiffer in their handling of <code>submit</code> being called from inside a submit event [#1047]</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    } <span class=\"hljs-keyword\">else</span> {</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <p>Rejected or pending: cancel this submit</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      event.stopImmediatePropagation();\n      event.preventDefault();\n      <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'pending'</span> === promise.state())\n        promise.done(<span class=\"hljs-function\"><span class=\"hljs-params\">()</span> =&gt;</span> { <span class=\"hljs-keyword\">this</span>._submit(submitSource); });\n    }\n  },\n\n  <span class=\"hljs-attr\">onSubmitButton</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">event</span>) </span>{\n    <span class=\"hljs-keyword\">this</span>._submitSource = event.currentTarget;\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p>internal\n_submit submits the form, this time without going through the validations.\nCare must be taken to “fake” the actual submit button being clicked.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  _submit: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">submitSource</span>) </span>{\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-literal\">false</span> === <span class=\"hljs-keyword\">this</span>._trigger(<span class=\"hljs-string\">'submit'</span>))\n      <span class=\"hljs-keyword\">return</span>;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>\n              </div>\n              <p>Add submit button’s data</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (submitSource) {\n      <span class=\"hljs-keyword\">var</span> $synthetic = <span class=\"hljs-keyword\">this</span>.$element.find(<span class=\"hljs-string\">'.parsley-synthetic-submit-button'</span>).prop(<span class=\"hljs-string\">'disabled'</span>, <span class=\"hljs-literal\">false</span>);\n      <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-number\">0</span> === $synthetic.length)\n        $synthetic = $(<span class=\"hljs-string\">'&lt;input class=\"parsley-synthetic-submit-button\" type=\"hidden\"&gt;'</span>).appendTo(<span class=\"hljs-keyword\">this</span>.$element);\n      $synthetic.attr({\n        <span class=\"hljs-attr\">name</span>: submitSource.getAttribute(<span class=\"hljs-string\">'name'</span>),\n        <span class=\"hljs-attr\">value</span>: submitSource.getAttribute(<span class=\"hljs-string\">'value'</span>)\n      });\n    }\n\n    <span class=\"hljs-keyword\">this</span>.$element.trigger(<span class=\"hljs-built_in\">Object</span>.assign($.Event(<span class=\"hljs-string\">'submit'</span>), {<span class=\"hljs-attr\">parsley</span>: <span class=\"hljs-literal\">true</span>}));\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>\n              </div>\n              <p>Performs validation on fields while triggering events.\n@returns <code>true</code> if all validations succeeds, <code>false</code>\nif a failure is immediately detected, or <code>null</code>\nif dependant on a promise.\nConsider using <code>whenValidate</code> instead.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  validate: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">options</span>) </span>{\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-built_in\">arguments</span>.length &gt;= <span class=\"hljs-number\">1</span> &amp;&amp; !$.isPlainObject(options)) {\n      Utils.warnOnce(<span class=\"hljs-string\">'Calling validate on a parsley form without passing arguments as an object is deprecated.'</span>);\n      <span class=\"hljs-keyword\">var</span> [group, force, event] = <span class=\"hljs-built_in\">arguments</span>;\n      options = {group, force, event};\n    }\n    <span class=\"hljs-keyword\">return</span> statusMapping[ <span class=\"hljs-keyword\">this</span>.whenValidate(options).state() ];\n  },\n\n  <span class=\"hljs-attr\">whenValidate</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">{group, force, event} = {}</span>) </span>{\n    <span class=\"hljs-keyword\">this</span>.submitEvent = event;\n    <span class=\"hljs-keyword\">if</span> (event) {\n      <span class=\"hljs-keyword\">this</span>.submitEvent = <span class=\"hljs-built_in\">Object</span>.assign({}, event, {<span class=\"hljs-attr\">preventDefault</span>: <span class=\"hljs-function\"><span class=\"hljs-params\">()</span> =&gt;</span> {\n        Utils.warnOnce(<span class=\"hljs-string\">\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\"</span>);\n        <span class=\"hljs-keyword\">this</span>.validationResult = <span class=\"hljs-literal\">false</span>;\n      }});\n    }\n    <span class=\"hljs-keyword\">this</span>.validationResult = <span class=\"hljs-literal\">true</span>;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>\n              </div>\n              <p>fire validate event to eventually modify things before every validation</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">this</span>._trigger(<span class=\"hljs-string\">'validate'</span>);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>\n              </div>\n              <p>Refresh form DOM options and form’s fields that could have changed</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">this</span>._refreshFields();\n\n    <span class=\"hljs-keyword\">var</span> promises = <span class=\"hljs-keyword\">this</span>._withoutReactualizingFormOptions(<span class=\"hljs-function\"><span class=\"hljs-params\">()</span> =&gt;</span> {\n      <span class=\"hljs-keyword\">return</span> $.map(<span class=\"hljs-keyword\">this</span>.fields, field =&gt; field.whenValidate({force, group}));\n    });\n\n    <span class=\"hljs-keyword\">return</span> Utils.all(promises)\n      .done(  <span class=\"hljs-function\"><span class=\"hljs-params\">()</span> =&gt;</span> { <span class=\"hljs-keyword\">this</span>._trigger(<span class=\"hljs-string\">'success'</span>); })\n      .fail(  <span class=\"hljs-function\"><span class=\"hljs-params\">()</span> =&gt;</span> {\n        <span class=\"hljs-keyword\">this</span>.validationResult = <span class=\"hljs-literal\">false</span>;\n        <span class=\"hljs-keyword\">this</span>.focus();\n        <span class=\"hljs-keyword\">this</span>._trigger(<span class=\"hljs-string\">'error'</span>);\n      })\n      .always(<span class=\"hljs-function\"><span class=\"hljs-params\">()</span> =&gt;</span> { <span class=\"hljs-keyword\">this</span>._trigger(<span class=\"hljs-string\">'validated'</span>); })\n      .pipe(...this._pipeAccordingToValidationResult());\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>\n              </div>\n              <p>Iterate over refreshed fields, and stop on first failure.\nReturns <code>true</code> if all fields are valid, <code>false</code> if a failure is detected\nor <code>null</code> if the result depends on an unresolved promise.\nPrefer using <code>whenValid</code> instead.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  isValid: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">options</span>) </span>{\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-built_in\">arguments</span>.length &gt;= <span class=\"hljs-number\">1</span> &amp;&amp; !$.isPlainObject(options)) {\n      Utils.warnOnce(<span class=\"hljs-string\">'Calling isValid on a parsley form without passing arguments as an object is deprecated.'</span>);\n      <span class=\"hljs-keyword\">var</span> [group, force] = <span class=\"hljs-built_in\">arguments</span>;\n      options = {group, force};\n    }\n    <span class=\"hljs-keyword\">return</span> statusMapping[ <span class=\"hljs-keyword\">this</span>.whenValid(options).state() ];\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>\n              </div>\n              <p>Iterate over refreshed fields and validate them.\nReturns a promise.\nA validation that immediately fails will interrupt the validations.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  whenValid: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">{group, force} = {}</span>) </span>{\n    <span class=\"hljs-keyword\">this</span>._refreshFields();\n\n    <span class=\"hljs-keyword\">var</span> promises = <span class=\"hljs-keyword\">this</span>._withoutReactualizingFormOptions(<span class=\"hljs-function\"><span class=\"hljs-params\">()</span> =&gt;</span> {\n      <span class=\"hljs-keyword\">return</span> $.map(<span class=\"hljs-keyword\">this</span>.fields, field =&gt; field.whenValid({group, force}));\n    });\n    <span class=\"hljs-keyword\">return</span> Utils.all(promises);\n  },\n\n  <span class=\"hljs-attr\">refresh</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">this</span>._refreshFields();\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>;\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>\n              </div>\n              <p>Reset UI</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  reset: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>\n              </div>\n              <p>Form case: emit a reset event for each field</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">var</span> i = <span class=\"hljs-number\">0</span>; i &lt; <span class=\"hljs-keyword\">this</span>.fields.length; i++)\n      <span class=\"hljs-keyword\">this</span>.fields[i].reset();\n\n    <span class=\"hljs-keyword\">this</span>._trigger(<span class=\"hljs-string\">'reset'</span>);\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>\n              </div>\n              <p>Destroy Parsley instance (+ UI)</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  destroy: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-16\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>\n              </div>\n              <p>Field case: emit destroy event to clean UI and then destroy stored instance</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">this</span>._destroyUI();</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-17\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>\n              </div>\n              <p>Form case: destroy all its fields and then destroy stored instance</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">var</span> i = <span class=\"hljs-number\">0</span>; i &lt; <span class=\"hljs-keyword\">this</span>.fields.length; i++)\n      <span class=\"hljs-keyword\">this</span>.fields[i].destroy();\n\n    <span class=\"hljs-keyword\">this</span>.$element.removeData(<span class=\"hljs-string\">'Parsley'</span>);\n    <span class=\"hljs-keyword\">this</span>._trigger(<span class=\"hljs-string\">'destroy'</span>);\n  },\n\n  <span class=\"hljs-attr\">_refreshFields</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.actualizeOptions()._bindFields();\n  },\n\n  <span class=\"hljs-attr\">_bindFields</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">var</span> oldFields = <span class=\"hljs-keyword\">this</span>.fields;\n\n    <span class=\"hljs-keyword\">this</span>.fields = [];\n    <span class=\"hljs-keyword\">this</span>.fieldsMappedById = {};\n\n    <span class=\"hljs-keyword\">this</span>._withoutReactualizingFormOptions(<span class=\"hljs-function\"><span class=\"hljs-params\">()</span> =&gt;</span> {\n      <span class=\"hljs-keyword\">this</span>.$element\n      .find(<span class=\"hljs-keyword\">this</span>.options.inputs)\n      .not(<span class=\"hljs-keyword\">this</span>.options.excluded)\n      .not(<span class=\"hljs-string\">`[<span class=\"hljs-subst\">${<span class=\"hljs-keyword\">this</span>.options.namespace}</span>excluded=true]`</span>)\n      .each(<span class=\"hljs-function\">(<span class=\"hljs-params\">_, element</span>) =&gt;</span> {\n        <span class=\"hljs-keyword\">var</span> fieldInstance = <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">window</span>.Parsley.Factory(element, {}, <span class=\"hljs-keyword\">this</span>);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-18\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>\n              </div>\n              <p>Only add valid and not excluded <code>Field</code> and <code>FieldMultiple</code> children</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'Field'</span> === fieldInstance.__class__ || <span class=\"hljs-string\">'FieldMultiple'</span> === fieldInstance.__class__) {\n          <span class=\"hljs-keyword\">let</span> uniqueId = fieldInstance.__class__ + <span class=\"hljs-string\">'-'</span> + fieldInstance.__id__;\n          <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'undefined'</span> === <span class=\"hljs-keyword\">typeof</span> <span class=\"hljs-keyword\">this</span>.fieldsMappedById[uniqueId]) {\n            <span class=\"hljs-keyword\">this</span>.fieldsMappedById[uniqueId] = fieldInstance;\n            <span class=\"hljs-keyword\">this</span>.fields.push(fieldInstance);\n          }\n        }\n      });\n\n      $.each(Utils.difference(oldFields, <span class=\"hljs-keyword\">this</span>.fields), (_, field) =&gt; {\n        field.reset();\n      });\n    });\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>;\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-19\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>\n              </div>\n              <p>Internal only.\nLooping on a form’s fields to do validation or similar\nwill trigger reactualizing options on all of them, which\nin turn will reactualize the form’s options.\nTo avoid calling actualizeOptions so many times on the form\nfor nothing, _withoutReactualizingFormOptions temporarily disables\nthe method actualizeOptions on this form while <code>fn</code> is called.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  _withoutReactualizingFormOptions: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">fn</span>) </span>{\n    <span class=\"hljs-keyword\">var</span> oldActualizeOptions = <span class=\"hljs-keyword\">this</span>.actualizeOptions;\n    <span class=\"hljs-keyword\">this</span>.actualizeOptions = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{ <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>; };\n    <span class=\"hljs-keyword\">var</span> result = fn();\n    <span class=\"hljs-keyword\">this</span>.actualizeOptions = oldActualizeOptions;\n    <span class=\"hljs-keyword\">return</span> result;\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-20\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>\n              </div>\n              <p>Internal only.\nShortcut to trigger an event\nReturns true iff event is not interrupted and default not prevented.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  _trigger: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">eventName</span>) </span>{\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.trigger(<span class=\"hljs-string\">'form:'</span> + eventName);\n  }\n\n};\n\n<span class=\"hljs-keyword\">export</span> <span class=\"hljs-keyword\">default</span> Form;</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n<script>var _gaq=_gaq||[];_gaq.push([\"_setAccount\",\"UA-37229467-1\"]);_gaq.push([\"_trackPageview\"]);(function(){var e=document.createElement(\"script\");e.type=\"text/javascript\";e.async=true;e.src=(\"https:\"==document.location.protocol?\"https://ssl\":\"http://www\")+\".google-analytics.com/ga.js\";var t=document.getElementsByTagName(\"script\")[0];t.parentNode.insertBefore(e,t)})();</script></body>\n</html>\n"
  },
  {
    "path": "doc/annotated-source/main.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>main.js</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page\"><a class=\"source\" href=\"../index.html\">&lt;&lt;&lt; back to documentation</a>\n            \n              \n              <a class=\"source\" href=\"base.html\">\n                base.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"constraint.html\">\n                constraint.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"defaults.html\">\n                defaults.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"factory.html\">\n                factory.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"field.html\">\n                field.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"form.html\">\n                form.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"main.html\">\n                main.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"multiple.html\">\n                multiple.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"pubsub.html\">\n                pubsub.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"remote.html\">\n                remote.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"ui.html\">\n                ui.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"utils.html\">\n                utils.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator.html\">\n                validator.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator_registry.html\">\n                validator_registry.js\n              </a>\n            \n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>main.js</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              \n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">import</span> $ <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'jquery'</span>;\n<span class=\"hljs-keyword\">import</span> Utils <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./utils'</span>;\n<span class=\"hljs-keyword\">import</span> Defaults <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./defaults'</span>;\n<span class=\"hljs-keyword\">import</span> Base <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./base'</span>;\n<span class=\"hljs-keyword\">import</span> ValidatorRegistry <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./validator_registry'</span>;\n<span class=\"hljs-keyword\">import</span> UI <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./ui'</span>;\n<span class=\"hljs-keyword\">import</span> Form <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./form'</span>;\n<span class=\"hljs-keyword\">import</span> Field <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./field'</span>;\n<span class=\"hljs-keyword\">import</span> Multiple <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./multiple'</span>;\n<span class=\"hljs-keyword\">import</span> Factory <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./factory'</span>;\n\n<span class=\"hljs-keyword\">var</span> vernums = $.fn.jquery.split(<span class=\"hljs-string\">'.'</span>);\n<span class=\"hljs-keyword\">if</span> (<span class=\"hljs-built_in\">parseInt</span>(vernums[<span class=\"hljs-number\">0</span>]) &lt;= <span class=\"hljs-number\">1</span> &amp;&amp; <span class=\"hljs-built_in\">parseInt</span>(vernums[<span class=\"hljs-number\">1</span>]) &lt; <span class=\"hljs-number\">8</span>) {\n  <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-string\">\"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.\"</span>;\n}\n<span class=\"hljs-keyword\">if</span> (!vernums.forEach) {\n  Utils.warn(<span class=\"hljs-string\">'Parsley requires ES5 to run properly. Please include https://github.com/es-shims/es5-shim'</span>);\n}</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <p>Inherit <code>on</code>, <code>off</code> &amp; <code>trigger</code> to Parsley:</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">var</span> Parsley = <span class=\"hljs-built_in\">Object</span>.assign(<span class=\"hljs-keyword\">new</span> Base(), {\n    <span class=\"hljs-attr\">element</span>: <span class=\"hljs-built_in\">document</span>,\n    <span class=\"hljs-attr\">$element</span>: $(<span class=\"hljs-built_in\">document</span>),\n    <span class=\"hljs-attr\">actualizeOptions</span>: <span class=\"hljs-literal\">null</span>,\n    <span class=\"hljs-attr\">_resetOptions</span>: <span class=\"hljs-literal\">null</span>,\n    <span class=\"hljs-attr\">Factory</span>: Factory,\n    <span class=\"hljs-attr\">version</span>: <span class=\"hljs-string\">'VERSION'</span>\n  });</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <p>Supplement Field and Form with Base\nThis way, the constructors will have access to those methods</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">Object</span>.assign(Field.prototype, UI.Field, Base.prototype);\n<span class=\"hljs-built_in\">Object</span>.assign(Form.prototype, UI.Form, Base.prototype);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              <p>Inherit actualizeOptions and _resetOptions:</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">Object</span>.assign(Factory.prototype, Base.prototype);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <h3 id=\"jquery-api\">jQuery API</h3>\n<p><code>$(&#39;.elem&#39;).parsley(options)</code> or <code>$(&#39;.elem&#39;).psly(options)</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>$.fn.parsley = $.fn.psly = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">options</span>) </span>{\n  <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-keyword\">this</span>.length &gt; <span class=\"hljs-number\">1</span>) {\n    <span class=\"hljs-keyword\">var</span> instances = [];\n\n    <span class=\"hljs-keyword\">this</span>.each(<span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n      instances.push($(<span class=\"hljs-keyword\">this</span>).parsley(options));\n    });\n\n    <span class=\"hljs-keyword\">return</span> instances;\n  }</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p>Return undefined if applied to non existing DOM element</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-keyword\">this</span>.length == <span class=\"hljs-number\">0</span>) {\n    <span class=\"hljs-keyword\">return</span>;\n  }\n\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> Factory(<span class=\"hljs-keyword\">this</span>[<span class=\"hljs-number\">0</span>], options);\n};</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>\n              </div>\n              <h3 id=\"field-and-form-extension\">Field and Form extension</h3>\n<p>Ensure the extension is now defined if it wasn’t previously</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'undefined'</span> === <span class=\"hljs-keyword\">typeof</span> <span class=\"hljs-built_in\">window</span>.ParsleyExtend)\n  <span class=\"hljs-built_in\">window</span>.ParsleyExtend = {};</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>\n              </div>\n              <h3 id=\"parsley-config\">Parsley config</h3>\n<p>Inherit from ParsleyDefault, and copy over any existing values</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>Parsley.options = <span class=\"hljs-built_in\">Object</span>.assign(Utils.objectCreate(Defaults), <span class=\"hljs-built_in\">window</span>.ParsleyConfig);\n<span class=\"hljs-built_in\">window</span>.ParsleyConfig = Parsley.options; <span class=\"hljs-comment\">// Old way of accessing global options</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>\n              </div>\n              <h3 id=\"globals\">Globals</h3>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">window</span>.Parsley = <span class=\"hljs-built_in\">window</span>.psly = Parsley;\nParsley.Utils = Utils;\n<span class=\"hljs-built_in\">window</span>.ParsleyUtils = {};\n$.each(Utils, (key, value) =&gt; {\n  <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'function'</span> === <span class=\"hljs-keyword\">typeof</span> value) {\n    <span class=\"hljs-built_in\">window</span>.ParsleyUtils[key] = <span class=\"hljs-function\">(<span class=\"hljs-params\">...args</span>) =&gt;</span> {\n      Utils.warnOnce(<span class=\"hljs-string\">'Accessing `window.ParsleyUtils` is deprecated. Use `window.Parsley.Utils` instead.'</span>);\n      <span class=\"hljs-keyword\">return</span> Utils[key](...args);\n    };\n  }\n});</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>\n              </div>\n              <h3 id=\"define-methods-that-forward-to-the-registry-and-deprecate-all-access-except-through-windowparsley\">Define methods that forward to the registry, and deprecate all access except through window.Parsley</h3>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">var</span> registry = <span class=\"hljs-built_in\">window</span>.Parsley._validatorRegistry = <span class=\"hljs-keyword\">new</span> ValidatorRegistry(<span class=\"hljs-built_in\">window</span>.ParsleyConfig.validators, <span class=\"hljs-built_in\">window</span>.ParsleyConfig.i18n);\n<span class=\"hljs-built_in\">window</span>.ParsleyValidator = {};\n$.each(<span class=\"hljs-string\">'setLocale addCatalog addMessage addMessages getErrorMessage formatMessage addValidator updateValidator removeValidator hasValidator'</span>.split(<span class=\"hljs-string\">' '</span>), <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">i, method</span>) </span>{\n  <span class=\"hljs-built_in\">window</span>.Parsley[method] = <span class=\"hljs-function\">(<span class=\"hljs-params\">...args</span>) =&gt;</span> registry[method](...args);\n  <span class=\"hljs-built_in\">window</span>.ParsleyValidator[method] = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    Utils.warnOnce(<span class=\"hljs-string\">`Accessing the method '<span class=\"hljs-subst\">${method}</span>' through Validator is deprecated. Simply call 'window.Parsley.<span class=\"hljs-subst\">${method}</span>(...)'`</span>);\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-built_in\">window</span>.Parsley[method](...arguments);\n  };\n});</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>\n              </div>\n              <h3 id=\"ui\">UI</h3>\n<p>Deprecated global object</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-built_in\">window</span>.Parsley.UI = UI;\n<span class=\"hljs-built_in\">window</span>.ParsleyUI = {\n  <span class=\"hljs-attr\">removeError</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">instance, name, doNotUpdateClass</span>) </span>{\n    <span class=\"hljs-keyword\">var</span> updateClass = <span class=\"hljs-literal\">true</span> !== doNotUpdateClass;\n    Utils.warnOnce(<span class=\"hljs-string\">`Accessing UI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method.`</span>);\n    <span class=\"hljs-keyword\">return</span> instance.removeError(name, {updateClass});\n  },\n  <span class=\"hljs-attr\">getErrorsMessages</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">instance</span>) </span>{\n    Utils.warnOnce(<span class=\"hljs-string\">`Accessing UI is deprecated. Call 'getErrorsMessages' on the instance directly.`</span>);\n    <span class=\"hljs-keyword\">return</span> instance.getErrorsMessages();\n  }\n};\n$.each(<span class=\"hljs-string\">'addError updateError'</span>.split(<span class=\"hljs-string\">' '</span>), <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">i, method</span>) </span>{\n  <span class=\"hljs-built_in\">window</span>.ParsleyUI[method] = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">instance, name, message, assert, doNotUpdateClass</span>) </span>{\n    <span class=\"hljs-keyword\">var</span> updateClass = <span class=\"hljs-literal\">true</span> !== doNotUpdateClass;\n    Utils.warnOnce(<span class=\"hljs-string\">`Accessing UI is deprecated. Call '<span class=\"hljs-subst\">${method}</span>' on the instance directly. Please comment in issue 1073 as to your need to call this method.`</span>);\n    <span class=\"hljs-keyword\">return</span> instance[method](name, {message, assert, updateClass});\n  };\n});</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>\n              </div>\n              <h3 id=\"parsley-auto-binding\">PARSLEY auto-binding</h3>\n<p>Prevent it by setting <code>ParsleyConfig.autoBind</code> to <code>false</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">if</span> (<span class=\"hljs-literal\">false</span> !== <span class=\"hljs-built_in\">window</span>.ParsleyConfig.autoBind) {\n  $(<span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>\n              </div>\n              <p>Works only on <code>data-parsley-validate</code>.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> ($(<span class=\"hljs-string\">'[data-parsley-validate]'</span>).length)\n      $(<span class=\"hljs-string\">'[data-parsley-validate]'</span>).parsley();\n  });\n}\n\n<span class=\"hljs-keyword\">export</span> <span class=\"hljs-keyword\">default</span> Parsley;</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n<script>var _gaq=_gaq||[];_gaq.push([\"_setAccount\",\"UA-37229467-1\"]);_gaq.push([\"_trackPageview\"]);(function(){var e=document.createElement(\"script\");e.type=\"text/javascript\";e.async=true;e.src=(\"https:\"==document.location.protocol?\"https://ssl\":\"http://www\")+\".google-analytics.com/ga.js\";var t=document.getElementsByTagName(\"script\")[0];t.parentNode.insertBefore(e,t)})();</script></body>\n</html>\n"
  },
  {
    "path": "doc/annotated-source/multiple.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>multiple.js</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page\"><a class=\"source\" href=\"../index.html\">&lt;&lt;&lt; back to documentation</a>\n            \n              \n              <a class=\"source\" href=\"base.html\">\n                base.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"constraint.html\">\n                constraint.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"defaults.html\">\n                defaults.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"factory.html\">\n                factory.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"field.html\">\n                field.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"form.html\">\n                form.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"main.html\">\n                main.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"multiple.html\">\n                multiple.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"pubsub.html\">\n                pubsub.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"remote.html\">\n                remote.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"ui.html\">\n                ui.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"utils.html\">\n                utils.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator.html\">\n                validator.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator_registry.html\">\n                validator_registry.js\n              </a>\n            \n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>multiple.js</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              \n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">import</span> $ <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'jquery'</span>;\n<span class=\"hljs-keyword\">import</span> Utils <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./utils'</span>;\n\n<span class=\"hljs-keyword\">var</span> Multiple = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n  <span class=\"hljs-keyword\">this</span>.__class__ = <span class=\"hljs-string\">'FieldMultiple'</span>;\n};\n\nMultiple.prototype = {</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <p>Add new <code>$element</code> sibling for multiple field</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  addElement: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">$element</span>) </span>{\n    <span class=\"hljs-keyword\">this</span>.$elements.push($element);\n\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>;\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <p>See <code>Field._refreshConstraints()</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  _refreshConstraints: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">var</span> fieldConstraints;\n\n    <span class=\"hljs-keyword\">this</span>.constraints = [];</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              <p>Select multiple special treatment</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-keyword\">this</span>.element.nodeName === <span class=\"hljs-string\">'SELECT'</span>) {\n      <span class=\"hljs-keyword\">this</span>.actualizeOptions()._bindConstraints();\n\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>;\n    }</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <p>Gather all constraints for each input in the multiple group</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">var</span> i = <span class=\"hljs-number\">0</span>; i &lt; <span class=\"hljs-keyword\">this</span>.$elements.length; i++) {</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p>Check if element have not been dynamically removed since last binding</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> (!$(<span class=\"hljs-string\">'html'</span>).has(<span class=\"hljs-keyword\">this</span>.$elements[i]).length) {\n        <span class=\"hljs-keyword\">this</span>.$elements.splice(i, <span class=\"hljs-number\">1</span>);\n        <span class=\"hljs-keyword\">continue</span>;\n      }\n\n      fieldConstraints = <span class=\"hljs-keyword\">this</span>.$elements[i].data(<span class=\"hljs-string\">'FieldMultiple'</span>)._refreshConstraints().constraints;\n\n      <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">var</span> j = <span class=\"hljs-number\">0</span>; j &lt; fieldConstraints.length; j++)\n        <span class=\"hljs-keyword\">this</span>.addConstraint(fieldConstraints[j].name, fieldConstraints[j].requirements, fieldConstraints[j].priority, fieldConstraints[j].isDomConstraint);\n    }\n\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>;\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>\n              </div>\n              <p>See <code>Field.getValue()</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  getValue: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>\n              </div>\n              <p>Value could be overriden in DOM</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'function'</span> === <span class=\"hljs-keyword\">typeof</span> <span class=\"hljs-keyword\">this</span>.options.value)\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.options.value(<span class=\"hljs-keyword\">this</span>);\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'undefined'</span> !== <span class=\"hljs-keyword\">typeof</span> <span class=\"hljs-keyword\">this</span>.options.value)\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.options.value;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>\n              </div>\n              <p>Radio input case</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-keyword\">this</span>.element.nodeName === <span class=\"hljs-string\">'INPUT'</span>) {\n      <span class=\"hljs-keyword\">var</span> type = Utils.getType(<span class=\"hljs-keyword\">this</span>.element);\n      <span class=\"hljs-keyword\">if</span> (type === <span class=\"hljs-string\">'radio'</span>)\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>._findRelated().filter(<span class=\"hljs-string\">':checked'</span>).val() || <span class=\"hljs-string\">''</span>;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>\n              </div>\n              <p>checkbox input case</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> (type === <span class=\"hljs-string\">'checkbox'</span>) {\n        <span class=\"hljs-keyword\">var</span> values = [];\n\n        <span class=\"hljs-keyword\">this</span>._findRelated().filter(<span class=\"hljs-string\">':checked'</span>).each(<span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n          values.push($(<span class=\"hljs-keyword\">this</span>).val());\n        });\n\n        <span class=\"hljs-keyword\">return</span> values;\n      }\n    }</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>\n              </div>\n              <p>Select multiple case</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-keyword\">this</span>.element.nodeName === <span class=\"hljs-string\">'SELECT'</span> &amp;&amp; <span class=\"hljs-literal\">null</span> === <span class=\"hljs-keyword\">this</span>.$element.val())\n      <span class=\"hljs-keyword\">return</span> [];</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>\n              </div>\n              <p>Default case that should never happen</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.$element.val();\n  },\n\n  <span class=\"hljs-attr\">_init</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">this</span>.$elements = [<span class=\"hljs-keyword\">this</span>.$element];\n\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>;\n  }\n};\n\n<span class=\"hljs-keyword\">export</span> <span class=\"hljs-keyword\">default</span> Multiple;</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n<script>var _gaq=_gaq||[];_gaq.push([\"_setAccount\",\"UA-37229467-1\"]);_gaq.push([\"_trackPageview\"]);(function(){var e=document.createElement(\"script\");e.type=\"text/javascript\";e.async=true;e.src=(\"https:\"==document.location.protocol?\"https://ssl\":\"http://www\")+\".google-analytics.com/ga.js\";var t=document.getElementsByTagName(\"script\")[0];t.parentNode.insertBefore(e,t)})();</script></body>\n</html>\n"
  },
  {
    "path": "doc/annotated-source/public/stylesheets/normalize.css",
    "content": "/*! normalize.css v2.0.1 | MIT License | git.io/normalize */\n\n/* ==========================================================================\n   HTML5 display definitions\n   ========================================================================== */\n\n/*\n * Corrects `block` display not defined in IE 8/9.\n */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nnav,\nsection,\nsummary {\n    display: block;\n}\n\n/*\n * Corrects `inline-block` display not defined in IE 8/9.\n */\n\naudio,\ncanvas,\nvideo {\n    display: inline-block;\n}\n\n/*\n * Prevents 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 * Addresses styling for `hidden` attribute not present in IE 8/9.\n */\n\n[hidden] {\n    display: none;\n}\n\n/* ==========================================================================\n   Base\n   ========================================================================== */\n\n/*\n * 1. Sets default font family to sans-serif.\n * 2. Prevents iOS text size adjust after orientation change, without disabling\n *    user zoom.\n */\n\nhtml {\n    font-family: sans-serif; /* 1 */\n    -webkit-text-size-adjust: 100%; /* 2 */\n    -ms-text-size-adjust: 100%; /* 2 */\n}\n\n/*\n * Removes default margin.\n */\n\nbody {\n    margin: 0;\n}\n\n/* ==========================================================================\n   Links\n   ========================================================================== */\n\n/*\n * Addresses `outline` inconsistency between Chrome and other browsers.\n */\n\na:focus {\n    outline: thin dotted;\n}\n\n/*\n * Improves readability when focused and also mouse hovered in all browsers.\n */\n\na:active,\na:hover {\n    outline: 0;\n}\n\n/* ==========================================================================\n   Typography\n   ========================================================================== */\n\n/*\n * Addresses `h1` font sizes within `section` and `article` in Firefox 4+,\n * Safari 5, and Chrome.\n */\n\nh1 {\n    font-size: 2em;\n}\n\n/*\n * Addresses styling not present in IE 8/9, Safari 5, and Chrome.\n */\n\nabbr[title] {\n    border-bottom: 1px dotted;\n}\n\n/*\n * Addresses style set to `bolder` in Firefox 4+, Safari 5, and Chrome.\n */\n\nb,\nstrong {\n    font-weight: bold;\n}\n\n/*\n * Addresses styling not present in Safari 5 and Chrome.\n */\n\ndfn {\n    font-style: italic;\n}\n\n/*\n * Addresses styling not present in IE 8/9.\n */\n\nmark {\n    background: #ff0;\n    color: #000;\n}\n\n\n/*\n * Corrects font family set oddly in Safari 5 and Chrome.\n */\n\ncode,\nkbd,\npre,\nsamp {\n    font-family: monospace, serif;\n    font-size: 1em;\n}\n\n/*\n * Improves readability of pre-formatted text in all browsers.\n */\n\npre {\n    white-space: pre;\n    white-space: pre-wrap;\n    word-wrap: break-word;\n}\n\n/*\n * Sets consistent quote types.\n */\n\nq {\n    quotes: \"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\";\n}\n\n/*\n * Addresses inconsistent and variable font size in all browsers.\n */\n\nsmall {\n    font-size: 80%;\n}\n\n/*\n * Prevents `sub` and `sup` affecting `line-height` in all browsers.\n */\n\nsub,\nsup {\n    font-size: 75%;\n    line-height: 0;\n    position: relative;\n    vertical-align: baseline;\n}\n\nsup {\n    top: -0.5em;\n}\n\nsub {\n    bottom: -0.25em;\n}\n\n/* ==========================================================================\n   Embedded content\n   ========================================================================== */\n\n/*\n * Removes border when inside `a` element in IE 8/9.\n */\n\nimg {\n    border: 0;\n}\n\n/*\n * Corrects overflow displayed oddly in IE 9.\n */\n\nsvg:not(:root) {\n    overflow: hidden;\n}\n\n/* ==========================================================================\n   Figures\n   ========================================================================== */\n\n/*\n * Addresses margin not present in IE 8/9 and Safari 5.\n */\n\nfigure {\n    margin: 0;\n}\n\n/* ==========================================================================\n   Forms\n   ========================================================================== */\n\n/*\n * Define consistent border, margin, and padding.\n */\n\nfieldset {\n    border: 1px solid #c0c0c0;\n    margin: 0 2px;\n    padding: 0.35em 0.625em 0.75em;\n}\n\n/*\n * 1. Corrects color not being inherited in IE 8/9.\n * 2. Remove padding so people aren't caught out if they zero out fieldsets.\n */\n\nlegend {\n    border: 0; /* 1 */\n    padding: 0; /* 2 */\n}\n\n/*\n * 1. Corrects font family not being inherited in all browsers.\n * 2. Corrects font size not being inherited in all browsers.\n * 3. Addresses margins set differently in Firefox 4+, Safari 5, and Chrome\n */\n\nbutton,\ninput,\nselect,\ntextarea {\n    font-family: inherit; /* 1 */\n    font-size: 100%; /* 2 */\n    margin: 0; /* 3 */\n}\n\n/*\n * Addresses Firefox 4+ setting `line-height` on `input` using `!important` in\n * the UA stylesheet.\n */\n\nbutton,\ninput {\n    line-height: normal;\n}\n\n/*\n * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n *    and `video` controls.\n * 2. Corrects inability to style clickable `input` types in iOS.\n * 3. Improves 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],\ninput[disabled] {\n    cursor: default;\n}\n\n/*\n * 1. Addresses box sizing set to `content-box` in IE 8/9.\n * 2. Removes excess padding in IE 8/9.\n */\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n    box-sizing: border-box; /* 1 */\n    padding: 0; /* 2 */\n}\n\n/*\n * 1. Addresses `appearance` set to `searchfield` in Safari 5 and Chrome.\n * 2. Addresses `box-sizing` set to `border-box` in Safari 5 and Chrome\n *    (include `-moz` to future-proof).\n */\n\ninput[type=\"search\"] {\n    -webkit-appearance: textfield; /* 1 */\n    -moz-box-sizing: content-box;\n    -webkit-box-sizing: content-box; /* 2 */\n    box-sizing: content-box;\n}\n\n/*\n * Removes inner padding and search cancel button in Safari 5 and Chrome\n * on OS X.\n */\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n    -webkit-appearance: none;\n}\n\n/*\n * Removes inner padding and border in Firefox 4+.\n */\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n    border: 0;\n    padding: 0;\n}\n\n/*\n * 1. Removes default vertical scrollbar in IE 8/9.\n * 2. Improves readability and alignment in all browsers.\n */\n\ntextarea {\n    overflow: auto; /* 1 */\n    vertical-align: top; /* 2 */\n}\n\n/* ==========================================================================\n   Tables\n   ========================================================================== */\n\n/*\n * Remove most spacing between table cells.\n */\n\ntable {\n    border-collapse: collapse;\n    border-spacing: 0;\n}"
  },
  {
    "path": "doc/annotated-source/pubsub.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>pubsub.js</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page\"><a class=\"source\" href=\"../index.html\">&lt;&lt;&lt; back to documentation</a>\n            \n              \n              <a class=\"source\" href=\"base.html\">\n                base.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"constraint.html\">\n                constraint.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"defaults.html\">\n                defaults.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"factory.html\">\n                factory.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"field.html\">\n                field.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"form.html\">\n                form.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"main.html\">\n                main.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"multiple.html\">\n                multiple.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"pubsub.html\">\n                pubsub.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"remote.html\">\n                remote.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"ui.html\">\n                ui.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"utils.html\">\n                utils.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator.html\">\n                validator.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator_registry.html\">\n                validator_registry.js\n              </a>\n            \n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>pubsub.js</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              \n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">import</span> $ <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'jquery'</span>;\n<span class=\"hljs-keyword\">import</span> Field <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./field'</span>;\n<span class=\"hljs-keyword\">import</span> Form <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./form'</span>;\n<span class=\"hljs-keyword\">import</span> Utils <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./utils'</span>;\n\n<span class=\"hljs-keyword\">var</span> o = $({});\n<span class=\"hljs-keyword\">var</span> deprecated = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n  Utils.warnOnce(<span class=\"hljs-string\">\"Parsley's pubsub module is deprecated; use the 'on' and 'off' methods on parsley instances or window.Parsley\"</span>);\n};</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <p>Returns an event handler that calls <code>fn</code> with the arguments it expects</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> <span class=\"hljs-title\">adapt</span>(<span class=\"hljs-params\">fn, context</span>) </span>{</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <p>Store to allow unbinding</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  <span class=\"hljs-keyword\">if</span> (!fn.parsleyAdaptedCallback) {\n    fn.parsleyAdaptedCallback = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n      <span class=\"hljs-keyword\">var</span> args = <span class=\"hljs-built_in\">Array</span>.prototype.slice.call(<span class=\"hljs-built_in\">arguments</span>, <span class=\"hljs-number\">0</span>);\n      args.unshift(<span class=\"hljs-keyword\">this</span>);\n      fn.apply(context || o, args);\n    };\n  }\n  <span class=\"hljs-keyword\">return</span> fn.parsleyAdaptedCallback;\n}\n\n<span class=\"hljs-keyword\">var</span> eventPrefix = <span class=\"hljs-string\">'parsley:'</span>;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              <p>Converts ‘parsley:form:validate’ into ‘form:validate’</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> <span class=\"hljs-title\">eventName</span>(<span class=\"hljs-params\">name</span>) </span>{\n  <span class=\"hljs-keyword\">if</span> (name.lastIndexOf(eventPrefix, <span class=\"hljs-number\">0</span>) === <span class=\"hljs-number\">0</span>)\n    <span class=\"hljs-keyword\">return</span> name.substr(eventPrefix.length);\n  <span class=\"hljs-keyword\">return</span> name;\n}</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <p>$.listen is deprecated. Use Parsley.on instead.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>$.listen = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">name, callback</span>) </span>{\n  <span class=\"hljs-keyword\">var</span> context;\n  deprecated();\n  <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'object'</span> === <span class=\"hljs-keyword\">typeof</span> <span class=\"hljs-built_in\">arguments</span>[<span class=\"hljs-number\">1</span>] &amp;&amp; <span class=\"hljs-string\">'function'</span> === <span class=\"hljs-keyword\">typeof</span> <span class=\"hljs-built_in\">arguments</span>[<span class=\"hljs-number\">2</span>]) {\n    context = <span class=\"hljs-built_in\">arguments</span>[<span class=\"hljs-number\">1</span>];\n    callback = <span class=\"hljs-built_in\">arguments</span>[<span class=\"hljs-number\">2</span>];\n  }\n\n  <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'function'</span> !== <span class=\"hljs-keyword\">typeof</span> callback)\n    <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Error</span>(<span class=\"hljs-string\">'Wrong parameters'</span>);\n\n  <span class=\"hljs-built_in\">window</span>.Parsley.on(eventName(name), adapt(callback, context));\n};\n\n$.listenTo = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">instance, name, fn</span>) </span>{\n  deprecated();\n  <span class=\"hljs-keyword\">if</span> (!(instance <span class=\"hljs-keyword\">instanceof</span> Field) &amp;&amp; !(instance <span class=\"hljs-keyword\">instanceof</span> Form))\n    <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Error</span>(<span class=\"hljs-string\">'Must give Parsley instance'</span>);\n\n  <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'string'</span> !== <span class=\"hljs-keyword\">typeof</span> name || <span class=\"hljs-string\">'function'</span> !== <span class=\"hljs-keyword\">typeof</span> fn)\n    <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Error</span>(<span class=\"hljs-string\">'Wrong parameters'</span>);\n\n  instance.on(eventName(name), adapt(fn));\n};\n\n$.unsubscribe = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">name, fn</span>) </span>{\n  deprecated();\n  <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'string'</span> !== <span class=\"hljs-keyword\">typeof</span> name || <span class=\"hljs-string\">'function'</span> !== <span class=\"hljs-keyword\">typeof</span> fn)\n    <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Error</span>(<span class=\"hljs-string\">'Wrong arguments'</span>);\n  <span class=\"hljs-built_in\">window</span>.Parsley.off(eventName(name), fn.parsleyAdaptedCallback);\n};\n\n$.unsubscribeTo = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">instance, name</span>) </span>{\n  deprecated();\n  <span class=\"hljs-keyword\">if</span> (!(instance <span class=\"hljs-keyword\">instanceof</span> Field) &amp;&amp; !(instance <span class=\"hljs-keyword\">instanceof</span> Form))\n    <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Error</span>(<span class=\"hljs-string\">'Must give Parsley instance'</span>);\n  instance.off(eventName(name));\n};\n\n$.unsubscribeAll = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">name</span>) </span>{\n  deprecated();\n  <span class=\"hljs-built_in\">window</span>.Parsley.off(eventName(name));\n  $(<span class=\"hljs-string\">'form,input,textarea,select'</span>).each(<span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">var</span> instance = $(<span class=\"hljs-keyword\">this</span>).data(<span class=\"hljs-string\">'Parsley'</span>);\n    <span class=\"hljs-keyword\">if</span> (instance) {\n      instance.off(eventName(name));\n    }\n  });\n};</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p>$.emit is deprecated. Use jQuery events instead.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>$.emit = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">name, instance</span>) </span>{\n  deprecated();\n  <span class=\"hljs-keyword\">var</span> instanceGiven = (instance <span class=\"hljs-keyword\">instanceof</span> Field) || (instance <span class=\"hljs-keyword\">instanceof</span> Form);\n  <span class=\"hljs-keyword\">var</span> args = <span class=\"hljs-built_in\">Array</span>.prototype.slice.call(<span class=\"hljs-built_in\">arguments</span>, instanceGiven ? <span class=\"hljs-number\">2</span> : <span class=\"hljs-number\">1</span>);\n  args.unshift(eventName(name));\n  <span class=\"hljs-keyword\">if</span> (!instanceGiven) {\n    instance = <span class=\"hljs-built_in\">window</span>.Parsley;\n  }\n  instance.trigger(...args);\n};\n\n<span class=\"hljs-keyword\">export</span> <span class=\"hljs-keyword\">default</span> {};</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n<script>var _gaq=_gaq||[];_gaq.push([\"_setAccount\",\"UA-37229467-1\"]);_gaq.push([\"_trackPageview\"]);(function(){var e=document.createElement(\"script\");e.type=\"text/javascript\";e.async=true;e.src=(\"https:\"==document.location.protocol?\"https://ssl\":\"http://www\")+\".google-analytics.com/ga.js\";var t=document.getElementsByTagName(\"script\")[0];t.parentNode.insertBefore(e,t)})();</script></body>\n</html>\n"
  },
  {
    "path": "doc/annotated-source/remote.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>remote.js</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page\"><a class=\"source\" href=\"../index.html\">&lt;&lt;&lt; back to documentation</a>\n            \n              \n              <a class=\"source\" href=\"base.html\">\n                base.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"constraint.html\">\n                constraint.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"defaults.html\">\n                defaults.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"factory.html\">\n                factory.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"field.html\">\n                field.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"form.html\">\n                form.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"main.html\">\n                main.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"multiple.html\">\n                multiple.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"pubsub.html\">\n                pubsub.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"remote.html\">\n                remote.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"ui.html\">\n                ui.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"utils.html\">\n                utils.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator.html\">\n                validator.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator_registry.html\">\n                validator_registry.js\n              </a>\n            \n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>remote.js</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              \n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">import</span> $ <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'jquery'</span>;\n<span class=\"hljs-keyword\">import</span> Utils <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./utils'</span>;\n<span class=\"hljs-keyword\">import</span> Base <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./base'</span>;\n\n<span class=\"hljs-keyword\">import</span> Parsley <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./main'</span>;\n\n$.extend(<span class=\"hljs-literal\">true</span>, Parsley, {\n  <span class=\"hljs-attr\">asyncValidators</span>: {\n    <span class=\"hljs-string\">'default'</span>: {\n      <span class=\"hljs-attr\">fn</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">xhr</span>) </span>{</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <p>By default, only status 2xx are deemed successful.\nNote: we use status instead of state() because responses with status 200\nbut invalid messages (e.g. an empty body for content type set to JSON) will\nresult in state() === ‘rejected’.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">return</span> xhr.status &gt;= <span class=\"hljs-number\">200</span> &amp;&amp; xhr.status &lt; <span class=\"hljs-number\">300</span>;\n      },\n      <span class=\"hljs-attr\">url</span>: <span class=\"hljs-literal\">false</span>\n    },\n    <span class=\"hljs-attr\">reverse</span>: {\n      <span class=\"hljs-attr\">fn</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">xhr</span>) </span>{</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <p>If reverse option is set, a failing ajax request is considered successful</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-keyword\">return</span> xhr.status &lt; <span class=\"hljs-number\">200</span> || xhr.status &gt;= <span class=\"hljs-number\">300</span>;\n      },\n      <span class=\"hljs-attr\">url</span>: <span class=\"hljs-literal\">false</span>\n    }\n  },\n\n  <span class=\"hljs-attr\">addAsyncValidator</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">name, fn, url, options</span>) </span>{\n    Parsley.asyncValidators[name] = {\n      <span class=\"hljs-attr\">fn</span>: fn,\n      <span class=\"hljs-attr\">url</span>: url || <span class=\"hljs-literal\">false</span>,\n      <span class=\"hljs-attr\">options</span>: options || {}\n    };\n\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>;\n  }\n\n});\n\nParsley.addValidator(<span class=\"hljs-string\">'remote'</span>, {\n  <span class=\"hljs-attr\">requirementType</span>: {\n    <span class=\"hljs-string\">''</span>: <span class=\"hljs-string\">'string'</span>,\n    <span class=\"hljs-string\">'validator'</span>: <span class=\"hljs-string\">'string'</span>,\n    <span class=\"hljs-string\">'reverse'</span>: <span class=\"hljs-string\">'boolean'</span>,\n    <span class=\"hljs-string\">'options'</span>: <span class=\"hljs-string\">'object'</span>\n  },\n\n  <span class=\"hljs-attr\">validateString</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">value, url, options, instance</span>) </span>{\n    <span class=\"hljs-keyword\">var</span> data = {};\n    <span class=\"hljs-keyword\">var</span> ajaxOptions;\n    <span class=\"hljs-keyword\">var</span> csr;\n    <span class=\"hljs-keyword\">var</span> validator = options.validator || (<span class=\"hljs-literal\">true</span> === options.reverse ? <span class=\"hljs-string\">'reverse'</span> : <span class=\"hljs-string\">'default'</span>);\n\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'undefined'</span> === <span class=\"hljs-keyword\">typeof</span> Parsley.asyncValidators[validator])\n      <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Error</span>(<span class=\"hljs-string\">'Calling an undefined async validator: `'</span> + validator + <span class=\"hljs-string\">'`'</span>);\n\n    url = Parsley.asyncValidators[validator].url || url;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              <p>Fill current value</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (url.indexOf(<span class=\"hljs-string\">'{value}'</span>) &gt; <span class=\"hljs-number\">-1</span>) {\n      url = url.replace(<span class=\"hljs-string\">'{value}'</span>, <span class=\"hljs-built_in\">encodeURIComponent</span>(value));\n    } <span class=\"hljs-keyword\">else</span> {\n      data[instance.element.getAttribute(<span class=\"hljs-string\">'name'</span>) || instance.element.getAttribute(<span class=\"hljs-string\">'id'</span>)] = value;\n    }</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <p>Merge options passed in from the function with the ones in the attribute</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">var</span> remoteOptions = $.extend(<span class=\"hljs-literal\">true</span>, options.options || {} , Parsley.asyncValidators[validator].options);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p>All <code>$.ajax(options)</code> could be overridden or extended directly from DOM in <code>data-parsley-remote-options</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    ajaxOptions = $.extend(<span class=\"hljs-literal\">true</span>, {}, {\n      <span class=\"hljs-attr\">url</span>: url,\n      <span class=\"hljs-attr\">data</span>: data,\n      <span class=\"hljs-attr\">type</span>: <span class=\"hljs-string\">'GET'</span>\n    }, remoteOptions);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>\n              </div>\n              <p>Generate store key based on ajax options</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    instance.trigger(<span class=\"hljs-string\">'field:ajaxoptions'</span>, instance, ajaxOptions);\n\n    csr = $.param(ajaxOptions);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>\n              </div>\n              <p>Initialise querry cache</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'undefined'</span> === <span class=\"hljs-keyword\">typeof</span> Parsley._remoteCache)\n      Parsley._remoteCache = {};</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>\n              </div>\n              <p>Try to retrieve stored xhr</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">var</span> xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n    <span class=\"hljs-keyword\">var</span> handleXhr = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n      <span class=\"hljs-keyword\">var</span> result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n      <span class=\"hljs-keyword\">if</span> (!result) <span class=\"hljs-comment\">// Map falsy results to rejected promise</span>\n        result = $.Deferred().reject();\n      <span class=\"hljs-keyword\">return</span> $.when(result);\n    };\n\n    <span class=\"hljs-keyword\">return</span> xhr.then(handleXhr, handleXhr);\n  },\n\n  <span class=\"hljs-attr\">priority</span>: <span class=\"hljs-number\">-1</span>\n});\n\nParsley.on(<span class=\"hljs-string\">'form:submit'</span>, <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n  Parsley._remoteCache = {};\n});\n\nBase.prototype.addAsyncValidator = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n  Utils.warnOnce(<span class=\"hljs-string\">'Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`'</span>);\n  <span class=\"hljs-keyword\">return</span> Parsley.addAsyncValidator(...arguments);\n};</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n<script>var _gaq=_gaq||[];_gaq.push([\"_setAccount\",\"UA-37229467-1\"]);_gaq.push([\"_trackPageview\"]);(function(){var e=document.createElement(\"script\");e.type=\"text/javascript\";e.async=true;e.src=(\"https:\"==document.location.protocol?\"https://ssl\":\"http://www\")+\".google-analytics.com/ga.js\";var t=document.getElementsByTagName(\"script\")[0];t.parentNode.insertBefore(e,t)})();</script></body>\n</html>\n"
  },
  {
    "path": "doc/annotated-source/ui.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>ui.js</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page\"><a class=\"source\" href=\"../index.html\">&lt;&lt;&lt; back to documentation</a>\n            \n              \n              <a class=\"source\" href=\"base.html\">\n                base.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"constraint.html\">\n                constraint.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"defaults.html\">\n                defaults.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"factory.html\">\n                factory.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"field.html\">\n                field.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"form.html\">\n                form.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"main.html\">\n                main.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"multiple.html\">\n                multiple.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"pubsub.html\">\n                pubsub.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"remote.html\">\n                remote.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"ui.html\">\n                ui.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"utils.html\">\n                utils.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator.html\">\n                validator.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator_registry.html\">\n                validator_registry.js\n              </a>\n            \n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>ui.js</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              \n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">import</span> $ <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'jquery'</span>;\n<span class=\"hljs-keyword\">import</span> Utils <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./utils'</span>;\n\n<span class=\"hljs-keyword\">var</span> UI = {};\n\n<span class=\"hljs-keyword\">var</span> diffResults = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">newResult, oldResult, deep</span>) </span>{\n  <span class=\"hljs-keyword\">var</span> added = [];\n  <span class=\"hljs-keyword\">var</span> kept = [];\n\n  <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">var</span> i = <span class=\"hljs-number\">0</span>; i &lt; newResult.length; i++) {\n    <span class=\"hljs-keyword\">var</span> found = <span class=\"hljs-literal\">false</span>;\n\n    <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">var</span> j = <span class=\"hljs-number\">0</span>; j &lt; oldResult.length; j++)\n      <span class=\"hljs-keyword\">if</span> (newResult[i].assert.name === oldResult[j].assert.name) {\n        found = <span class=\"hljs-literal\">true</span>;\n        <span class=\"hljs-keyword\">break</span>;\n      }\n\n    <span class=\"hljs-keyword\">if</span> (found)\n      kept.push(newResult[i]);\n    <span class=\"hljs-keyword\">else</span>\n      added.push(newResult[i]);\n  }\n\n  <span class=\"hljs-keyword\">return</span> {\n    <span class=\"hljs-attr\">kept</span>: kept,\n    <span class=\"hljs-attr\">added</span>: added,\n    <span class=\"hljs-attr\">removed</span>: !deep ? diffResults(oldResult, newResult, <span class=\"hljs-literal\">true</span>).added : []\n  };\n};\n\nUI.Form = {\n\n  <span class=\"hljs-attr\">_actualizeTriggers</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">this</span>.$element.on(<span class=\"hljs-string\">'submit.Parsley'</span>, evt =&gt; { <span class=\"hljs-keyword\">this</span>.onSubmitValidate(evt); });\n    <span class=\"hljs-keyword\">this</span>.$element.on(<span class=\"hljs-string\">'click.Parsley'</span>, Utils._SubmitSelector, evt =&gt; { <span class=\"hljs-keyword\">this</span>.onSubmitButton(evt); });</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <p>UI could be disabled</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-literal\">false</span> === <span class=\"hljs-keyword\">this</span>.options.uiEnabled)\n      <span class=\"hljs-keyword\">return</span>;\n\n    <span class=\"hljs-keyword\">this</span>.element.setAttribute(<span class=\"hljs-string\">'novalidate'</span>, <span class=\"hljs-string\">''</span>);\n  },\n\n  <span class=\"hljs-attr\">focus</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">this</span>._focusedField = <span class=\"hljs-literal\">null</span>;\n\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-literal\">true</span> === <span class=\"hljs-keyword\">this</span>.validationResult || <span class=\"hljs-string\">'none'</span> === <span class=\"hljs-keyword\">this</span>.options.focus)\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">null</span>;\n\n    <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">var</span> i = <span class=\"hljs-number\">0</span>; i &lt; <span class=\"hljs-keyword\">this</span>.fields.length; i++) {\n      <span class=\"hljs-keyword\">var</span> field = <span class=\"hljs-keyword\">this</span>.fields[i];\n      <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-literal\">true</span> !== field.validationResult &amp;&amp; field.validationResult.length &gt; <span class=\"hljs-number\">0</span> &amp;&amp; <span class=\"hljs-string\">'undefined'</span> === <span class=\"hljs-keyword\">typeof</span> field.options.noFocus) {\n        <span class=\"hljs-keyword\">this</span>._focusedField = field.$element;\n        <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'first'</span> === <span class=\"hljs-keyword\">this</span>.options.focus)\n          <span class=\"hljs-keyword\">break</span>;\n      }\n    }\n\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-literal\">null</span> === <span class=\"hljs-keyword\">this</span>._focusedField)\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">null</span>;\n\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>._focusedField.focus();\n  },\n\n  <span class=\"hljs-attr\">_destroyUI</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <p>Reset all event listeners</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">this</span>.$element.off(<span class=\"hljs-string\">'.Parsley'</span>);\n  }\n\n};\n\nUI.Field = {\n\n  <span class=\"hljs-attr\">_reflowUI</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">this</span>._buildUI();</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              <p>If this field doesn’t have an active UI don’t bother doing something</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (!<span class=\"hljs-keyword\">this</span>._ui)\n      <span class=\"hljs-keyword\">return</span>;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <p>Diff between two validation results</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">var</span> diff = diffResults(<span class=\"hljs-keyword\">this</span>.validationResult, <span class=\"hljs-keyword\">this</span>._ui.lastValidationResult);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p>Then store current validation result for next reflow</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">this</span>._ui.lastValidationResult = <span class=\"hljs-keyword\">this</span>.validationResult;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>\n              </div>\n              <p>Handle valid / invalid / none field class</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">this</span>._manageStatusClass();</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>\n              </div>\n              <p>Add, remove, updated errors messages</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">this</span>._manageErrorsMessages(diff);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>\n              </div>\n              <p>Triggers impl</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">this</span>._actualizeTriggers();</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>\n              </div>\n              <p>If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> ((diff.kept.length || diff.added.length) &amp;&amp; !<span class=\"hljs-keyword\">this</span>._failedOnce) {\n      <span class=\"hljs-keyword\">this</span>._failedOnce = <span class=\"hljs-literal\">true</span>;\n      <span class=\"hljs-keyword\">this</span>._actualizeTriggers();\n    }\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>\n              </div>\n              <p>Returns an array of field’s error message(s)</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  getErrorsMessages: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>\n              </div>\n              <p>No error message, field is valid</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-literal\">true</span> === <span class=\"hljs-keyword\">this</span>.validationResult)\n      <span class=\"hljs-keyword\">return</span> [];\n\n    <span class=\"hljs-keyword\">var</span> messages = [];\n\n    <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">var</span> i = <span class=\"hljs-number\">0</span>; i &lt; <span class=\"hljs-keyword\">this</span>.validationResult.length; i++)\n      messages.push(<span class=\"hljs-keyword\">this</span>.validationResult[i].errorMessage ||\n       <span class=\"hljs-keyword\">this</span>._getErrorMessage(<span class=\"hljs-keyword\">this</span>.validationResult[i].assert));\n\n    <span class=\"hljs-keyword\">return</span> messages;\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>\n              </div>\n              <p>It’s a goal of Parsley that this method is no longer required [#1073]</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  addError: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">name, {message, assert, updateClass = true} = {}</span>) </span>{\n    <span class=\"hljs-keyword\">this</span>._buildUI();\n    <span class=\"hljs-keyword\">this</span>._addError(name, {message, assert});\n\n    <span class=\"hljs-keyword\">if</span> (updateClass)\n      <span class=\"hljs-keyword\">this</span>._errorClass();\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>\n              </div>\n              <p>It’s a goal of Parsley that this method is no longer required [#1073]</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  updateError: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">name, {message, assert, updateClass = true} = {}</span>) </span>{\n    <span class=\"hljs-keyword\">this</span>._buildUI();\n    <span class=\"hljs-keyword\">this</span>._updateError(name, {message, assert});\n\n    <span class=\"hljs-keyword\">if</span> (updateClass)\n      <span class=\"hljs-keyword\">this</span>._errorClass();\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>\n              </div>\n              <p>It’s a goal of Parsley that this method is no longer required [#1073]</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  removeError: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">name, {updateClass = true} = {}</span>) </span>{\n    <span class=\"hljs-keyword\">this</span>._buildUI();\n    <span class=\"hljs-keyword\">this</span>._removeError(name);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-16\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>\n              </div>\n              <p>edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\nbut highly improbable cuz’ manually removing a well Parsley handled error makes no sense.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (updateClass)\n      <span class=\"hljs-keyword\">this</span>._manageStatusClass();\n  },\n\n  <span class=\"hljs-attr\">_manageStatusClass</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-keyword\">this</span>.hasConstraints() &amp;&amp; <span class=\"hljs-keyword\">this</span>.needsValidation() &amp;&amp; <span class=\"hljs-literal\">true</span> === <span class=\"hljs-keyword\">this</span>.validationResult)\n      <span class=\"hljs-keyword\">this</span>._successClass();\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-keyword\">this</span>.validationResult.length &gt; <span class=\"hljs-number\">0</span>)\n      <span class=\"hljs-keyword\">this</span>._errorClass();\n    <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-keyword\">this</span>._resetClass();\n  },\n\n  <span class=\"hljs-attr\">_manageErrorsMessages</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">diff</span>) </span>{\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'undefined'</span> !== <span class=\"hljs-keyword\">typeof</span> <span class=\"hljs-keyword\">this</span>.options.errorsMessagesDisabled)\n      <span class=\"hljs-keyword\">return</span>;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-17\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>\n              </div>\n              <p>Case where we have errorMessage option that configure an unique field error message, regardless failing validators</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'undefined'</span> !== <span class=\"hljs-keyword\">typeof</span> <span class=\"hljs-keyword\">this</span>.options.errorMessage) {\n      <span class=\"hljs-keyword\">if</span> ((diff.added.length || diff.kept.length)) {\n        <span class=\"hljs-keyword\">this</span>._insertErrorWrapper();\n\n        <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-number\">0</span> === <span class=\"hljs-keyword\">this</span>._ui.$errorsWrapper.find(<span class=\"hljs-string\">'.parsley-custom-error-message'</span>).length)\n          <span class=\"hljs-keyword\">this</span>._ui.$errorsWrapper\n            .append(\n              $(<span class=\"hljs-keyword\">this</span>.options.errorTemplate)\n              .addClass(<span class=\"hljs-string\">'parsley-custom-error-message'</span>)\n            );\n\n        <span class=\"hljs-keyword\">this</span>._ui.$errorClassHandler.attr(<span class=\"hljs-string\">'aria-describedby'</span>, <span class=\"hljs-keyword\">this</span>._ui.errorsWrapperId);\n\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>._ui.$errorsWrapper\n          .addClass(<span class=\"hljs-string\">'filled'</span>)\n          .attr(<span class=\"hljs-string\">'aria-hidden'</span>, <span class=\"hljs-string\">'false'</span>)\n          .find(<span class=\"hljs-string\">'.parsley-custom-error-message'</span>)\n          .html(<span class=\"hljs-keyword\">this</span>.options.errorMessage);\n      }\n\n      <span class=\"hljs-keyword\">this</span>._ui.$errorClassHandler.removeAttr(<span class=\"hljs-string\">'aria-describedby'</span>);\n\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>._ui.$errorsWrapper\n        .removeClass(<span class=\"hljs-string\">'filled'</span>)\n        .attr(<span class=\"hljs-string\">'aria-hidden'</span>, <span class=\"hljs-string\">'true'</span>)\n        .find(<span class=\"hljs-string\">'.parsley-custom-error-message'</span>)\n        .remove();\n    }</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-18\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>\n              </div>\n              <p>Show, hide, update failing constraints messages</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">var</span> i = <span class=\"hljs-number\">0</span>; i &lt; diff.removed.length; i++)\n      <span class=\"hljs-keyword\">this</span>._removeError(diff.removed[i].assert.name);\n\n    <span class=\"hljs-keyword\">for</span> (i = <span class=\"hljs-number\">0</span>; i &lt; diff.added.length; i++)\n      <span class=\"hljs-keyword\">this</span>._addError(diff.added[i].assert.name, {<span class=\"hljs-attr\">message</span>: diff.added[i].errorMessage, <span class=\"hljs-attr\">assert</span>: diff.added[i].assert});\n\n    <span class=\"hljs-keyword\">for</span> (i = <span class=\"hljs-number\">0</span>; i &lt; diff.kept.length; i++)\n      <span class=\"hljs-keyword\">this</span>._updateError(diff.kept[i].assert.name, {<span class=\"hljs-attr\">message</span>: diff.kept[i].errorMessage, <span class=\"hljs-attr\">assert</span>: diff.kept[i].assert});\n  },\n\n\n  <span class=\"hljs-attr\">_addError</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">name, {message, assert}</span>) </span>{\n    <span class=\"hljs-keyword\">this</span>._insertErrorWrapper();\n    <span class=\"hljs-keyword\">this</span>._ui.$errorClassHandler\n      .attr(<span class=\"hljs-string\">'aria-describedby'</span>, <span class=\"hljs-keyword\">this</span>._ui.errorsWrapperId);\n    <span class=\"hljs-keyword\">this</span>._ui.$errorsWrapper\n      .addClass(<span class=\"hljs-string\">'filled'</span>)\n      .attr(<span class=\"hljs-string\">'aria-hidden'</span>, <span class=\"hljs-string\">'false'</span>)\n      .append(\n        $(<span class=\"hljs-keyword\">this</span>.options.errorTemplate)\n        .addClass(<span class=\"hljs-string\">'parsley-'</span> + name)\n        .html(message || <span class=\"hljs-keyword\">this</span>._getErrorMessage(assert))\n      );\n  },\n\n  <span class=\"hljs-attr\">_updateError</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">name, {message, assert}</span>) </span>{\n    <span class=\"hljs-keyword\">this</span>._ui.$errorsWrapper\n      .addClass(<span class=\"hljs-string\">'filled'</span>)\n      .find(<span class=\"hljs-string\">'.parsley-'</span> + name)\n      .html(message || <span class=\"hljs-keyword\">this</span>._getErrorMessage(assert));\n  },\n\n  <span class=\"hljs-attr\">_removeError</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">name</span>) </span>{\n    <span class=\"hljs-keyword\">this</span>._ui.$errorClassHandler\n      .removeAttr(<span class=\"hljs-string\">'aria-describedby'</span>);\n    <span class=\"hljs-keyword\">this</span>._ui.$errorsWrapper\n      .removeClass(<span class=\"hljs-string\">'filled'</span>)\n      .attr(<span class=\"hljs-string\">'aria-hidden'</span>, <span class=\"hljs-string\">'true'</span>)\n      .find(<span class=\"hljs-string\">'.parsley-'</span> + name)\n      .remove();\n  },\n\n  <span class=\"hljs-attr\">_getErrorMessage</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">constraint</span>) </span>{\n    <span class=\"hljs-keyword\">var</span> customConstraintErrorMessage = constraint.name + <span class=\"hljs-string\">'Message'</span>;\n\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'undefined'</span> !== <span class=\"hljs-keyword\">typeof</span> <span class=\"hljs-keyword\">this</span>.options[customConstraintErrorMessage])\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-built_in\">window</span>.Parsley.formatMessage(<span class=\"hljs-keyword\">this</span>.options[customConstraintErrorMessage], constraint.requirements);\n\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-built_in\">window</span>.Parsley.getErrorMessage(constraint);\n  },\n\n  <span class=\"hljs-attr\">_buildUI</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-19\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>\n              </div>\n              <p>UI could be already built or disabled</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-keyword\">this</span>._ui || <span class=\"hljs-literal\">false</span> === <span class=\"hljs-keyword\">this</span>.options.uiEnabled)\n      <span class=\"hljs-keyword\">return</span>;\n\n    <span class=\"hljs-keyword\">var</span> _ui = {};</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-20\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>\n              </div>\n              <p>Give field its Parsley id in DOM</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">this</span>.element.setAttribute(<span class=\"hljs-keyword\">this</span>.options.namespace + <span class=\"hljs-string\">'id'</span>, <span class=\"hljs-keyword\">this</span>.__id__);\n\n    <span class=\"hljs-comment\">/** Generate important UI elements and store them in this **/</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-21\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>\n              </div>\n              <p>$errorClassHandler is the $element that woul have parsley-error and parsley-success classes</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    _ui.$errorClassHandler = <span class=\"hljs-keyword\">this</span>._manageClassHandler();</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-22\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-22\">&#182;</a>\n              </div>\n              <p>$errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    _ui.errorsWrapperId = <span class=\"hljs-string\">'parsley-id-'</span> + (<span class=\"hljs-keyword\">this</span>.options.multiple ? <span class=\"hljs-string\">'multiple-'</span> + <span class=\"hljs-keyword\">this</span>.options.multiple : <span class=\"hljs-keyword\">this</span>.__id__);\n    _ui.$errorsWrapper = $(<span class=\"hljs-keyword\">this</span>.options.errorsWrapper).attr(<span class=\"hljs-string\">'id'</span>, _ui.errorsWrapperId);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-23\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-23\">&#182;</a>\n              </div>\n              <p>ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    _ui.lastValidationResult = [];\n    _ui.validationInformationVisible = <span class=\"hljs-literal\">false</span>;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-24\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-24\">&#182;</a>\n              </div>\n              <p>Store it in this for later</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">this</span>._ui = _ui;\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-25\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-25\">&#182;</a>\n              </div>\n              <p>Determine which element will have <code>parsley-error</code> and <code>parsley-success</code> classes</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  _manageClassHandler: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-26\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-26\">&#182;</a>\n              </div>\n              <p>Class handled could also be determined by function given in Parsley options</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'string'</span> === <span class=\"hljs-keyword\">typeof</span> <span class=\"hljs-keyword\">this</span>.options.classHandler &amp;&amp; $(<span class=\"hljs-keyword\">this</span>.options.classHandler).length)\n      <span class=\"hljs-keyword\">return</span> $(<span class=\"hljs-keyword\">this</span>.options.classHandler);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-27\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-27\">&#182;</a>\n              </div>\n              <p>Class handled could also be determined by function given in Parsley options</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">var</span> $handlerFunction = <span class=\"hljs-keyword\">this</span>.options.classHandler;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-28\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-28\">&#182;</a>\n              </div>\n              <p>It might also be the function name of a global function</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'string'</span> === <span class=\"hljs-keyword\">typeof</span> <span class=\"hljs-keyword\">this</span>.options.classHandler &amp;&amp; <span class=\"hljs-string\">'function'</span> === <span class=\"hljs-keyword\">typeof</span> <span class=\"hljs-built_in\">window</span>[<span class=\"hljs-keyword\">this</span>.options.classHandler])\n      $handlerFunction = <span class=\"hljs-built_in\">window</span>[<span class=\"hljs-keyword\">this</span>.options.classHandler];\n\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'function'</span> === <span class=\"hljs-keyword\">typeof</span> $handlerFunction) {\n      <span class=\"hljs-keyword\">var</span> $handler = $handlerFunction.call(<span class=\"hljs-keyword\">this</span>, <span class=\"hljs-keyword\">this</span>);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-29\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-29\">&#182;</a>\n              </div>\n              <p>If this function returned a valid existing DOM element, go for it</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'undefined'</span> !== <span class=\"hljs-keyword\">typeof</span> $handler &amp;&amp; $handler.length)\n        <span class=\"hljs-keyword\">return</span> $handler;\n    } <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'object'</span> === <span class=\"hljs-keyword\">typeof</span> $handlerFunction &amp;&amp; $handlerFunction <span class=\"hljs-keyword\">instanceof</span> jQuery &amp;&amp; $handlerFunction.length) {\n      <span class=\"hljs-keyword\">return</span> $handlerFunction;\n    } <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> ($handlerFunction) {\n      Utils.warn(<span class=\"hljs-string\">'The class handler `'</span> + $handlerFunction + <span class=\"hljs-string\">'` does not exist in DOM nor as a global JS function'</span>);\n    }\n\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>._inputHolder();\n  },\n\n  <span class=\"hljs-attr\">_inputHolder</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\"></span>) </span>{</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-30\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-30\">&#182;</a>\n              </div>\n              <p>if simple element (input, texatrea, select…) it will perfectly host the classes and precede the error container</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (!<span class=\"hljs-keyword\">this</span>.options.multiple || <span class=\"hljs-keyword\">this</span>.element.nodeName === <span class=\"hljs-string\">'SELECT'</span>)\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.$element;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-31\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-31\">&#182;</a>\n              </div>\n              <p>But if multiple element (radio, checkbox), that would be their parent</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.$element.parent();\n  },\n\n  <span class=\"hljs-attr\">_insertErrorWrapper</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">var</span> $errorsContainer = <span class=\"hljs-keyword\">this</span>.options.errorsContainer;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-32\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-32\">&#182;</a>\n              </div>\n              <p>Nothing to do if already inserted</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-number\">0</span> !== <span class=\"hljs-keyword\">this</span>._ui.$errorsWrapper.parent().length)\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>._ui.$errorsWrapper.parent();\n\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'string'</span> === <span class=\"hljs-keyword\">typeof</span> $errorsContainer) {\n      <span class=\"hljs-keyword\">if</span> ($($errorsContainer).length)\n        <span class=\"hljs-keyword\">return</span> $($errorsContainer).append(<span class=\"hljs-keyword\">this</span>._ui.$errorsWrapper);\n      <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'function'</span> === <span class=\"hljs-keyword\">typeof</span> <span class=\"hljs-built_in\">window</span>[$errorsContainer])\n        $errorsContainer = <span class=\"hljs-built_in\">window</span>[$errorsContainer];\n      <span class=\"hljs-keyword\">else</span>\n        Utils.warn(<span class=\"hljs-string\">'The errors container `'</span> + $errorsContainer + <span class=\"hljs-string\">'` does not exist in DOM nor as a global JS function'</span>);\n    }\n\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'function'</span> === <span class=\"hljs-keyword\">typeof</span> $errorsContainer)\n      $errorsContainer = $errorsContainer.call(<span class=\"hljs-keyword\">this</span>, <span class=\"hljs-keyword\">this</span>);\n\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'object'</span> === <span class=\"hljs-keyword\">typeof</span> $errorsContainer &amp;&amp; $errorsContainer.length)\n      <span class=\"hljs-keyword\">return</span> $errorsContainer.append(<span class=\"hljs-keyword\">this</span>._ui.$errorsWrapper);\n\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>._inputHolder().after(<span class=\"hljs-keyword\">this</span>._ui.$errorsWrapper);\n  },\n\n  <span class=\"hljs-attr\">_actualizeTriggers</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">var</span> $toBind = <span class=\"hljs-keyword\">this</span>._findRelated();\n    <span class=\"hljs-keyword\">var</span> trigger;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-33\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-33\">&#182;</a>\n              </div>\n              <p>Remove Parsley events already bound on this field</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    $toBind.off(<span class=\"hljs-string\">'.Parsley'</span>);\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-keyword\">this</span>._failedOnce)\n      $toBind.on(Utils.namespaceEvents(<span class=\"hljs-keyword\">this</span>.options.triggerAfterFailure, <span class=\"hljs-string\">'Parsley'</span>), () =&gt; {\n        <span class=\"hljs-keyword\">this</span>._validateIfNeeded();\n      });\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> (trigger = Utils.namespaceEvents(<span class=\"hljs-keyword\">this</span>.options.trigger, <span class=\"hljs-string\">'Parsley'</span>)) {\n      $toBind.on(trigger, event =&gt; {\n        <span class=\"hljs-keyword\">this</span>._validateIfNeeded(event);\n      });\n    }\n  },\n\n  <span class=\"hljs-attr\">_validateIfNeeded</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">event</span>) </span>{</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-34\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-34\">&#182;</a>\n              </div>\n              <p>For keyup, keypress, keydown, input… events that could be a little bit obstrusive\ndo not validate if val length &lt; min threshold on first validation. Once field have been validated once and info\nabout success or failure have been displayed, always validate with this trigger to reflect every yalidation change.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (event &amp;&amp; <span class=\"hljs-regexp\">/key|input/</span>.test(event.type))\n      <span class=\"hljs-keyword\">if</span> (!(<span class=\"hljs-keyword\">this</span>._ui &amp;&amp; <span class=\"hljs-keyword\">this</span>._ui.validationInformationVisible) &amp;&amp; <span class=\"hljs-keyword\">this</span>.getValue().length &lt;= <span class=\"hljs-keyword\">this</span>.options.validationThreshold)\n        <span class=\"hljs-keyword\">return</span>;\n\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-keyword\">this</span>.options.debounce) {\n      <span class=\"hljs-built_in\">window</span>.clearTimeout(<span class=\"hljs-keyword\">this</span>._debounced);\n      <span class=\"hljs-keyword\">this</span>._debounced = <span class=\"hljs-built_in\">window</span>.setTimeout(<span class=\"hljs-function\"><span class=\"hljs-params\">()</span> =&gt;</span> <span class=\"hljs-keyword\">this</span>.validate(), <span class=\"hljs-keyword\">this</span>.options.debounce);\n    } <span class=\"hljs-keyword\">else</span>\n      <span class=\"hljs-keyword\">this</span>.validate();\n  },\n\n  <span class=\"hljs-attr\">_resetUI</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-35\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-35\">&#182;</a>\n              </div>\n              <p>Reset all event listeners</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">this</span>._failedOnce = <span class=\"hljs-literal\">false</span>;\n    <span class=\"hljs-keyword\">this</span>._actualizeTriggers();</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-36\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-36\">&#182;</a>\n              </div>\n              <p>Nothing to do if UI never initialized for this field</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'undefined'</span> === <span class=\"hljs-keyword\">typeof</span> <span class=\"hljs-keyword\">this</span>._ui)\n      <span class=\"hljs-keyword\">return</span>;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-37\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-37\">&#182;</a>\n              </div>\n              <p>Reset all errors’ li</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">this</span>._ui.$errorsWrapper\n      .removeClass(<span class=\"hljs-string\">'filled'</span>)\n      .children()\n      .remove();</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-38\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-38\">&#182;</a>\n              </div>\n              <p>Reset validation class</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">this</span>._resetClass();</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-39\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-39\">&#182;</a>\n              </div>\n              <p>Reset validation flags and last validation result</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">this</span>._ui.lastValidationResult = [];\n    <span class=\"hljs-keyword\">this</span>._ui.validationInformationVisible = <span class=\"hljs-literal\">false</span>;\n  },\n\n  <span class=\"hljs-attr\">_destroyUI</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">this</span>._resetUI();\n\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'undefined'</span> !== <span class=\"hljs-keyword\">typeof</span> <span class=\"hljs-keyword\">this</span>._ui)\n      <span class=\"hljs-keyword\">this</span>._ui.$errorsWrapper.remove();\n\n    <span class=\"hljs-keyword\">delete</span> <span class=\"hljs-keyword\">this</span>._ui;\n  },\n\n  <span class=\"hljs-attr\">_successClass</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">this</span>._ui.validationInformationVisible = <span class=\"hljs-literal\">true</span>;\n    <span class=\"hljs-keyword\">this</span>._ui.$errorClassHandler.removeClass(<span class=\"hljs-keyword\">this</span>.options.errorClass).addClass(<span class=\"hljs-keyword\">this</span>.options.successClass);\n  },\n  <span class=\"hljs-attr\">_errorClass</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">this</span>._ui.validationInformationVisible = <span class=\"hljs-literal\">true</span>;\n    <span class=\"hljs-keyword\">this</span>._ui.$errorClassHandler.removeClass(<span class=\"hljs-keyword\">this</span>.options.successClass).addClass(<span class=\"hljs-keyword\">this</span>.options.errorClass);\n  },\n  <span class=\"hljs-attr\">_resetClass</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">this</span>._ui.$errorClassHandler.removeClass(<span class=\"hljs-keyword\">this</span>.options.successClass).removeClass(<span class=\"hljs-keyword\">this</span>.options.errorClass);\n  }\n};\n\n<span class=\"hljs-keyword\">export</span> <span class=\"hljs-keyword\">default</span> UI;</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n<script>var _gaq=_gaq||[];_gaq.push([\"_setAccount\",\"UA-37229467-1\"]);_gaq.push([\"_trackPageview\"]);(function(){var e=document.createElement(\"script\");e.type=\"text/javascript\";e.async=true;e.src=(\"https:\"==document.location.protocol?\"https://ssl\":\"http://www\")+\".google-analytics.com/ga.js\";var t=document.getElementsByTagName(\"script\")[0];t.parentNode.insertBefore(e,t)})();</script></body>\n</html>\n"
  },
  {
    "path": "doc/annotated-source/utils.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>utils.js</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page\"><a class=\"source\" href=\"../index.html\">&lt;&lt;&lt; back to documentation</a>\n            \n              \n              <a class=\"source\" href=\"base.html\">\n                base.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"constraint.html\">\n                constraint.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"defaults.html\">\n                defaults.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"factory.html\">\n                factory.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"field.html\">\n                field.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"form.html\">\n                form.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"main.html\">\n                main.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"multiple.html\">\n                multiple.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"pubsub.html\">\n                pubsub.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"remote.html\">\n                remote.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"ui.html\">\n                ui.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"utils.html\">\n                utils.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator.html\">\n                validator.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator_registry.html\">\n                validator_registry.js\n              </a>\n            \n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>utils.js</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              \n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">import</span> $ <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'jquery'</span>;\n\n<span class=\"hljs-keyword\">var</span> globalID = <span class=\"hljs-number\">1</span>;\n<span class=\"hljs-keyword\">var</span> pastWarnings = {};\n\n<span class=\"hljs-keyword\">var</span> Utils = {</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <p>Parsley DOM-API\nreturns object from dom attributes and values</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  attr: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">element, namespace, obj</span>) </span>{\n    <span class=\"hljs-keyword\">var</span> i;\n    <span class=\"hljs-keyword\">var</span> attribute;\n    <span class=\"hljs-keyword\">var</span> attributes;\n    <span class=\"hljs-keyword\">var</span> regex = <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">RegExp</span>(<span class=\"hljs-string\">'^'</span> + namespace, <span class=\"hljs-string\">'i'</span>);\n\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'undefined'</span> === <span class=\"hljs-keyword\">typeof</span> obj)\n      obj = {};\n    <span class=\"hljs-keyword\">else</span> {</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <p>Clear all own properties. This won’t affect prototype’s values</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">for</span> (i <span class=\"hljs-keyword\">in</span> obj) {\n        <span class=\"hljs-keyword\">if</span> (obj.hasOwnProperty(i))\n          <span class=\"hljs-keyword\">delete</span> obj[i];\n      }\n    }\n\n    <span class=\"hljs-keyword\">if</span> (!element)\n      <span class=\"hljs-keyword\">return</span> obj;\n\n    attributes = element.attributes;\n    <span class=\"hljs-keyword\">for</span> (i = attributes.length; i--; ) {\n      attribute = attributes[i];\n\n      <span class=\"hljs-keyword\">if</span> (attribute &amp;&amp; attribute.specified &amp;&amp; regex.test(attribute.name)) {\n        obj[<span class=\"hljs-keyword\">this</span>.camelize(attribute.name.slice(namespace.length))] = <span class=\"hljs-keyword\">this</span>.deserializeValue(attribute.value);\n      }\n    }\n\n    <span class=\"hljs-keyword\">return</span> obj;\n  },\n\n  <span class=\"hljs-attr\">checkAttr</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">element, namespace, checkAttr</span>) </span>{\n    <span class=\"hljs-keyword\">return</span> element.hasAttribute(namespace + checkAttr);\n  },\n\n  <span class=\"hljs-attr\">setAttr</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">element, namespace, attr, value</span>) </span>{\n    element.setAttribute(<span class=\"hljs-keyword\">this</span>.dasherize(namespace + attr), <span class=\"hljs-built_in\">String</span>(value));\n  },\n\n  <span class=\"hljs-attr\">getType</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">element</span>) </span>{\n    <span class=\"hljs-keyword\">return</span> element.getAttribute(<span class=\"hljs-string\">'type'</span>) || <span class=\"hljs-string\">'text'</span>;\n  },\n\n  <span class=\"hljs-attr\">generateID</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">''</span> + globalID++;\n  },\n\n  <span class=\"hljs-comment\">/** Third party functions **/</span>\n  <span class=\"hljs-attr\">deserializeValue</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">value</span>) </span>{\n    <span class=\"hljs-keyword\">var</span> num;\n\n    <span class=\"hljs-keyword\">try</span> {\n      <span class=\"hljs-keyword\">return</span> value ?\n        value == <span class=\"hljs-string\">\"true\"</span> ||\n        (value == <span class=\"hljs-string\">\"false\"</span> ? <span class=\"hljs-literal\">false</span> :\n        value == <span class=\"hljs-string\">\"null\"</span> ? <span class=\"hljs-literal\">null</span> :\n        !<span class=\"hljs-built_in\">isNaN</span>(num = <span class=\"hljs-built_in\">Number</span>(value)) ? num :\n        <span class=\"hljs-regexp\">/^[\\[\\{]/</span>.test(value) ? <span class=\"hljs-built_in\">JSON</span>.parse(value) :\n        value)\n        : value;\n    } <span class=\"hljs-keyword\">catch</span> (e) { <span class=\"hljs-keyword\">return</span> value; }\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              <p>Zepto camelize function</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  camelize: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">str</span>) </span>{\n    <span class=\"hljs-keyword\">return</span> str.replace(<span class=\"hljs-regexp\">/-+(.)?/g</span>, <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">match, chr</span>) </span>{\n      <span class=\"hljs-keyword\">return</span> chr ? chr.toUpperCase() : <span class=\"hljs-string\">''</span>;\n    });\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <p>Zepto dasherize function</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  dasherize: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">str</span>) </span>{\n    <span class=\"hljs-keyword\">return</span> str.replace(<span class=\"hljs-regexp\">/::/g</span>, <span class=\"hljs-string\">'/'</span>)\n      .replace(<span class=\"hljs-regexp\">/([A-Z]+)([A-Z][a-z])/g</span>, <span class=\"hljs-string\">'$1_$2'</span>)\n      .replace(<span class=\"hljs-regexp\">/([a-z\\d])([A-Z])/g</span>, <span class=\"hljs-string\">'$1_$2'</span>)\n      .replace(<span class=\"hljs-regexp\">/_/g</span>, <span class=\"hljs-string\">'-'</span>)\n      .toLowerCase();\n  },\n\n  <span class=\"hljs-attr\">warn</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-built_in\">window</span>.console &amp;&amp; <span class=\"hljs-string\">'function'</span> === <span class=\"hljs-keyword\">typeof</span> <span class=\"hljs-built_in\">window</span>.console.warn)\n      <span class=\"hljs-built_in\">window</span>.console.warn(...arguments);\n  },\n\n  <span class=\"hljs-attr\">warnOnce</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">msg</span>) </span>{\n    <span class=\"hljs-keyword\">if</span> (!pastWarnings[msg]) {\n      pastWarnings[msg] = <span class=\"hljs-literal\">true</span>;\n      <span class=\"hljs-keyword\">this</span>.warn(...arguments);\n    }\n  },\n\n  <span class=\"hljs-attr\">_resetWarnings</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    pastWarnings = {};\n  },\n\n  <span class=\"hljs-attr\">trimString</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">string</span>) </span>{\n    <span class=\"hljs-keyword\">return</span> string.replace(<span class=\"hljs-regexp\">/^\\s+|\\s+$/g</span>, <span class=\"hljs-string\">''</span>);\n  },\n\n  <span class=\"hljs-attr\">parse</span>: {\n    <span class=\"hljs-attr\">date</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">string</span>) </span>{\n      <span class=\"hljs-keyword\">let</span> parsed = string.match(<span class=\"hljs-regexp\">/^(\\d{4,})-(\\d\\d)-(\\d\\d)$/</span>);\n      <span class=\"hljs-keyword\">if</span> (!parsed)\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">null</span>;\n      <span class=\"hljs-keyword\">let</span> [_, year, month, day] = parsed.map(<span class=\"hljs-function\"><span class=\"hljs-params\">x</span> =&gt;</span> <span class=\"hljs-built_in\">parseInt</span>(x, <span class=\"hljs-number\">10</span>));\n      <span class=\"hljs-keyword\">let</span> date = <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Date</span>(year, month - <span class=\"hljs-number\">1</span>, day);\n      <span class=\"hljs-keyword\">if</span> (date.getFullYear() !== year || date.getMonth() + <span class=\"hljs-number\">1</span> !== month || date.getDate() !== day)\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">null</span>;\n      <span class=\"hljs-keyword\">return</span> date;\n    },\n    <span class=\"hljs-attr\">string</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">string</span>) </span>{\n      <span class=\"hljs-keyword\">return</span> string;\n    },\n    <span class=\"hljs-attr\">integer</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">string</span>) </span>{\n      <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-built_in\">isNaN</span>(string))\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">null</span>;\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-built_in\">parseInt</span>(string, <span class=\"hljs-number\">10</span>);\n    },\n    <span class=\"hljs-attr\">number</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">string</span>) </span>{\n      <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-built_in\">isNaN</span>(string))\n        <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-literal\">null</span>;\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-built_in\">parseFloat</span>(string);\n    },\n    <span class=\"hljs-string\">'boolean'</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> <span class=\"hljs-title\">_boolean</span>(<span class=\"hljs-params\">string</span>) </span>{\n      <span class=\"hljs-keyword\">return</span> !(<span class=\"hljs-regexp\">/^\\s*false\\s*$/i</span>.test(string));\n    },\n    <span class=\"hljs-attr\">object</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">string</span>) </span>{\n      <span class=\"hljs-keyword\">return</span> Utils.deserializeValue(string);\n    },\n    <span class=\"hljs-attr\">regexp</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">regexp</span>) </span>{\n      <span class=\"hljs-keyword\">var</span> flags = <span class=\"hljs-string\">''</span>;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p>Test if RegExp is literal, if not, nothing to be done, otherwise, we need to isolate flags and pattern</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-regexp\">/^\\/.*\\/(?:[gimy]*)$/</span>.test(regexp)) {</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>\n              </div>\n              <p>Replace the regexp literal string with the first match group: ([gimy]*)\nIf no flag is present, this will be a blank string</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        flags = regexp.replace(<span class=\"hljs-regexp\">/.*\\/([gimy]*)$/</span>, <span class=\"hljs-string\">'$1'</span>);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>\n              </div>\n              <p>Again, replace the regexp literal string with the first match group:\neverything excluding the opening and closing slashes and the flags</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        regexp = regexp.replace(<span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">RegExp</span>(<span class=\"hljs-string\">'^/(.*?)/'</span> + flags + <span class=\"hljs-string\">'$'</span>), <span class=\"hljs-string\">'$1'</span>);\n      } <span class=\"hljs-keyword\">else</span> {</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>\n              </div>\n              <p>Anchor regexp:</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        regexp = <span class=\"hljs-string\">'^'</span> + regexp + <span class=\"hljs-string\">'$'</span>;\n      }\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">RegExp</span>(regexp, flags);\n    }\n  },\n\n  <span class=\"hljs-attr\">parseRequirement</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">requirementType, string</span>) </span>{\n    <span class=\"hljs-keyword\">var</span> converter = <span class=\"hljs-keyword\">this</span>.parse[requirementType || <span class=\"hljs-string\">'string'</span>];\n    <span class=\"hljs-keyword\">if</span> (!converter)\n      <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-string\">'Unknown requirement specification: \"'</span> + requirementType + <span class=\"hljs-string\">'\"'</span>;\n    <span class=\"hljs-keyword\">let</span> converted = converter(string);\n    <span class=\"hljs-keyword\">if</span> (converted === <span class=\"hljs-literal\">null</span>)\n      <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-string\">`Requirement is not a <span class=\"hljs-subst\">${requirementType}</span>: \"<span class=\"hljs-subst\">${string}</span>\"`</span>;\n    <span class=\"hljs-keyword\">return</span> converted;\n  },\n\n  <span class=\"hljs-attr\">namespaceEvents</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">events, namespace</span>) </span>{\n    events = <span class=\"hljs-keyword\">this</span>.trimString(events || <span class=\"hljs-string\">''</span>).split(<span class=\"hljs-regexp\">/\\s+/</span>);\n    <span class=\"hljs-keyword\">if</span> (!events[<span class=\"hljs-number\">0</span>])\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">''</span>;\n    <span class=\"hljs-keyword\">return</span> $.map(events, evt =&gt; <span class=\"hljs-string\">`<span class=\"hljs-subst\">${evt}</span>.<span class=\"hljs-subst\">${namespace}</span>`</span>).join(<span class=\"hljs-string\">' '</span>);\n  },\n\n  <span class=\"hljs-attr\">difference</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">array, remove</span>) </span>{</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>\n              </div>\n              <p>This is O(N^2), should be optimized</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">let</span> result = [];\n    $.each(array, (_, elem) =&gt; {\n      <span class=\"hljs-keyword\">if</span> (remove.indexOf(elem) == <span class=\"hljs-number\">-1</span>)\n        result.push(elem);\n    });\n    <span class=\"hljs-keyword\">return</span> result;\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>\n              </div>\n              <p>Alter-ego to native Promise.all, but for jQuery</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  all: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">promises</span>) </span>{</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>\n              </div>\n              <p>jQuery treats $.when() and $.when(singlePromise) differently; let’s avoid that and add spurious elements</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">return</span> $.when(...promises, <span class=\"hljs-number\">42</span>, <span class=\"hljs-number\">42</span>);\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>\n              </div>\n              <p>Object.create polyfill, see <a href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\">https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill</a></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  objectCreate: <span class=\"hljs-built_in\">Object</span>.create || (<span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{\n    <span class=\"hljs-keyword\">var</span> <span class=\"hljs-built_in\">Object</span> = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\"></span>) </span>{};\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">prototype</span>) </span>{\n      <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-built_in\">arguments</span>.length &gt; <span class=\"hljs-number\">1</span>) {\n        <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-built_in\">Error</span>(<span class=\"hljs-string\">'Second argument not supported'</span>);\n      }\n      <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-keyword\">typeof</span> prototype != <span class=\"hljs-string\">'object'</span>) {\n        <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-built_in\">TypeError</span>(<span class=\"hljs-string\">'Argument must be an object'</span>);\n      }\n      <span class=\"hljs-built_in\">Object</span>.prototype = prototype;\n      <span class=\"hljs-keyword\">var</span> result = <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Object</span>();\n      <span class=\"hljs-built_in\">Object</span>.prototype = <span class=\"hljs-literal\">null</span>;\n      <span class=\"hljs-keyword\">return</span> result;\n    };\n  })(),\n\n  <span class=\"hljs-attr\">_SubmitSelector</span>: <span class=\"hljs-string\">'input[type=\"submit\"], button:submit'</span>\n};\n\n<span class=\"hljs-keyword\">export</span> <span class=\"hljs-keyword\">default</span> Utils;</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n<script>var _gaq=_gaq||[];_gaq.push([\"_setAccount\",\"UA-37229467-1\"]);_gaq.push([\"_trackPageview\"]);(function(){var e=document.createElement(\"script\");e.type=\"text/javascript\";e.async=true;e.src=(\"https:\"==document.location.protocol?\"https://ssl\":\"http://www\")+\".google-analytics.com/ga.js\";var t=document.getElementsByTagName(\"script\")[0];t.parentNode.insertBefore(e,t)})();</script></body>\n</html>\n"
  },
  {
    "path": "doc/annotated-source/validator.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>validator.js</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page\"><a class=\"source\" href=\"../index.html\">&lt;&lt;&lt; back to documentation</a>\n            \n              \n              <a class=\"source\" href=\"base.html\">\n                base.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"constraint.html\">\n                constraint.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"defaults.html\">\n                defaults.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"factory.html\">\n                factory.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"field.html\">\n                field.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"form.html\">\n                form.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"main.html\">\n                main.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"multiple.html\">\n                multiple.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"pubsub.html\">\n                pubsub.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"remote.html\">\n                remote.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"ui.html\">\n                ui.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"utils.html\">\n                utils.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator.html\">\n                validator.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator_registry.html\">\n                validator_registry.js\n              </a>\n            \n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>validator.js</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              \n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">import</span> $ <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'jquery'</span>;\n<span class=\"hljs-keyword\">import</span> Utils <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./utils'</span>;\n\n<span class=\"hljs-keyword\">var</span> convertArrayRequirement = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">string, length</span>) </span>{\n  <span class=\"hljs-keyword\">var</span> m = string.match(<span class=\"hljs-regexp\">/^\\s*\\[(.*)\\]\\s*$/</span>);\n  <span class=\"hljs-keyword\">if</span> (!m)\n    <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-string\">'Requirement is not an array: \"'</span> + string + <span class=\"hljs-string\">'\"'</span>;\n  <span class=\"hljs-keyword\">var</span> values = m[<span class=\"hljs-number\">1</span>].split(<span class=\"hljs-string\">','</span>).map(Utils.trimString);\n  <span class=\"hljs-keyword\">if</span> (values.length !== length)\n    <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-string\">'Requirement has '</span> + values.length + <span class=\"hljs-string\">' values when '</span> + length + <span class=\"hljs-string\">' are needed'</span>;\n  <span class=\"hljs-keyword\">return</span> values;\n};\n\n<span class=\"hljs-keyword\">var</span> convertExtraOptionRequirement = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">requirementSpec, string, extraOptionReader</span>) </span>{\n  <span class=\"hljs-keyword\">var</span> main = <span class=\"hljs-literal\">null</span>;\n  <span class=\"hljs-keyword\">var</span> extra = {};\n  <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">var</span> key <span class=\"hljs-keyword\">in</span> requirementSpec) {\n    <span class=\"hljs-keyword\">if</span> (key) {\n      <span class=\"hljs-keyword\">var</span> value = extraOptionReader(key);\n      <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'string'</span> === <span class=\"hljs-keyword\">typeof</span> value)\n        value = Utils.parseRequirement(requirementSpec[key], value);\n      extra[key] = value;\n    } <span class=\"hljs-keyword\">else</span> {\n      main = Utils.parseRequirement(requirementSpec[key], string);\n    }\n  }\n  <span class=\"hljs-keyword\">return</span> [main, extra];\n};</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <p>A Validator needs to implement the methods <code>validate</code> and <code>parseRequirements</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>\n<span class=\"hljs-keyword\">var</span> Validator = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">spec</span>) </span>{\n  $.extend(<span class=\"hljs-literal\">true</span>, <span class=\"hljs-keyword\">this</span>, spec);\n};\n\nValidator.prototype = {</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <p>Returns <code>true</code> iff the given <code>value</code> is valid according the given requirements.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  validate: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">value, requirementFirstArg</span>) </span>{\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-keyword\">this</span>.fn) { <span class=\"hljs-comment\">// Legacy style validator</span>\n\n      <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-built_in\">arguments</span>.length &gt; <span class=\"hljs-number\">3</span>)  <span class=\"hljs-comment\">// If more args then value, requirement, instance...</span>\n        requirementFirstArg = [].slice.call(<span class=\"hljs-built_in\">arguments</span>, <span class=\"hljs-number\">1</span>, <span class=\"hljs-number\">-1</span>);  <span class=\"hljs-comment\">// Skip first arg (value) and last (instance), combining the rest</span>\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.fn(value, requirementFirstArg);\n    }\n\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-built_in\">Array</span>.isArray(value)) {\n      <span class=\"hljs-keyword\">if</span> (!<span class=\"hljs-keyword\">this</span>.validateMultiple)\n        <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-string\">'Validator `'</span> + <span class=\"hljs-keyword\">this</span>.name + <span class=\"hljs-string\">'` does not handle multiple values'</span>;\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.validateMultiple(...arguments);\n    } <span class=\"hljs-keyword\">else</span> {\n      <span class=\"hljs-keyword\">let</span> instance = <span class=\"hljs-built_in\">arguments</span>[<span class=\"hljs-built_in\">arguments</span>.length - <span class=\"hljs-number\">1</span>];\n      <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-keyword\">this</span>.validateDate &amp;&amp; instance._isDateInput()) {\n        <span class=\"hljs-built_in\">arguments</span>[<span class=\"hljs-number\">0</span>] = Utils.parse.date(<span class=\"hljs-built_in\">arguments</span>[<span class=\"hljs-number\">0</span>]);\n        <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-built_in\">arguments</span>[<span class=\"hljs-number\">0</span>] === <span class=\"hljs-literal\">null</span>)\n          <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">false</span>;\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.validateDate(...arguments);\n      }\n      <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-keyword\">this</span>.validateNumber) {\n        <span class=\"hljs-keyword\">if</span> (!value) <span class=\"hljs-comment\">// Builtin validators all accept empty strings, except `required` of course</span>\n          <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">true</span>;\n        <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-built_in\">isNaN</span>(value))\n          <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">false</span>;\n        <span class=\"hljs-built_in\">arguments</span>[<span class=\"hljs-number\">0</span>] = <span class=\"hljs-built_in\">parseFloat</span>(<span class=\"hljs-built_in\">arguments</span>[<span class=\"hljs-number\">0</span>]);\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.validateNumber(...arguments);\n      }\n      <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-keyword\">this</span>.validateString) {\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.validateString(...arguments);\n      }\n      <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-string\">'Validator `'</span> + <span class=\"hljs-keyword\">this</span>.name + <span class=\"hljs-string\">'` only handles multiple values'</span>;\n    }\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              <p>Parses <code>requirements</code> into an array of arguments,\naccording to <code>this.requirementType</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  parseRequirements: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">requirements, extraOptionReader</span>) </span>{\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'string'</span> !== <span class=\"hljs-keyword\">typeof</span> requirements) {</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <p>Assume requirement already parsed\nbut make sure we return an array</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-built_in\">Array</span>.isArray(requirements) ? requirements : [requirements];\n    }\n    <span class=\"hljs-keyword\">var</span> type = <span class=\"hljs-keyword\">this</span>.requirementType;\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-built_in\">Array</span>.isArray(type)) {\n      <span class=\"hljs-keyword\">var</span> values = convertArrayRequirement(requirements, type.length);\n      <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">var</span> i = <span class=\"hljs-number\">0</span>; i &lt; values.length; i++)\n        values[i] = Utils.parseRequirement(type[i], values[i]);\n      <span class=\"hljs-keyword\">return</span> values;\n    } <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> ($.isPlainObject(type)) {\n      <span class=\"hljs-keyword\">return</span> convertExtraOptionRequirement(type, requirements, extraOptionReader);\n    } <span class=\"hljs-keyword\">else</span> {\n      <span class=\"hljs-keyword\">return</span> [Utils.parseRequirement(type, requirements)];\n    }\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p>Defaults:</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  requirementType: <span class=\"hljs-string\">'string'</span>,\n\n  <span class=\"hljs-attr\">priority</span>: <span class=\"hljs-number\">2</span>\n\n};\n\n<span class=\"hljs-keyword\">export</span> <span class=\"hljs-keyword\">default</span> Validator;</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n<script>var _gaq=_gaq||[];_gaq.push([\"_setAccount\",\"UA-37229467-1\"]);_gaq.push([\"_trackPageview\"]);(function(){var e=document.createElement(\"script\");e.type=\"text/javascript\";e.async=true;e.src=(\"https:\"==document.location.protocol?\"https://ssl\":\"http://www\")+\".google-analytics.com/ga.js\";var t=document.getElementsByTagName(\"script\")[0];t.parentNode.insertBefore(e,t)})();</script></body>\n</html>\n"
  },
  {
    "path": "doc/annotated-source/validator_registry.html",
    "content": "<!DOCTYPE html>\n\n<html>\n<head>\n  <title>validator_registry.js</title>\n  <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">\n  <link rel=\"stylesheet\" media=\"all\" href=\"docco.css\" />\n</head>\n<body>\n  <div id=\"container\">\n    <div id=\"background\"></div>\n    \n      <ul id=\"jump_to\">\n        <li>\n          <a class=\"large\" href=\"javascript:void(0);\">Jump To &hellip;</a>\n          <a class=\"small\" href=\"javascript:void(0);\">+</a>\n          <div id=\"jump_wrapper\">\n          <div id=\"jump_page\"><a class=\"source\" href=\"../index.html\">&lt;&lt;&lt; back to documentation</a>\n            \n              \n              <a class=\"source\" href=\"base.html\">\n                base.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"constraint.html\">\n                constraint.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"defaults.html\">\n                defaults.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"factory.html\">\n                factory.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"field.html\">\n                field.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"form.html\">\n                form.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"main.html\">\n                main.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"multiple.html\">\n                multiple.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"pubsub.html\">\n                pubsub.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"remote.html\">\n                remote.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"ui.html\">\n                ui.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"utils.html\">\n                utils.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator.html\">\n                validator.js\n              </a>\n            \n              \n              <a class=\"source\" href=\"validator_registry.html\">\n                validator_registry.js\n              </a>\n            \n          </div>\n        </li>\n      </ul>\n    \n    <ul class=\"sections\">\n        \n          <li id=\"title\">\n              <div class=\"annotation\">\n                  <h1>validator_registry.js</h1>\n              </div>\n          </li>\n        \n        \n        \n        <li id=\"section-1\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-1\">&#182;</a>\n              </div>\n              \n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">import</span> $ <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'jquery'</span>;\n<span class=\"hljs-keyword\">import</span> Utils <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./utils'</span>;\n<span class=\"hljs-keyword\">import</span> Defaults <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./defaults'</span>;\n<span class=\"hljs-keyword\">import</span> Validator <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">'./validator'</span>;\n\n<span class=\"hljs-keyword\">var</span> ValidatorRegistry = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">validators, catalog</span>) </span>{\n  <span class=\"hljs-keyword\">this</span>.__class__ = <span class=\"hljs-string\">'ValidatorRegistry'</span>;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-2\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-2\">&#182;</a>\n              </div>\n              <p>Default Parsley locale is en</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  <span class=\"hljs-keyword\">this</span>.locale = <span class=\"hljs-string\">'en'</span>;\n\n  <span class=\"hljs-keyword\">this</span>.init(validators || {}, catalog || {});\n};\n\n<span class=\"hljs-keyword\">var</span> typeTesters =  {\n  <span class=\"hljs-attr\">email</span>: <span class=\"hljs-regexp\">/^((([a-zA-Z]|\\d|[!#\\$%&amp;'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-zA-Z]|\\d|[!#\\$%&amp;'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-zA-Z]|\\d|-|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-zA-Z]|\\d|-|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))$/</span>,</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-3\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-3\">&#182;</a>\n              </div>\n              <p>Follow <a href=\"https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\">https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers</a></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  number: <span class=\"hljs-regexp\">/^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i</span>,\n\n  <span class=\"hljs-attr\">integer</span>: <span class=\"hljs-regexp\">/^-?\\d+$/</span>,\n\n  <span class=\"hljs-attr\">digits</span>: <span class=\"hljs-regexp\">/^\\d+$/</span>,\n\n  <span class=\"hljs-attr\">alphanum</span>: <span class=\"hljs-regexp\">/^\\w+$/i</span>,\n\n  <span class=\"hljs-attr\">date</span>: {\n    <span class=\"hljs-attr\">test</span>: <span class=\"hljs-function\"><span class=\"hljs-params\">value</span> =&gt;</span> Utils.parse.date(value) !== <span class=\"hljs-literal\">null</span>\n  },\n\n  <span class=\"hljs-attr\">url</span>: <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">RegExp</span>(\n      <span class=\"hljs-string\">\"^\"</span> +</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-4\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-4\">&#182;</a>\n              </div>\n              <p>protocol identifier</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-string\">\"(?:(?:https?|ftp)://)?\"</span> + <span class=\"hljs-comment\">// ** mod: make scheme optional</span></pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-5\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-5\">&#182;</a>\n              </div>\n              <p>user:pass authentication</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-string\">\"(?:\\\\S+(?::\\\\S*)?@)?\"</span> +\n        <span class=\"hljs-string\">\"(?:\"</span> +</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-6\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-6\">&#182;</a>\n              </div>\n              <p>IP address exclusion\nprivate &amp; local networks\n“(?!(?:10|127)(?:\\.\\d{1,3}){3})” +   // ** mod: allow local networks\n“(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})” +  // ** mod: allow local networks\n“(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})” +  // ** mod: allow local networks\nIP address dotted notation octets\nexcludes loopback network 0.0.0.0\nexcludes reserved space &gt;= 224.0.0.0\nexcludes network &amp; broacast addresses\n(first &amp; last IP address of each class)</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          <span class=\"hljs-string\">\"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\"</span> +\n          <span class=\"hljs-string\">\"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\"</span> +\n          <span class=\"hljs-string\">\"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\"</span> +\n        <span class=\"hljs-string\">\"|\"</span> +</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-7\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-7\">&#182;</a>\n              </div>\n              <p>host name</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          <span class=\"hljs-string\">\"(?:(?:[a-zA-Z\\\\u00a1-\\\\uffff0-9]-*)*[a-zA-Z\\\\u00a1-\\\\uffff0-9]+)\"</span> +</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-8\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-8\">&#182;</a>\n              </div>\n              <p>domain name</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          <span class=\"hljs-string\">\"(?:\\\\.(?:[a-zA-Z\\\\u00a1-\\\\uffff0-9]-*)*[a-zA-Z\\\\u00a1-\\\\uffff0-9]+)*\"</span> +</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-9\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-9\">&#182;</a>\n              </div>\n              <p>TLD identifier</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>          <span class=\"hljs-string\">\"(?:\\\\.(?:[a-zA-Z\\\\u00a1-\\\\uffff]{2,}))\"</span> +\n        <span class=\"hljs-string\">\")\"</span> +</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-10\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-10\">&#182;</a>\n              </div>\n              <p>port number</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-string\">\"(?::\\\\d{2,5})?\"</span> +</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-11\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-11\">&#182;</a>\n              </div>\n              <p>resource path</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>        <span class=\"hljs-string\">\"(?:/\\\\S*)?\"</span> +\n      <span class=\"hljs-string\">\"$\"</span>\n    )\n};\ntypeTesters.range = typeTesters.number;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-12\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-12\">&#182;</a>\n              </div>\n              <p>See <a href=\"http://stackoverflow.com/a/10454560/8279\">http://stackoverflow.com/a/10454560/8279</a></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">var</span> decimalPlaces = <span class=\"hljs-function\"><span class=\"hljs-params\">num</span> =&gt;</span> {\n  <span class=\"hljs-keyword\">var</span> match = (<span class=\"hljs-string\">''</span> + num).match(<span class=\"hljs-regexp\">/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/</span>);\n  <span class=\"hljs-keyword\">if</span> (!match) { <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">0</span>; }\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-built_in\">Math</span>.max(\n       <span class=\"hljs-number\">0</span>,</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-13\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-13\">&#182;</a>\n              </div>\n              <p>Number of digits right of decimal point.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>       (match[<span class=\"hljs-number\">1</span>] ? match[<span class=\"hljs-number\">1</span>].length : <span class=\"hljs-number\">0</span>) -</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-14\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-14\">&#182;</a>\n              </div>\n              <p>Adjust for scientific notation.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>       (match[<span class=\"hljs-number\">2</span>] ? +match[<span class=\"hljs-number\">2</span>] : <span class=\"hljs-number\">0</span>));\n};</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-15\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-15\">&#182;</a>\n              </div>\n              <p>parseArguments(‘number’, [‘1’, ‘2’]) =&gt; [1, 2]</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">let</span> parseArguments = <span class=\"hljs-function\">(<span class=\"hljs-params\">type, args</span>) =&gt;</span> args.map(Utils.parse[type]);</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-16\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-16\">&#182;</a>\n              </div>\n              <p>operatorToValidator returns a validating function for an operator function, applied to the given type</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre><span class=\"hljs-keyword\">let</span> operatorToValidator = <span class=\"hljs-function\">(<span class=\"hljs-params\">type, operator</span>) =&gt;</span> {\n  <span class=\"hljs-keyword\">return</span> <span class=\"hljs-function\">(<span class=\"hljs-params\">value, ...requirementsAndInput</span>) =&gt;</span> {\n    requirementsAndInput.pop(); <span class=\"hljs-comment\">// Get rid of `input` argument</span>\n    <span class=\"hljs-keyword\">return</span> operator(value, ...parseArguments(type, requirementsAndInput));\n  };\n};\n\n<span class=\"hljs-keyword\">let</span> comparisonOperator = <span class=\"hljs-function\"><span class=\"hljs-params\">operator</span> =&gt;</span> ({\n  <span class=\"hljs-attr\">validateDate</span>: operatorToValidator(<span class=\"hljs-string\">'date'</span>, operator),\n  <span class=\"hljs-attr\">validateNumber</span>: operatorToValidator(<span class=\"hljs-string\">'number'</span>, operator),\n  <span class=\"hljs-attr\">requirementType</span>: operator.length &lt;= <span class=\"hljs-number\">2</span> ? <span class=\"hljs-string\">'string'</span> : [<span class=\"hljs-string\">'string'</span>, <span class=\"hljs-string\">'string'</span>], <span class=\"hljs-comment\">// Support operators with a 1 or 2 requirement(s)</span>\n  <span class=\"hljs-attr\">priority</span>: <span class=\"hljs-number\">30</span>\n});\n\nValidatorRegistry.prototype = {\n  <span class=\"hljs-attr\">init</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">validators, catalog</span>) </span>{\n    <span class=\"hljs-keyword\">this</span>.catalog = catalog;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-17\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-17\">&#182;</a>\n              </div>\n              <p>Copy prototype’s validators:</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">this</span>.validators = <span class=\"hljs-built_in\">Object</span>.assign({}, <span class=\"hljs-keyword\">this</span>.validators);\n\n    <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">var</span> name <span class=\"hljs-keyword\">in</span> validators)\n      <span class=\"hljs-keyword\">this</span>.addValidator(name, validators[name].fn, validators[name].priority);\n\n    <span class=\"hljs-built_in\">window</span>.Parsley.trigger(<span class=\"hljs-string\">'parsley:validator:init'</span>);\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-18\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-18\">&#182;</a>\n              </div>\n              <p>Set new messages locale if we have dictionary loaded in ParsleyConfig.i18n</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  setLocale: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">locale</span>) </span>{\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'undefined'</span> === <span class=\"hljs-keyword\">typeof</span> <span class=\"hljs-keyword\">this</span>.catalog[locale])\n      <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Error</span>(locale + <span class=\"hljs-string\">' is not available in the catalog'</span>);\n\n    <span class=\"hljs-keyword\">this</span>.locale = locale;\n\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>;\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-19\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-19\">&#182;</a>\n              </div>\n              <p>Add a new messages catalog for a given locale. Set locale for this catalog if set === <code>true</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  addCatalog: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">locale, messages, set</span>) </span>{\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'object'</span> === <span class=\"hljs-keyword\">typeof</span> messages)\n      <span class=\"hljs-keyword\">this</span>.catalog[locale] = messages;\n\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-literal\">true</span> === <span class=\"hljs-keyword\">set</span>)\n      return this.setLocale(locale);\n\n    return this;\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-20\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-20\">&#182;</a>\n              </div>\n              <p>Add a specific message for a given constraint in a given locale</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  addMessage: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">locale, name, message</span>) </span>{\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'undefined'</span> === <span class=\"hljs-keyword\">typeof</span> <span class=\"hljs-keyword\">this</span>.catalog[locale])\n      <span class=\"hljs-keyword\">this</span>.catalog[locale] = {};\n\n    <span class=\"hljs-keyword\">this</span>.catalog[locale][name] = message;\n\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>;\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-21\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-21\">&#182;</a>\n              </div>\n              <p>Add messages for a given locale</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  addMessages: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">locale, nameMessageObject</span>) </span>{\n    <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">var</span> name <span class=\"hljs-keyword\">in</span> nameMessageObject)\n      <span class=\"hljs-keyword\">this</span>.addMessage(locale, name, nameMessageObject[name]);\n\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>;\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-22\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-22\">&#182;</a>\n              </div>\n              <p>Add a new validator</p>\n<p>   addValidator(‘custom’, {\n       requirementType: [‘integer’, ‘integer’],\n       validateString: function(value, from, to) {},\n       priority: 22,\n       messages: {\n         en: “Hey, that’s no good”,\n         fr: “Aye aye, pas bon du tout”,\n       }\n   })</p>\n<p>Old API was addValidator(name, function, priority)</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  addValidator: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">name, arg1, arg2</span>) </span>{\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-keyword\">this</span>.validators[name])\n      Utils.warn(<span class=\"hljs-string\">'Validator \"'</span> + name + <span class=\"hljs-string\">'\" is already defined.'</span>);\n    <span class=\"hljs-keyword\">else</span> <span class=\"hljs-keyword\">if</span> (Defaults.hasOwnProperty(name)) {\n      Utils.warn(<span class=\"hljs-string\">'\"'</span> + name + <span class=\"hljs-string\">'\" is a restricted keyword and is not a valid validator name.'</span>);\n      <span class=\"hljs-keyword\">return</span>;\n    }\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>._setValidator(...arguments);\n  },\n\n  <span class=\"hljs-attr\">hasValidator</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">name</span>) </span>{\n    <span class=\"hljs-keyword\">return</span> !!<span class=\"hljs-keyword\">this</span>.validators[name];\n  },\n\n  <span class=\"hljs-attr\">updateValidator</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">name, arg1, arg2</span>) </span>{\n    <span class=\"hljs-keyword\">if</span> (!<span class=\"hljs-keyword\">this</span>.validators[name]) {\n      Utils.warn(<span class=\"hljs-string\">'Validator \"'</span> + name + <span class=\"hljs-string\">'\" is not already defined.'</span>);\n      <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>.addValidator(...arguments);\n    }\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>._setValidator(...arguments);\n  },\n\n  <span class=\"hljs-attr\">removeValidator</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">name</span>) </span>{\n    <span class=\"hljs-keyword\">if</span> (!<span class=\"hljs-keyword\">this</span>.validators[name])\n      Utils.warn(<span class=\"hljs-string\">'Validator \"'</span> + name + <span class=\"hljs-string\">'\" is not defined.'</span>);\n\n    <span class=\"hljs-keyword\">delete</span> <span class=\"hljs-keyword\">this</span>.validators[name];\n\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>;\n  },\n\n  <span class=\"hljs-attr\">_setValidator</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">name, validator, priority</span>) </span>{\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'object'</span> !== <span class=\"hljs-keyword\">typeof</span> validator) {</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-23\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-23\">&#182;</a>\n              </div>\n              <p>Old style validator, with <code>fn</code> and <code>priority</code></p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>      validator = {\n        <span class=\"hljs-attr\">fn</span>: validator,\n        <span class=\"hljs-attr\">priority</span>: priority\n      };\n    }\n    <span class=\"hljs-keyword\">if</span> (!validator.validate) {\n      validator = <span class=\"hljs-keyword\">new</span> Validator(validator);\n    }\n    <span class=\"hljs-keyword\">this</span>.validators[name] = validator;\n\n    <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">var</span> locale <span class=\"hljs-keyword\">in</span> validator.messages || {})\n      <span class=\"hljs-keyword\">this</span>.addMessage(locale, name, validator.messages[locale]);\n\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-keyword\">this</span>;\n  },\n\n  <span class=\"hljs-attr\">getErrorMessage</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">constraint</span>) </span>{\n    <span class=\"hljs-keyword\">var</span> message;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-24\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-24\">&#182;</a>\n              </div>\n              <p>Type constraints are a bit different, we have to match their requirements too to find right error message</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'type'</span> === constraint.name) {\n      <span class=\"hljs-keyword\">var</span> typeMessages = <span class=\"hljs-keyword\">this</span>.catalog[<span class=\"hljs-keyword\">this</span>.locale][constraint.name] || {};\n      message = typeMessages[constraint.requirements];\n    } <span class=\"hljs-keyword\">else</span>\n      message = <span class=\"hljs-keyword\">this</span>.formatMessage(<span class=\"hljs-keyword\">this</span>.catalog[<span class=\"hljs-keyword\">this</span>.locale][constraint.name], constraint.requirements);\n\n    <span class=\"hljs-keyword\">return</span> message || <span class=\"hljs-keyword\">this</span>.catalog[<span class=\"hljs-keyword\">this</span>.locale].defaultMessage || <span class=\"hljs-keyword\">this</span>.catalog.en.defaultMessage;\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-25\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-25\">&#182;</a>\n              </div>\n              <p>Kind of light <code>sprintf()</code> implementation</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  formatMessage: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">string, parameters</span>) </span>{\n    <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'object'</span> === <span class=\"hljs-keyword\">typeof</span> parameters) {\n      <span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">var</span> i <span class=\"hljs-keyword\">in</span> parameters)\n        string = <span class=\"hljs-keyword\">this</span>.formatMessage(string, parameters[i]);\n\n      <span class=\"hljs-keyword\">return</span> string;\n    }\n\n    <span class=\"hljs-keyword\">return</span> <span class=\"hljs-string\">'string'</span> === <span class=\"hljs-keyword\">typeof</span> string ? string.replace(<span class=\"hljs-regexp\">/%s/i</span>, parameters) : <span class=\"hljs-string\">''</span>;\n  },</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-26\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-26\">&#182;</a>\n              </div>\n              <p>Here is the Parsley default validators list.\nA validator is an object with the following key values:</p>\n<ul>\n<li>priority: an integer</li>\n<li>requirement: ‘string’ (default), ‘integer’, ‘number’, ‘regexp’ or an Array of these</li>\n<li>validateString, validateMultiple, validateNumber: functions returning <code>true</code>, <code>false</code> or a promise\nAlternatively, a validator can be a function that returns such an object</li>\n</ul>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>  validators: {\n    <span class=\"hljs-attr\">notblank</span>: {\n      <span class=\"hljs-attr\">validateString</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">value</span>) </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-regexp\">/\\S/</span>.test(value);\n      },\n      <span class=\"hljs-attr\">priority</span>: <span class=\"hljs-number\">2</span>\n    },\n    <span class=\"hljs-attr\">required</span>: {\n      <span class=\"hljs-attr\">validateMultiple</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">values</span>) </span>{\n        <span class=\"hljs-keyword\">return</span> values.length &gt; <span class=\"hljs-number\">0</span>;\n      },\n      <span class=\"hljs-attr\">validateString</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">value</span>) </span>{\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-regexp\">/\\S/</span>.test(value);\n      },\n      <span class=\"hljs-attr\">priority</span>: <span class=\"hljs-number\">512</span>\n    },\n    <span class=\"hljs-attr\">type</span>: {\n      <span class=\"hljs-attr\">validateString</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">value, type, {step = <span class=\"hljs-string\">'any'</span>, base = <span class=\"hljs-number\">0</span>} = {}</span>) </span>{\n        <span class=\"hljs-keyword\">var</span> tester = typeTesters[type];\n        <span class=\"hljs-keyword\">if</span> (!tester) {\n          <span class=\"hljs-keyword\">throw</span> <span class=\"hljs-keyword\">new</span> <span class=\"hljs-built_in\">Error</span>(<span class=\"hljs-string\">'validator type `'</span> + type + <span class=\"hljs-string\">'` is not supported'</span>);\n        }\n        <span class=\"hljs-keyword\">if</span> (!value)\n          <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">true</span>;  <span class=\"hljs-comment\">// Builtin validators all accept empty strings, except `required` of course</span>\n        <span class=\"hljs-keyword\">if</span> (!tester.test(value))\n          <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">false</span>;\n        <span class=\"hljs-keyword\">if</span> (<span class=\"hljs-string\">'number'</span> === type) {\n          <span class=\"hljs-keyword\">if</span> (!<span class=\"hljs-regexp\">/^any$/i</span>.test(step || <span class=\"hljs-string\">''</span>)) {\n            <span class=\"hljs-keyword\">var</span> nb = <span class=\"hljs-built_in\">Number</span>(value);\n            <span class=\"hljs-keyword\">var</span> decimals = <span class=\"hljs-built_in\">Math</span>.max(decimalPlaces(step), decimalPlaces(base));\n            <span class=\"hljs-keyword\">if</span> (decimalPlaces(nb) &gt; decimals) <span class=\"hljs-comment\">// Value can't have too many decimals</span>\n              <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">false</span>;</pre></div></div>\n            \n        </li>\n        \n        \n        <li id=\"section-27\">\n            <div class=\"annotation\">\n              \n              <div class=\"pilwrap \">\n                <a class=\"pilcrow\" href=\"#section-27\">&#182;</a>\n              </div>\n              <p>Be careful of rounding errors by using integers.</p>\n\n            </div>\n            \n            <div class=\"content\"><div class='highlight'><pre>            <span class=\"hljs-keyword\">var</span> toInt = <span class=\"hljs-function\"><span class=\"hljs-params\">f</span> =&gt;</span> <span class=\"hljs-built_in\">Math</span>.round(f * <span class=\"hljs-built_in\">Math</span>.pow(<span class=\"hljs-number\">10</span>, decimals));\n            <span class=\"hljs-keyword\">if</span> ((toInt(nb) - toInt(base)) % toInt(step) != <span class=\"hljs-number\">0</span>)\n              <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">false</span>;\n          }\n        }\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">true</span>;\n      },\n      <span class=\"hljs-attr\">requirementType</span>: {\n        <span class=\"hljs-string\">''</span>: <span class=\"hljs-string\">'string'</span>,\n        <span class=\"hljs-attr\">step</span>: <span class=\"hljs-string\">'string'</span>,\n        <span class=\"hljs-attr\">base</span>: <span class=\"hljs-string\">'number'</span>\n      },\n      <span class=\"hljs-attr\">priority</span>: <span class=\"hljs-number\">256</span>\n    },\n    <span class=\"hljs-attr\">pattern</span>: {\n      <span class=\"hljs-attr\">validateString</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span>(<span class=\"hljs-params\">value, regexp</span>) </span>{\n        <span class=\"hljs-keyword\">if</span> (!value)\n          <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">true</span>;  <span class=\"hljs-comment\">// Builtin validators all accept empty strings, except `required` of course</span>\n        <span class=\"hljs-keyword\">return</span> regexp.test(value);\n      },\n      <span class=\"hljs-attr\">requirementType</span>: <span class=\"hljs-string\">'regexp'</span>,\n      <span class=\"hljs-attr\">priority</span>: <span class=\"hljs-number\">64</span>\n    },\n    <span class=\"hljs-attr\">minlength</span>: {\n      <span class=\"hljs-attr\">validateString</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">value, requirement</span>) </span>{\n        <span class=\"hljs-keyword\">if</span> (!value)\n          <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">true</span>;  <span class=\"hljs-comment\">// Builtin validators all accept empty strings, except `required` of course</span>\n        <span class=\"hljs-keyword\">return</span> value.length &gt;= requirement;\n      },\n      <span class=\"hljs-attr\">requirementType</span>: <span class=\"hljs-string\">'integer'</span>,\n      <span class=\"hljs-attr\">priority</span>: <span class=\"hljs-number\">30</span>\n    },\n    <span class=\"hljs-attr\">maxlength</span>: {\n      <span class=\"hljs-attr\">validateString</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">value, requirement</span>) </span>{\n        <span class=\"hljs-keyword\">return</span> value.length &lt;= requirement;\n      },\n      <span class=\"hljs-attr\">requirementType</span>: <span class=\"hljs-string\">'integer'</span>,\n      <span class=\"hljs-attr\">priority</span>: <span class=\"hljs-number\">30</span>\n    },\n    <span class=\"hljs-attr\">length</span>: {\n      <span class=\"hljs-attr\">validateString</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">value, min, max</span>) </span>{\n        <span class=\"hljs-keyword\">if</span> (!value)\n          <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">true</span>;  <span class=\"hljs-comment\">// Builtin validators all accept empty strings, except `required` of course</span>\n        <span class=\"hljs-keyword\">return</span> value.length &gt;= min &amp;&amp; value.length &lt;= max;\n      },\n      <span class=\"hljs-attr\">requirementType</span>: [<span class=\"hljs-string\">'integer'</span>, <span class=\"hljs-string\">'integer'</span>],\n      <span class=\"hljs-attr\">priority</span>: <span class=\"hljs-number\">30</span>\n    },\n    <span class=\"hljs-attr\">mincheck</span>: {\n      <span class=\"hljs-attr\">validateMultiple</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">values, requirement</span>) </span>{\n        <span class=\"hljs-keyword\">return</span> values.length &gt;= requirement;\n      },\n      <span class=\"hljs-attr\">requirementType</span>: <span class=\"hljs-string\">'integer'</span>,\n      <span class=\"hljs-attr\">priority</span>: <span class=\"hljs-number\">30</span>\n    },\n    <span class=\"hljs-attr\">maxcheck</span>: {\n      <span class=\"hljs-attr\">validateMultiple</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">values, requirement</span>) </span>{\n        <span class=\"hljs-keyword\">return</span> values.length &lt;= requirement;\n      },\n      <span class=\"hljs-attr\">requirementType</span>: <span class=\"hljs-string\">'integer'</span>,\n      <span class=\"hljs-attr\">priority</span>: <span class=\"hljs-number\">30</span>\n    },\n    <span class=\"hljs-attr\">check</span>: {\n      <span class=\"hljs-attr\">validateMultiple</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">values, min, max</span>) </span>{\n        <span class=\"hljs-keyword\">return</span> values.length &gt;= min &amp;&amp; values.length &lt;= max;\n      },\n      <span class=\"hljs-attr\">requirementType</span>: [<span class=\"hljs-string\">'integer'</span>, <span class=\"hljs-string\">'integer'</span>],\n      <span class=\"hljs-attr\">priority</span>: <span class=\"hljs-number\">30</span>\n    },\n    <span class=\"hljs-attr\">min</span>: comparisonOperator(<span class=\"hljs-function\">(<span class=\"hljs-params\">value, requirement</span>) =&gt;</span> value &gt;= requirement),\n    <span class=\"hljs-attr\">max</span>: comparisonOperator(<span class=\"hljs-function\">(<span class=\"hljs-params\">value, requirement</span>) =&gt;</span> value &lt;= requirement),\n    <span class=\"hljs-attr\">range</span>: comparisonOperator(<span class=\"hljs-function\">(<span class=\"hljs-params\">value, min, max</span>) =&gt;</span> value &gt;= min &amp;&amp; value &lt;= max),\n    <span class=\"hljs-attr\">equalto</span>: {\n      <span class=\"hljs-attr\">validateString</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">value, refOrValue</span>) </span>{\n        <span class=\"hljs-keyword\">if</span> (!value)\n          <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">true</span>;  <span class=\"hljs-comment\">// Builtin validators all accept empty strings, except `required` of course</span>\n        <span class=\"hljs-keyword\">var</span> $reference = $(refOrValue);\n        <span class=\"hljs-keyword\">if</span> ($reference.length)\n          <span class=\"hljs-keyword\">return</span> value === $reference.val();\n        <span class=\"hljs-keyword\">else</span>\n          <span class=\"hljs-keyword\">return</span> value === refOrValue;\n      },\n      <span class=\"hljs-attr\">priority</span>: <span class=\"hljs-number\">256</span>\n    },\n    <span class=\"hljs-attr\">euvatin</span>: {\n      <span class=\"hljs-attr\">validateString</span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function</span> (<span class=\"hljs-params\">value, refOrValue</span>) </span>{\n        <span class=\"hljs-keyword\">if</span> (!value) {\n          <span class=\"hljs-keyword\">return</span> <span class=\"hljs-literal\">true</span>;  <span class=\"hljs-comment\">// Builtin validators all accept empty strings, except `required` of course</span>\n        }\n\n        <span class=\"hljs-keyword\">var</span> re = <span class=\"hljs-regexp\">/^[A-Z][A-Z][A-Za-z0-9 -]{2,}$/</span>;\n        <span class=\"hljs-keyword\">return</span> re.test(value);\n      },\n      <span class=\"hljs-attr\">priority</span>: <span class=\"hljs-number\">30</span>,\n    },\n  }\n};\n\n<span class=\"hljs-keyword\">export</span> <span class=\"hljs-keyword\">default</span> ValidatorRegistry;</pre></div></div>\n            \n        </li>\n        \n    </ul>\n  </div>\n<script>var _gaq=_gaq||[];_gaq.push([\"_setAccount\",\"UA-37229467-1\"]);_gaq.push([\"_trackPageview\"]);(function(){var e=document.createElement(\"script\");e.type=\"text/javascript\";e.async=true;e.src=(\"https:\"==document.location.protocol?\"https://ssl\":\"http://www\")+\".google-analytics.com/ga.js\";var t=document.getElementsByTagName(\"script\")[0];t.parentNode.insertBefore(e,t)})();</script></body>\n</html>\n"
  },
  {
    "path": "doc/assets/docs.css",
    "content": "body {\n  color: #111111;\n}\n.branding {\n  width: 100%;\n  color: #676E72;;\n  font-size: 1.1em;\n  text-align: center;\n  background-color: #F1BC32;\n  background-color: rgba(241,188,50,.15);\n  padding: 24px;\n}\n.branding a {\n  font-weight: 700;\n}\n@media (min-width: 768px) {\n  .nav-justified {\n    max-height: 52px;\n  }\n  .nav-justified > li > a {\n    border-left: 1px solid #fff;\n    border-right: 1px solid #d5d5d5;\n  }\n  .nav-justified > li:first-child > a {\n    border-left: 0;\n    border-radius: 5px 0 0 5px;\n  }\n  .nav-justified > li:last-child > a {\n    border-radius: 0 5px 5px 0;\n    border-right: 0;\n  }\n  .sidebar {\n    display: block;\n  }\n}\n/* Responsive: Portrait tablets and up */\n@media screen and (min-width: 768px) {\n  /* Remove the padding we set earlier */\n  .masthead,\n  .marketing,\n  .footer {\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n@media screen and (min-width: 992px) {\n  .affix-top {\n    top: 30px;\n  }\n  .sidebar.affix {\n    top: 10px;\n    margin-top: 0px;\n  }\n}\n.footer {\n  border-top: 1px solid #eee;\n  margin-top: 40px;\n  padding-top: 40px;\n  padding-bottom: 40px;\n}\n/* Main marketing message and sign up button */\n.jumbotron {\n  text-align: center;\n  background-color: transparent;\n}\n.jumbotron .btn {\n  font-size: 21px;\n  padding: 14px 24px;\n}\n/* Customize the nav-justified links to be fill the entire space of the .navbar */\n.nav-justified {\n  background-color: #eee;\n  border-radius: 5px;\n  border: 1px solid #ccc;\n}\n.nav-justified > li > a {\n  margin-bottom: 0;\n  padding-top: 15px;\n  padding-bottom: 15px;\n  color: #777;\n  font-weight: bold;\n  text-align: center;\n  border-bottom: 1px solid #d5d5d5;\n  background-color: #e5e5e5;\n  /* Old browsers */\n\n  background-repeat: repeat-x;\n  /* Repeat the gradient */\n\n  background-image: -moz-linear-gradient(top, #f5f5f5 0%, #e5e5e5 100%);\n  /* FF3.6+ */\n\n  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #e5e5e5));\n  /* Chrome,Safari4+ */\n\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e5e5e5 100%);\n  /* Chrome 10+,Safari 5.1+ */\n\n  background-image: -o-linear-gradient(top, #f5f5f5 0%, #e5e5e5 100%);\n  /* Opera 11.10+ */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#e5e5e5', GradientType=0);\n  /* IE6-9 */\n\n  background-image: linear-gradient(top, #f5f5f5 0%, #e5e5e5 100%);\n  /* W3C */\n\n}\n.nav-justified > .active > a,\n.nav-justified > .active > a:hover,\n.nav-justified > .active > a:focus {\n  background-color: #ddd;\n  background-image: none;\n  box-shadow: inset 0 3px 7px rgba(0, 0, 0, 0.15);\n}\n.nav-justified > li:first-child > a {\n  border-radius: 5px 5px 0 0;\n}\n.nav-justified > li:last-child > a {\n  border-bottom: 0;\n  border-radius: 0 0 5px 5px;\n}\n.header h3 {\n  display: inline-block;\n}\n.social-buttons {\n  padding: 5px 20px;\n}\n/*\n* Affix sidebar\n*\n*/\n.sidebar {\n  margin-top: 40px;\n}\n.sidebar .nav > li > a {\n  display: block;\n  font-size: 13px;\n  font-weight: 500;\n  color: #111111;\n  padding: 4px 20px;\n}\n.sidebar .nav > .active > ul,\n.sidebar .nav > .active:hover > ul,\n.sidebar .nav > .active:focus > ul {\n  display: block;\n}\n.sidebar .nav > .active > a,\n.sidebar .nav > .active:hover > a,\n.sidebar .nav > .active:focus > a {\n  padding-left: 18px;\n  font-weight: 700;\n  color: #FF851B;\n  background-color: transparent;\n  border-left: 2px solid #FF851B;\n}\n.sidebar .nav .nav {\n  display: none;\n  padding-bottom: 10px;\n}\n.sidebar .nav .nav > li > a {\n  padding-top: 2px;\n  padding-bottom: 2px;\n  padding-left: 30px;\n  font-size: 12px;\n  font-weight: 400;\n}\n.sidebar .nav .nav > .active > a {\n  font-weight: 500;\n  padding-left: 28px;\n}\n/*\n* Examples\n*\n*/\n.code-block {\n  margin-top: 20px;\n}\nbody.examples .row h2 {\n  color: #FF851B;\n}\nbody.examples .row p {\n  text-align: justify;\n}\n/*\n* Callouts\n*\n* Not quite alerts, but custom and helpful notes for folks reading the docs.\n* Requires a base and modifier class.\n*/\n/* Common styles for all types */\n.bs-callout {\n  margin: 20px 0;\n  padding: 20px;\n  border-left: 3px solid #eee;\n}\n.bs-callout h4 {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.bs-callout p:last-child {\n  margin-bottom: 0;\n}\n.bs-callout code {\n  background-color: #fff;\n  border-radius: 3px;\n}\n/* Variations */\n.bs-callout-danger {\n  background-color: #fdf7f7;\n  border-color: #d9534f;\n}\n.bs-callout-danger h4 {\n  color: #d9534f;\n}\n.bs-callout-warning {\n  background-color: #fcf8f2;\n  border-color: #f0ad4e;\n}\n.bs-callout-warning h4 {\n  color: #f0ad4e;\n}\n.bs-callout-info {\n  background-color: #f4f8fa;\n  border-color: #5bc0de;\n}\n.bs-callout-info h4 {\n  color: #5bc0de;\n}\n.hundred {\n  width: 100%;\n}\nversion {\n  color: #949494;\n  font-size: 0.9em;\n}\nh3 {\n  color: #FF851B;\n}\n.back-to-top {\n  margin-top: 10px;\n  margin-left: 10px;\n  padding: 4px 10px;\n  font-size: 12px;\n  font-weight: 500;\n  color: #999;\n}\n"
  },
  {
    "path": "doc/assets/docs.js",
    "content": "!function ($) {\n\n  $(function () {\n\n    var $window = $(window);\n    var $body   = $(document.body);\n\n    var navHeight = $('.navbar').outerHeight(true) + 10;\n\n    $body.scrollspy({\n      target: '.sidebar'\n    });\n\n    // analyse prefixed hash on load and redirect to right anchor\n    $window.on('load', function () {\n      $body.scrollspy('refresh');\n      if (/^#psly-/i.test(window.location.hash)) {\n        var h = window.location.hash.replace('psly-', '');\n\n        if ($(h).length)\n          window.location.hash = h;\n      }\n    });\n\n    // back to top hack with scrollipsy\n    $('.back-to-top').on('click', function () {\n      $('.sidebar .active').each(function () {\n        $(this).removeClass('active');\n      });\n\n      $('.sidebar ul:first li:first').addClass('active');\n    });\n\n    // back to top\n    setTimeout(function () {\n      var $sideBar = $('.sidebar');\n\n      $sideBar.affix({\n        offset: {\n          top: function () {\n            var offsetTop      = $sideBar.offset().top;\n            var sideBarMargin  = parseInt($sideBar.children(0).css('margin-top'), 10);\n            var navOuterHeight = 10;\n\n            return (this.top = offsetTop - navOuterHeight - sideBarMargin);\n          },\n          bottom: function () {\n            return (this.bottom = $('.footer').outerHeight(true));\n          }\n        }\n      });\n    }, 100);\n\n    setTimeout(function () {\n      $('.top').affix();\n    }, 100);\n  });\n\n}(window.jQuery);\n"
  },
  {
    "path": "doc/assets/docs.less",
    "content": "body {\n  color: #111111;\n}\n\n.branding {\n  width: 100%;\n  color: #676E72;;\n  font-size: 1.1em;\n  text-align: center;\n  background-color: #F1BC32;\n  background-color: rgba(241,188,50,.15);\n  padding: 24px;\n}\n.branding a {\n  font-weight: 700;\n}\n\n@media (min-width: 768px) {\n  .nav-justified {\n    max-height: 52px;\n  }\n  .nav-justified > li > a {\n    border-left: 1px solid #fff;\n    border-right: 1px solid #d5d5d5;\n  }\n  .nav-justified > li:first-child > a {\n    border-left: 0;\n    border-radius: 5px 0 0 5px;\n  }\n  .nav-justified > li:last-child > a {\n    border-radius: 0 5px 5px 0;\n    border-right: 0;\n  }\n  .sidebar {\n    display: block;\n  }\n}\n\n/* Responsive: Portrait tablets and up */\n@media screen and (min-width: 768px) {\n  /* Remove the padding we set earlier */\n  .masthead,\n  .marketing,\n  .footer {\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n\n@media screen and (min-width: 992px) {\n  .affix-top {\n    top:30px;\n  }\n  .sidebar.affix {\n    top: 10px;\n    margin-top: 0px;\n  }\n}\n\n.footer {\n  border-top: 1px solid #eee;\n  margin-top: 40px;\n  padding-top: 40px;\n  padding-bottom: 40px;\n}\n\n/* Main marketing message and sign up button */\n.jumbotron {\n  text-align: center;\n  background-color: transparent;\n}\n.jumbotron .btn {\n  font-size: 21px;\n  padding: 14px 24px;\n}\n\n/* Customize the nav-justified links to be fill the entire space of the .navbar */\n\n.nav-justified {\n  background-color: #eee;\n  border-radius: 5px;\n  border: 1px solid #ccc;\n}\n.nav-justified > li > a {\n  margin-bottom: 0;\n  padding-top: 15px;\n  padding-bottom: 15px;\n  color: #777;\n  font-weight: bold;\n  text-align: center;\n  border-bottom: 1px solid #d5d5d5;\n  background-color: #e5e5e5; /* Old browsers */\n  background-repeat: repeat-x; /* Repeat the gradient */\n  background-image: -moz-linear-gradient(top, #f5f5f5 0%, #e5e5e5 100%); /* FF3.6+ */\n  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f5f5f5), color-stop(100%,#e5e5e5)); /* Chrome,Safari4+ */\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%,#e5e5e5 100%); /* Chrome 10+,Safari 5.1+ */\n  background-image: -o-linear-gradient(top, #f5f5f5 0%,#e5e5e5 100%); /* Opera 11.10+ */\n  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#e5e5e5',GradientType=0 ); /* IE6-9 */\n  background-image: linear-gradient(top, #f5f5f5 0%,#e5e5e5 100%); /* W3C */\n}\n.nav-justified > .active > a,\n.nav-justified > .active > a:hover,\n.nav-justified > .active > a:focus {\n  background-color: #ddd;\n  background-image: none;\n  box-shadow: inset 0 3px 7px rgba(0,0,0,.15);\n}\n.nav-justified > li:first-child > a {\n  border-radius: 5px 5px 0 0;\n}\n.nav-justified > li:last-child > a {\n  border-bottom: 0;\n  border-radius: 0 0 5px 5px;\n}\n\n.header h3 {\n  display: inline-block;\n}\n.social-buttons {\n  padding: 5px 20px;\n}\n\n/*\n* Affix sidebar\n*\n*/\n.sidebar {\n  margin-top: 40px;\n\n  .nav {\n    &>li>a {\n      display: block;\n      font-size: 13px;\n      font-weight: 500;\n      color: #111111;\n      padding: 4px 20px;\n    }\n\n    &>.active, &>.active:hover, &>.active:focus {\n      &>ul {\n        display: block;\n      }\n\n      &>a {\n        padding-left: 18px;\n        font-weight: 700;\n        color: #FF851B;\n        background-color: transparent;\n        border-left: 2px solid #FF851B;\n      }\n    }\n\n    .nav {\n      display: none;\n      padding-bottom: 10px;\n\n      &>li>a {\n        padding-top: 2px;\n        padding-bottom: 2px;\n        padding-left: 30px;\n        font-size: 12px;\n        font-weight: 400;\n      }\n\n      &>.active>a {\n        font-weight: 500;\n        padding-left: 28px;\n      }\n    }\n  }\n}\n\n/*\n* Callouts\n*\n* Not quite alerts, but custom and helpful notes for folks reading the docs.\n* Requires a base and modifier class.\n*/\n\n/* Common styles for all types */\n.bs-callout {\n  margin: 20px 0;\n  padding: 20px;\n  border-left: 3px solid #eee;\n}\n.bs-callout h4 {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.bs-callout p:last-child {\n  margin-bottom: 0;\n}\n.bs-callout code {\n  background-color: #fff;\n  border-radius: 3px;\n}\n\n/* Variations */\n.bs-callout-danger {\n  background-color: #fdf7f7;\n  border-color: #d9534f;\n}\n.bs-callout-danger h4 {\n  color: #d9534f;\n}\n.bs-callout-warning {\n  background-color: #fcf8f2;\n  border-color: #f0ad4e;\n}\n.bs-callout-warning h4 {\n  color: #f0ad4e;\n}\n.bs-callout-info {\n  background-color: #f4f8fa;\n  border-color: #5bc0de;\n}\n.bs-callout-info h4 {\n  color: #5bc0de;\n}\n\n.hundred {\n  width: 100%;\n}\n\nversion {\n  color:#949494;\n  font-size: 0.9em;\n}\n\nh3 {\n  color: #FF851B;\n}\n\n.back-to-top {\n  margin-top: 10px;\n  margin-left: 10px;\n  padding: 4px 10px;\n  font-size: 12px;\n  font-weight: 500;\n  color: #999;\n}\n"
  },
  {
    "path": "doc/assets/example.js",
    "content": "(function() {\n  var html = $.trim($('div.example').html());\n  var js = $.trim($('script.example').text());\n  function createCodeExample() {\n    $('code.example').text(\n      html +\n      '\\n\\n<' + 'script type=\"text/javascript\">\\n' +\n      js +\n      '\\n<' + '/script>\\n'\n    );\n  }\n\n  function launchEditor() {\n    var css = $.trim($('style.example').text());\n    var distUrl = 'https://cdn.jsdelivr.net/gh/guillaumepotier/Parsley.js@' + window.Parsley.version;\n    var data = {\n      title: $(document).attr('title'),\n      description: \"Where does this show???\",\n      html: html,\n      js: js,\n      css: css + '\\nhtml.codepen body {\\n  margin: 1em;\\n}\\n',\n      html_classes: 'codepen',\n      js_external: [\n        '//code.jquery.com/jquery-2.1.3.js',\n        distUrl + '/dist/parsley.js'\n      ].join(';'),\n      css_external: [\n        distUrl + '/bower_components/bootstrap/dist/css/bootstrap.css',\n        distUrl + '/doc/assets/docs.css',\n        distUrl + '/src/parsley.css'\n      ].join(';')\n    };\n\n    var $input = $('<input type=\"hidden\" name=\"data\">')\n      .val(JSON.stringify(data));\n    var $form = $('<form action=\"https://codepen.io/pen/define?editors=101\" method=\"POST\" target=\"_blank\">')\n      .append($input)\n      .appendTo($('body')) // Required to work on Firefox...\n      .submit();\n  }\n\n  function track() {\n    var _gaq = _gaq || [];\n    _gaq.push(['_setAccount', 'UA-37229467-1']);\n    _gaq.push(['_trackPageview']);\n\n    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;\n    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';\n    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);\n  }\n\n  function init() {\n    createCodeExample();\n\n    try {\n      hljs.initHighlightingOnLoad();\n    } catch ( err ) {}\n\n    $('.play').html($('.play').html().replace('CodePen', svg)).click(launchEditor);\n\n    track();\n  }\n\n  var svg = '<svg version=\"1.1\" x=\"31px\" y=\"62px\" \\\n   width=\"250px\" height=\"50px\" viewBox=\"31 62 250 50\" enable-background=\"new 31 62 250 50\" style=\"height: 2.2em; padding-bottom: 0.2em; width: 10em; vertical-align: middle\"> \\\n<g> \\\n  <path fill=\"#428bca\" d=\"M51.011,76.064c2.696,0,5.168,0.975,7.086,2.586l2.61-3.111c-2.624-2.206-6.007-3.538-9.696-3.538 \\\n    c-8.322,0-15.093,6.771-15.093,15.093s6.771,15.094,15.093,15.094c3.689,0,7.072-1.332,9.696-3.539l-2.61-3.11 \\\n    c-1.918,1.612-4.39,2.585-7.086,2.585c-6.081,0-11.029-4.948-11.029-11.029C39.982,81.014,44.93,76.064,51.011,76.064z\"/> \\\n  <path fill=\"#428bca\" d=\"M134.562,72.873h-8.127c-1.122,0-2.032,0.91-2.032,2.031v24.381c0,1.123,0.91,2.031,2.032,2.031h8.127 \\\n    c7.842,0,14.222-6.379,14.222-14.223C148.784,79.251,142.404,72.873,134.562,72.873z M134.562,97.254h-6.096V76.938h6.096 \\\n    c5.602,0,10.159,4.557,10.159,10.158C144.722,92.697,140.164,97.254,134.562,97.254z\"/> \\\n  <path fill=\"#428bca\" d=\"M159.786,74.904v24.381c0,1.123,0.909,2.031,2.032,2.031h16.932v-4.063h-14.898v-8.127h9.48v-4.063h-9.48 \\\n    v-8.127h14.898v-4.062h-16.932C160.695,72.873,159.786,73.783,159.786,74.904z\"/> \\\n  <path fill=\"#428bca\" d=\"M221.289,74.904v24.381c0,1.123,0.909,2.031,2.031,2.031h16.932v-4.063h-14.898v-8.127h9.48v-4.063h-9.48 \\\n    v-8.127h14.898v-4.062H223.32C222.198,72.873,221.289,73.783,221.289,74.904z\"/> \\\n  <path fill=\"#428bca\" d=\"M201.952,72.873h-8.804c-1.123,0-2.032,0.91-2.032,2.031v26.414h4.063V89.127h6.771 \\\n    c4.48,0,8.127-3.646,8.127-8.127S206.434,72.873,201.952,72.873z M201.952,85.062h-6.772v-8.127h6.772 \\\n    c2.241,0,4.063,1.822,4.063,4.063C206.016,83.241,204.193,85.062,201.952,85.062z\"/> \\\n  <path fill=\"#428bca\" d=\"M272.018,72.873v20.801l-16.725-20.07c-0.548-0.658-1.447-0.901-2.253-0.609s-1.341,1.055-1.341,1.91 \\\n    v26.414h4.064V80.518l16.725,20.069c0.395,0.474,0.97,0.731,1.562,0.731c0.231,0,0.466-0.041,0.691-0.123 \\\n    c0.805-0.291,1.341-1.055,1.341-1.91V72.873H272.018z\"/> \\\n  <path fill=\"#428bca\" d=\"M112.861,80.168c-0.01-0.053-0.02-0.105-0.033-0.156c-0.008-0.031-0.02-0.06-0.029-0.091 \\\n    c-0.015-0.046-0.029-0.091-0.047-0.136c-0.014-0.031-0.027-0.061-0.042-0.09c-0.021-0.043-0.041-0.084-0.063-0.125 \\\n    c-0.018-0.028-0.035-0.057-0.054-0.086c-0.024-0.039-0.051-0.075-0.078-0.112c-0.021-0.026-0.042-0.054-0.064-0.08 \\\n    c-0.029-0.035-0.061-0.067-0.092-0.101c-0.025-0.025-0.049-0.049-0.075-0.073c-0.033-0.031-0.069-0.06-0.105-0.089 \\\n    c-0.027-0.021-0.055-0.043-0.084-0.063c-0.01-0.008-0.02-0.017-0.031-0.022l-19.81-13.208c-0.626-0.417-1.44-0.417-2.065,0 \\\n    L70.377,78.941c-0.011,0.008-0.02,0.017-0.03,0.023c-0.029,0.02-0.057,0.042-0.085,0.064c-0.036,0.027-0.071,0.057-0.105,0.088 \\\n    c-0.025,0.023-0.05,0.047-0.074,0.072c-0.032,0.033-0.062,0.066-0.093,0.102c-0.022,0.025-0.043,0.053-0.063,0.08 \\\n    c-0.028,0.037-0.054,0.074-0.079,0.113c-0.018,0.029-0.036,0.057-0.053,0.086c-0.023,0.041-0.044,0.082-0.063,0.123 \\\n    c-0.015,0.031-0.028,0.061-0.042,0.091c-0.018,0.044-0.033,0.09-0.048,0.136c-0.01,0.031-0.021,0.061-0.028,0.091 \\\n    c-0.014,0.052-0.023,0.104-0.033,0.156c-0.005,0.026-0.011,0.054-0.015,0.08c-0.011,0.081-0.017,0.161-0.017,0.244v13.207 \\\n    c0,0.081,0.006,0.163,0.017,0.243c0.004,0.026,0.01,0.054,0.015,0.08c0.01,0.053,0.02,0.104,0.033,0.155 \\\n    c0.008,0.031,0.019,0.06,0.028,0.091c0.015,0.047,0.03,0.092,0.048,0.137c0.014,0.031,0.027,0.061,0.042,0.091 \\\n    c0.02,0.042,0.04,0.083,0.063,0.124c0.017,0.029,0.035,0.058,0.053,0.086c0.025,0.039,0.051,0.076,0.079,0.113 \\\n    c0.021,0.027,0.041,0.054,0.063,0.08c0.03,0.035,0.061,0.067,0.093,0.102c0.024,0.025,0.049,0.049,0.074,0.072 \\\n    c0.034,0.031,0.069,0.06,0.105,0.088c0.028,0.021,0.056,0.044,0.085,0.064c0.011,0.008,0.02,0.017,0.03,0.022l19.811,13.207 \\\n    c0.312,0.209,0.672,0.313,1.032,0.313c0.36,0,0.721-0.104,1.033-0.313l19.81-13.207c0.012-0.007,0.021-0.017,0.031-0.022 \\\n    c0.029-0.021,0.057-0.043,0.084-0.064c0.036-0.028,0.072-0.057,0.105-0.088c0.026-0.023,0.05-0.047,0.075-0.072 \\\n    c0.031-0.033,0.062-0.066,0.092-0.102c0.022-0.026,0.044-0.053,0.064-0.08c0.027-0.037,0.054-0.074,0.078-0.113 \\\n    c0.019-0.028,0.036-0.057,0.054-0.086c0.022-0.041,0.043-0.082,0.063-0.124c0.015-0.03,0.028-0.06,0.042-0.091 \\\n    c0.018-0.045,0.032-0.09,0.047-0.137c0.01-0.031,0.021-0.06,0.029-0.091c0.014-0.051,0.023-0.103,0.033-0.155 \\\n    c0.004-0.026,0.011-0.054,0.015-0.08c0.01-0.08,0.017-0.162,0.017-0.243V80.492c0-0.083-0.007-0.163-0.017-0.244 \\\n    C112.872,80.223,112.865,80.195,112.861,80.168z M91.22,91.501l-6.587-4.405l6.587-4.406l6.588,4.406L91.22,91.501z M89.357,79.454 \\\n    l-8.075,5.401l-6.518-4.36l14.593-9.729V79.454L89.357,79.454z M77.933,87.096l-4.66,3.116v-6.233L77.933,87.096z M81.282,89.336 \\\n    l8.075,5.4v8.688l-14.593-9.729L81.282,89.336z M93.082,94.736l8.075-5.4l6.519,4.359l-14.594,9.729V94.736z M104.508,87.096 \\\n    l4.66-3.117v6.232L104.508,87.096z M101.157,84.854l-8.075-5.4v-8.688l14.594,9.729L101.157,84.854z\"/> \\\n</g> \\\n</svg> \\\n';\n\n  init();\n\n})();\n"
  },
  {
    "path": "doc/assets/help.css",
    "content": ".uwidget {\n  border: 1px solid #e5e5e5;\n}\n.uwidget .uwidget-actions {\n  display: block;\n  height: 22px;\n  background-color: #f5f5f5;\n  padding: 0 10px;\n}\n.uwidget .uwidget-actions .filters {\n  float: right;\n}\n.uwidget .uwidget-info {\n  display: block;\n  height: 15px;\n  padding: 2px;\n  color: #999999;\n  font-size: 10px;\n  text-align: right;\n  background-color: #f5f5f5;\n}\n.uwidget .uwidget-info a,\n.uwidget .uwidget-info a:hover,\n.uwidget .uwidget-info a:visited {\n  color: #999999;\n  text-decoration: none;\n}\n.uwidget ul.uwidget-container {\n  display: block;\n  margin: 0;\n  padding: 2px;\n  list-style: none;\n  text-align: justify;\n  overflow-x: hidden;\n  overflow-y: scroll;\n}\n.uwidget ul.uwidget-container li {\n  position: relative;\n  display: block;\n  margin-bottom: -1px;\n  padding: 8px;\n  border-bottom: 1px solid #e5e5e5;\n}\n.uwidget ul.uwidget-container li:last-child {\n  border: none;\n}\n.uwidget ul.uwidget-container li .gh-issue-title,\n.uwidget ul.uwidget-container li .stack-question-title {\n  margin: 5px;\n  font-size: 15px;\n  line-height: 1.3;\n  margin-bottom: 2px;\n  word-wrap: break-word;\n}\n.uwidget ul.uwidget-container li .gh-issue-title a,\n.uwidget ul.uwidget-container li .stack-question-title a {\n  color: #111111;\n  text-decoration: none;\n}\n.uwidget ul.uwidget-container li .gh-issue-comments,\n.uwidget ul.uwidget-container li .stack-question-answers {\n  width: 80px;\n  float: left;\n  margin-left: 5px;\n  font-size: 13px;\n  color: #999999;\n}\n"
  },
  {
    "path": "doc/assets/help.less",
    "content": "@lightgrey: #999;\n@extralightgrey: #f5f5f5;\n@border: #e5e5e5;\n@black: #111;\n\n.uwidget {\n  border: 1px solid @border;\n\n  .uwidget-actions {\n    display: block;\n    height: 22px;\n    background-color: @extralightgrey;\n    padding: 0 10px;\n\n    .filters {\n      float:right;\n    }\n  }\n\n  .uwidget-info {\n    display: block;\n    height: 15px;\n    padding: 2px;\n    color: @lightgrey;\n    font-size: 10px;\n    text-align: right;\n    background-color: @extralightgrey;\n\n    a, a:hover, a:visited {\n      color: @lightgrey;\n      text-decoration: none;\n    }\n  }\n\n  ul.uwidget-container {\n    display: block;\n    margin: 0;\n    padding: 2px;\n    list-style: none;\n    text-align: justify;\n    overflow-x: hidden;\n    overflow-y: scroll;\n\n    li {\n      position: relative;\n      display: block;\n      margin-bottom: -1px;\n      padding: 8px;\n      border-bottom: 1px solid @border;\n\n      &:last-child {\n        border: none;\n      }\n\n      .gh-issue-title, .stack-question-title {\n        margin: 5px;\n        font-size: 15px;\n        line-height: 1.3;\n        margin-bottom: 2px;\n        word-wrap: break-word;\n\n        a {\n          color: @black;\n          text-decoration: none;\n        }\n      }\n\n      .gh-issue-comments, .stack-question-answers {\n        width: 80px;\n        float: left;\n        margin-left: 5px;\n        font-size: 13px;\n        color: @lightgrey;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "doc/assets/spec-build.js",
    "content": "/*!\n* Parsley.js\n* Version 2.9.2 - built Tue, Dec 10th 2019, 6:18 pm\n* http://parsleyjs.org\n* Guillaume Potier - <guillaume@wisembly.com>\n* Marc-Andre Lafortune - <petroselinum@marc-andre.ca>\n* MIT Licensed\n*/\n\n// The source code below is generated by babel as\n// Parsley is written in ECMAScript 6\n//\n\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('jquery')) :\n  typeof define === 'function' && define.amd ? define(['jquery'], factory) :\n  (global = global || self, factory(global.jQuery));\n}(this, (function ($) { 'use strict';\n\n  function setup_ew () {\n    beforeEach(function () {\n      sinon.spy(window.console, 'warn');\n      window.console.warn.expectedCallCount = 0;\n    });\n    afterEach(function () {\n      expect(window.console.warn.callCount).to.be(window.console.warn.expectedCallCount);\n      window.console.warn.restore();\n    });\n\n    global.expectWarning = function (fn) {\n      var w = window.console.warn;\n      expect(w.callCount).to.be(w.expectedCallCount);\n      var result = fn.call();\n      w.expectedCallCount++;\n      expect(w.callCount).to.be(w.expectedCallCount);\n      return result;\n    };\n  }\n\n  function setup_dlc () {\n    afterEach(function () {\n      expect($('form input').length).to.be(0);\n    });\n    window.$ = $; // Export for testing purposes...\n  }\n\n  function setup () {\n    beforeEach(function () {\n      this.sandbox = global.sinon.sandbox.create();\n      global.stub = this.sandbox.stub.bind(this.sandbox);\n      global.spy = this.sandbox.spy.bind(this.sandbox);\n    });\n    afterEach(function () {\n      delete global.stub;\n      delete global.spy;\n      this.sandbox.restore();\n    });\n    setup_ew();\n    setup_dlc();\n  }\n\n  var mocha = {\n    globals: [\"$\", \"stub\", \"spy\", \"expect\", \"expectWarning\"]\n  };\n\n  window.global = window;\n  global.travis = false;\n  global.mocha.setup('bdd');\n\n  global.onload = function () {\n    global.mocha.checkLeaks();\n    global.mocha.globals(mocha.globals);\n    global.mocha.run();\n    setup();\n  };\n\n  function _typeof(obj) {\n    if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n      _typeof = function (obj) {\n        return typeof obj;\n      };\n    } else {\n      _typeof = function (obj) {\n        return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n      };\n    }\n\n    return _typeof(obj);\n  }\n\n  function _extends() {\n    _extends = Object.assign || function (target) {\n      for (var i = 1; i < arguments.length; i++) {\n        var source = arguments[i];\n\n        for (var key in source) {\n          if (Object.prototype.hasOwnProperty.call(source, key)) {\n            target[key] = source[key];\n          }\n        }\n      }\n\n      return target;\n    };\n\n    return _extends.apply(this, arguments);\n  }\n\n  function _slicedToArray(arr, i) {\n    return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();\n  }\n\n  function _toConsumableArray(arr) {\n    return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();\n  }\n\n  function _arrayWithoutHoles(arr) {\n    if (Array.isArray(arr)) {\n      for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n      return arr2;\n    }\n  }\n\n  function _arrayWithHoles(arr) {\n    if (Array.isArray(arr)) return arr;\n  }\n\n  function _iterableToArray(iter) {\n    if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter);\n  }\n\n  function _iterableToArrayLimit(arr, i) {\n    if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === \"[object Arguments]\")) {\n      return;\n    }\n\n    var _arr = [];\n    var _n = true;\n    var _d = false;\n    var _e = undefined;\n\n    try {\n      for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n        _arr.push(_s.value);\n\n        if (i && _arr.length === i) break;\n      }\n    } catch (err) {\n      _d = true;\n      _e = err;\n    } finally {\n      try {\n        if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n      } finally {\n        if (_d) throw _e;\n      }\n    }\n\n    return _arr;\n  }\n\n  function _nonIterableSpread() {\n    throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n  }\n\n  function _nonIterableRest() {\n    throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n  }\n\n  var globalID = 1;\n  var pastWarnings = {};\n  var Utils = {\n    // Parsley DOM-API\n    // returns object from dom attributes and values\n    attr: function attr(element, namespace, obj) {\n      var i;\n      var attribute;\n      var attributes;\n      var regex = new RegExp('^' + namespace, 'i');\n      if ('undefined' === typeof obj) obj = {};else {\n        // Clear all own properties. This won't affect prototype's values\n        for (i in obj) {\n          if (obj.hasOwnProperty(i)) delete obj[i];\n        }\n      }\n      if (!element) return obj;\n      attributes = element.attributes;\n\n      for (i = attributes.length; i--;) {\n        attribute = attributes[i];\n\n        if (attribute && attribute.specified && regex.test(attribute.name)) {\n          obj[this.camelize(attribute.name.slice(namespace.length))] = this.deserializeValue(attribute.value);\n        }\n      }\n\n      return obj;\n    },\n    checkAttr: function checkAttr(element, namespace, _checkAttr) {\n      return element.hasAttribute(namespace + _checkAttr);\n    },\n    setAttr: function setAttr(element, namespace, attr, value) {\n      element.setAttribute(this.dasherize(namespace + attr), String(value));\n    },\n    getType: function getType(element) {\n      return element.getAttribute('type') || 'text';\n    },\n    generateID: function generateID() {\n      return '' + globalID++;\n    },\n\n    /** Third party functions **/\n    deserializeValue: function deserializeValue(value) {\n      var num;\n\n      try {\n        return value ? value == \"true\" || (value == \"false\" ? false : value == \"null\" ? null : !isNaN(num = Number(value)) ? num : /^[\\[\\{]/.test(value) ? JSON.parse(value) : value) : value;\n      } catch (e) {\n        return value;\n      }\n    },\n    // Zepto camelize function\n    camelize: function camelize(str) {\n      return str.replace(/-+(.)?/g, function (match, chr) {\n        return chr ? chr.toUpperCase() : '';\n      });\n    },\n    // Zepto dasherize function\n    dasherize: function dasherize(str) {\n      return str.replace(/::/g, '/').replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2').replace(/([a-z\\d])([A-Z])/g, '$1_$2').replace(/_/g, '-').toLowerCase();\n    },\n    warn: function warn() {\n      var _window$console;\n\n      if (window.console && 'function' === typeof window.console.warn) (_window$console = window.console).warn.apply(_window$console, arguments);\n    },\n    warnOnce: function warnOnce(msg) {\n      if (!pastWarnings[msg]) {\n        pastWarnings[msg] = true;\n        this.warn.apply(this, arguments);\n      }\n    },\n    _resetWarnings: function _resetWarnings() {\n      pastWarnings = {};\n    },\n    trimString: function trimString(string) {\n      return string.replace(/^\\s+|\\s+$/g, '');\n    },\n    parse: {\n      date: function date(string) {\n        var parsed = string.match(/^(\\d{4,})-(\\d\\d)-(\\d\\d)$/);\n        if (!parsed) return null;\n\n        var _parsed$map = parsed.map(function (x) {\n          return parseInt(x, 10);\n        }),\n            _parsed$map2 = _slicedToArray(_parsed$map, 4),\n            _ = _parsed$map2[0],\n            year = _parsed$map2[1],\n            month = _parsed$map2[2],\n            day = _parsed$map2[3];\n\n        var date = new Date(year, month - 1, day);\n        if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) return null;\n        return date;\n      },\n      string: function string(_string) {\n        return _string;\n      },\n      integer: function integer(string) {\n        if (isNaN(string)) return null;\n        return parseInt(string, 10);\n      },\n      number: function number(string) {\n        if (isNaN(string)) throw null;\n        return parseFloat(string);\n      },\n      'boolean': function _boolean(string) {\n        return !/^\\s*false\\s*$/i.test(string);\n      },\n      object: function object(string) {\n        return Utils.deserializeValue(string);\n      },\n      regexp: function regexp(_regexp) {\n        var flags = ''; // Test if RegExp is literal, if not, nothing to be done, otherwise, we need to isolate flags and pattern\n\n        if (/^\\/.*\\/(?:[gimy]*)$/.test(_regexp)) {\n          // Replace the regexp literal string with the first match group: ([gimy]*)\n          // If no flag is present, this will be a blank string\n          flags = _regexp.replace(/.*\\/([gimy]*)$/, '$1'); // Again, replace the regexp literal string with the first match group:\n          // everything excluding the opening and closing slashes and the flags\n\n          _regexp = _regexp.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1');\n        } else {\n          // Anchor regexp:\n          _regexp = '^' + _regexp + '$';\n        }\n\n        return new RegExp(_regexp, flags);\n      }\n    },\n    parseRequirement: function parseRequirement(requirementType, string) {\n      var converter = this.parse[requirementType || 'string'];\n      if (!converter) throw 'Unknown requirement specification: \"' + requirementType + '\"';\n      var converted = converter(string);\n      if (converted === null) throw \"Requirement is not a \".concat(requirementType, \": \\\"\").concat(string, \"\\\"\");\n      return converted;\n    },\n    namespaceEvents: function namespaceEvents(events, namespace) {\n      events = this.trimString(events || '').split(/\\s+/);\n      if (!events[0]) return '';\n      return $.map(events, function (evt) {\n        return \"\".concat(evt, \".\").concat(namespace);\n      }).join(' ');\n    },\n    difference: function difference(array, remove) {\n      // This is O(N^2), should be optimized\n      var result = [];\n      $.each(array, function (_, elem) {\n        if (remove.indexOf(elem) == -1) result.push(elem);\n      });\n      return result;\n    },\n    // Alter-ego to native Promise.all, but for jQuery\n    all: function all(promises) {\n      // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements\n      return $.when.apply($, _toConsumableArray(promises).concat([42, 42]));\n    },\n    // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n    objectCreate: Object.create || function () {\n      var Object = function Object() {};\n\n      return function (prototype) {\n        if (arguments.length > 1) {\n          throw Error('Second argument not supported');\n        }\n\n        if (_typeof(prototype) != 'object') {\n          throw TypeError('Argument must be an object');\n        }\n\n        Object.prototype = prototype;\n        var result = new Object();\n        Object.prototype = null;\n        return result;\n      };\n    }(),\n    _SubmitSelector: 'input[type=\"submit\"], button:submit'\n  };\n\n  // All these options could be overriden and specified directly in DOM using\n  // `data-parsley-` default DOM-API\n  // eg: `inputs` can be set in DOM using `data-parsley-inputs=\"input, textarea\"`\n  // eg: `data-parsley-stop-on-first-failing-constraint=\"false\"`\n  var Defaults = {\n    // ### General\n    // Default data-namespace for DOM API\n    namespace: 'data-parsley-',\n    // Supported inputs by default\n    inputs: 'input, textarea, select',\n    // Excluded inputs by default\n    excluded: 'input[type=button], input[type=submit], input[type=reset], input[type=hidden]',\n    // Stop validating field on highest priority failing constraint\n    priorityEnabled: true,\n    // ### Field only\n    // identifier used to group together inputs (e.g. radio buttons...)\n    multiple: null,\n    // identifier (or array of identifiers) used to validate only a select group of inputs\n    group: null,\n    // ### UI\n    // Enable\\Disable error messages\n    uiEnabled: true,\n    // Key events threshold before validation\n    validationThreshold: 3,\n    // Focused field on form validation error. 'first'|'last'|'none'\n    focus: 'first',\n    // event(s) that will trigger validation before first failure. eg: `input`...\n    trigger: false,\n    // event(s) that will trigger validation after first failure.\n    triggerAfterFailure: 'input',\n    // Class that would be added on every failing validation Parsley field\n    errorClass: 'parsley-error',\n    // Same for success validation\n    successClass: 'parsley-success',\n    // Return the `$element` that will receive these above success or error classes\n    // Could also be (and given directly from DOM) a valid selector like `'#div'`\n    classHandler: function classHandler(Field) {},\n    // Return the `$element` where errors will be appended\n    // Could also be (and given directly from DOM) a valid selector like `'#div'`\n    errorsContainer: function errorsContainer(Field) {},\n    // ul elem that would receive errors' list\n    errorsWrapper: '<ul class=\"parsley-errors-list\"></ul>',\n    // li elem that would receive error message\n    errorTemplate: '<li></li>'\n  };\n\n  var Base = function Base() {\n    this.__id__ = Utils.generateID();\n  };\n\n  Base.prototype = {\n    asyncSupport: true,\n    // Deprecated\n    _pipeAccordingToValidationResult: function _pipeAccordingToValidationResult() {\n      var _this = this;\n\n      var pipe = function pipe() {\n        var r = $.Deferred();\n        if (true !== _this.validationResult) r.reject();\n        return r.resolve().promise();\n      };\n\n      return [pipe, pipe];\n    },\n    actualizeOptions: function actualizeOptions() {\n      Utils.attr(this.element, this.options.namespace, this.domOptions);\n      if (this.parent && this.parent.actualizeOptions) this.parent.actualizeOptions();\n      return this;\n    },\n    _resetOptions: function _resetOptions(initOptions) {\n      this.domOptions = Utils.objectCreate(this.parent.options);\n      this.options = Utils.objectCreate(this.domOptions); // Shallow copy of ownProperties of initOptions:\n\n      for (var i in initOptions) {\n        if (initOptions.hasOwnProperty(i)) this.options[i] = initOptions[i];\n      }\n\n      this.actualizeOptions();\n    },\n    _listeners: null,\n    // Register a callback for the given event name\n    // Callback is called with context as the first argument and the `this`\n    // The context is the current parsley instance, or window.Parsley if global\n    // A return value of `false` will interrupt the calls\n    on: function on(name, fn) {\n      this._listeners = this._listeners || {};\n      var queue = this._listeners[name] = this._listeners[name] || [];\n      queue.push(fn);\n      return this;\n    },\n    // Deprecated. Use `on` instead\n    subscribe: function subscribe(name, fn) {\n      $.listenTo(this, name.toLowerCase(), fn);\n    },\n    // Unregister a callback (or all if none is given) for the given event name\n    off: function off(name, fn) {\n      var queue = this._listeners && this._listeners[name];\n\n      if (queue) {\n        if (!fn) {\n          delete this._listeners[name];\n        } else {\n          for (var i = queue.length; i--;) {\n            if (queue[i] === fn) queue.splice(i, 1);\n          }\n        }\n      }\n\n      return this;\n    },\n    // Deprecated. Use `off`\n    unsubscribe: function unsubscribe(name, fn) {\n      $.unsubscribeTo(this, name.toLowerCase());\n    },\n    // Trigger an event of the given name\n    // A return value of `false` interrupts the callback chain\n    // Returns false if execution was interrupted\n    trigger: function trigger(name, target, extraArg) {\n      target = target || this;\n      var queue = this._listeners && this._listeners[name];\n      var result;\n\n      if (queue) {\n        for (var i = queue.length; i--;) {\n          result = queue[i].call(target, target, extraArg);\n          if (result === false) return result;\n        }\n      }\n\n      if (this.parent) {\n        return this.parent.trigger(name, target, extraArg);\n      }\n\n      return true;\n    },\n    asyncIsValid: function asyncIsValid(group, force) {\n      Utils.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n      return this.whenValid({\n        group: group,\n        force: force\n      });\n    },\n    _findRelated: function _findRelated() {\n      return this.options.multiple ? $(this.parent.element.querySelectorAll(\"[\".concat(this.options.namespace, \"multiple=\\\"\").concat(this.options.multiple, \"\\\"]\"))) : this.$element;\n    }\n  };\n\n  var convertArrayRequirement = function convertArrayRequirement(string, length) {\n    var m = string.match(/^\\s*\\[(.*)\\]\\s*$/);\n    if (!m) throw 'Requirement is not an array: \"' + string + '\"';\n    var values = m[1].split(',').map(Utils.trimString);\n    if (values.length !== length) throw 'Requirement has ' + values.length + ' values when ' + length + ' are needed';\n    return values;\n  };\n\n  var convertExtraOptionRequirement = function convertExtraOptionRequirement(requirementSpec, string, extraOptionReader) {\n    var main = null;\n    var extra = {};\n\n    for (var key in requirementSpec) {\n      if (key) {\n        var value = extraOptionReader(key);\n        if ('string' === typeof value) value = Utils.parseRequirement(requirementSpec[key], value);\n        extra[key] = value;\n      } else {\n        main = Utils.parseRequirement(requirementSpec[key], string);\n      }\n    }\n\n    return [main, extra];\n  }; // A Validator needs to implement the methods `validate` and `parseRequirements`\n\n\n  var Validator = function Validator(spec) {\n    $.extend(true, this, spec);\n  };\n\n  Validator.prototype = {\n    // Returns `true` iff the given `value` is valid according the given requirements.\n    validate: function validate(value, requirementFirstArg) {\n      if (this.fn) {\n        // Legacy style validator\n        if (arguments.length > 3) // If more args then value, requirement, instance...\n          requirementFirstArg = [].slice.call(arguments, 1, -1); // Skip first arg (value) and last (instance), combining the rest\n\n        return this.fn(value, requirementFirstArg);\n      }\n\n      if (Array.isArray(value)) {\n        if (!this.validateMultiple) throw 'Validator `' + this.name + '` does not handle multiple values';\n        return this.validateMultiple.apply(this, arguments);\n      } else {\n        var instance = arguments[arguments.length - 1];\n\n        if (this.validateDate && instance._isDateInput()) {\n          arguments[0] = Utils.parse.date(arguments[0]);\n          if (arguments[0] === null) return false;\n          return this.validateDate.apply(this, arguments);\n        }\n\n        if (this.validateNumber) {\n          if (!value) // Builtin validators all accept empty strings, except `required` of course\n            return true;\n          if (isNaN(value)) return false;\n          arguments[0] = parseFloat(arguments[0]);\n          return this.validateNumber.apply(this, arguments);\n        }\n\n        if (this.validateString) {\n          return this.validateString.apply(this, arguments);\n        }\n\n        throw 'Validator `' + this.name + '` only handles multiple values';\n      }\n    },\n    // Parses `requirements` into an array of arguments,\n    // according to `this.requirementType`\n    parseRequirements: function parseRequirements(requirements, extraOptionReader) {\n      if ('string' !== typeof requirements) {\n        // Assume requirement already parsed\n        // but make sure we return an array\n        return Array.isArray(requirements) ? requirements : [requirements];\n      }\n\n      var type = this.requirementType;\n\n      if (Array.isArray(type)) {\n        var values = convertArrayRequirement(requirements, type.length);\n\n        for (var i = 0; i < values.length; i++) {\n          values[i] = Utils.parseRequirement(type[i], values[i]);\n        }\n\n        return values;\n      } else if ($.isPlainObject(type)) {\n        return convertExtraOptionRequirement(type, requirements, extraOptionReader);\n      } else {\n        return [Utils.parseRequirement(type, requirements)];\n      }\n    },\n    // Defaults:\n    requirementType: 'string',\n    priority: 2\n  };\n\n  var ValidatorRegistry = function ValidatorRegistry(validators, catalog) {\n    this.__class__ = 'ValidatorRegistry'; // Default Parsley locale is en\n\n    this.locale = 'en';\n    this.init(validators || {}, catalog || {});\n  };\n\n  var typeTesters = {\n    email: /^((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-zA-Z]|\\d|-|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-zA-Z]|\\d|-|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))$/,\n    // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n    number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n    integer: /^-?\\d+$/,\n    digits: /^\\d+$/,\n    alphanum: /^\\w+$/i,\n    date: {\n      test: function test(value) {\n        return Utils.parse.date(value) !== null;\n      }\n    },\n    url: new RegExp(\"^\" + // protocol identifier\n    \"(?:(?:https?|ftp)://)?\" + // ** mod: make scheme optional\n    // user:pass authentication\n    \"(?:\\\\S+(?::\\\\S*)?@)?\" + \"(?:\" + // IP address exclusion\n    // private & local networks\n    // \"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" +   // ** mod: allow local networks\n    // \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" +  // ** mod: allow local networks\n    // \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\" +  // ** mod: allow local networks\n    // IP address dotted notation octets\n    // excludes loopback network 0.0.0.0\n    // excludes reserved space >= 224.0.0.0\n    // excludes network & broacast addresses\n    // (first & last IP address of each class)\n    \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" + \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" + \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" + \"|\" + // host name\n    \"(?:(?:[a-zA-Z\\\\u00a1-\\\\uffff0-9]-*)*[a-zA-Z\\\\u00a1-\\\\uffff0-9]+)\" + // domain name\n    \"(?:\\\\.(?:[a-zA-Z\\\\u00a1-\\\\uffff0-9]-*)*[a-zA-Z\\\\u00a1-\\\\uffff0-9]+)*\" + // TLD identifier\n    \"(?:\\\\.(?:[a-zA-Z\\\\u00a1-\\\\uffff]{2,}))\" + \")\" + // port number\n    \"(?::\\\\d{2,5})?\" + // resource path\n    \"(?:/\\\\S*)?\" + \"$\")\n  };\n  typeTesters.range = typeTesters.number; // See http://stackoverflow.com/a/10454560/8279\n\n  var decimalPlaces = function decimalPlaces(num) {\n    var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n\n    if (!match) {\n      return 0;\n    }\n\n    return Math.max(0, // Number of digits right of decimal point.\n    (match[1] ? match[1].length : 0) - ( // Adjust for scientific notation.\n    match[2] ? +match[2] : 0));\n  }; // parseArguments('number', ['1', '2']) => [1, 2]\n\n\n  var parseArguments = function parseArguments(type, args) {\n    return args.map(Utils.parse[type]);\n  }; // operatorToValidator returns a validating function for an operator function, applied to the given type\n\n\n  var operatorToValidator = function operatorToValidator(type, operator) {\n    return function (value) {\n      for (var _len = arguments.length, requirementsAndInput = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        requirementsAndInput[_key - 1] = arguments[_key];\n      }\n\n      requirementsAndInput.pop(); // Get rid of `input` argument\n\n      return operator.apply(void 0, [value].concat(_toConsumableArray(parseArguments(type, requirementsAndInput))));\n    };\n  };\n\n  var comparisonOperator = function comparisonOperator(operator) {\n    return {\n      validateDate: operatorToValidator('date', operator),\n      validateNumber: operatorToValidator('number', operator),\n      requirementType: operator.length <= 2 ? 'string' : ['string', 'string'],\n      // Support operators with a 1 or 2 requirement(s)\n      priority: 30\n    };\n  };\n\n  ValidatorRegistry.prototype = {\n    init: function init(validators, catalog) {\n      this.catalog = catalog; // Copy prototype's validators:\n\n      this.validators = _extends({}, this.validators);\n\n      for (var name in validators) {\n        this.addValidator(name, validators[name].fn, validators[name].priority);\n      }\n\n      window.Parsley.trigger('parsley:validator:init');\n    },\n    // Set new messages locale if we have dictionary loaded in ParsleyConfig.i18n\n    setLocale: function setLocale(locale) {\n      if ('undefined' === typeof this.catalog[locale]) throw new Error(locale + ' is not available in the catalog');\n      this.locale = locale;\n      return this;\n    },\n    // Add a new messages catalog for a given locale. Set locale for this catalog if set === `true`\n    addCatalog: function addCatalog(locale, messages, set) {\n      if ('object' === _typeof(messages)) this.catalog[locale] = messages;\n      if (true === set) return this.setLocale(locale);\n      return this;\n    },\n    // Add a specific message for a given constraint in a given locale\n    addMessage: function addMessage(locale, name, message) {\n      if ('undefined' === typeof this.catalog[locale]) this.catalog[locale] = {};\n      this.catalog[locale][name] = message;\n      return this;\n    },\n    // Add messages for a given locale\n    addMessages: function addMessages(locale, nameMessageObject) {\n      for (var name in nameMessageObject) {\n        this.addMessage(locale, name, nameMessageObject[name]);\n      }\n\n      return this;\n    },\n    // Add a new validator\n    //\n    //    addValidator('custom', {\n    //        requirementType: ['integer', 'integer'],\n    //        validateString: function(value, from, to) {},\n    //        priority: 22,\n    //        messages: {\n    //          en: \"Hey, that's no good\",\n    //          fr: \"Aye aye, pas bon du tout\",\n    //        }\n    //    })\n    //\n    // Old API was addValidator(name, function, priority)\n    //\n    addValidator: function addValidator(name, arg1, arg2) {\n      if (this.validators[name]) Utils.warn('Validator \"' + name + '\" is already defined.');else if (Defaults.hasOwnProperty(name)) {\n        Utils.warn('\"' + name + '\" is a restricted keyword and is not a valid validator name.');\n        return;\n      }\n      return this._setValidator.apply(this, arguments);\n    },\n    hasValidator: function hasValidator(name) {\n      return !!this.validators[name];\n    },\n    updateValidator: function updateValidator(name, arg1, arg2) {\n      if (!this.validators[name]) {\n        Utils.warn('Validator \"' + name + '\" is not already defined.');\n        return this.addValidator.apply(this, arguments);\n      }\n\n      return this._setValidator.apply(this, arguments);\n    },\n    removeValidator: function removeValidator(name) {\n      if (!this.validators[name]) Utils.warn('Validator \"' + name + '\" is not defined.');\n      delete this.validators[name];\n      return this;\n    },\n    _setValidator: function _setValidator(name, validator, priority) {\n      if ('object' !== _typeof(validator)) {\n        // Old style validator, with `fn` and `priority`\n        validator = {\n          fn: validator,\n          priority: priority\n        };\n      }\n\n      if (!validator.validate) {\n        validator = new Validator(validator);\n      }\n\n      this.validators[name] = validator;\n\n      for (var locale in validator.messages || {}) {\n        this.addMessage(locale, name, validator.messages[locale]);\n      }\n\n      return this;\n    },\n    getErrorMessage: function getErrorMessage(constraint) {\n      var message; // Type constraints are a bit different, we have to match their requirements too to find right error message\n\n      if ('type' === constraint.name) {\n        var typeMessages = this.catalog[this.locale][constraint.name] || {};\n        message = typeMessages[constraint.requirements];\n      } else message = this.formatMessage(this.catalog[this.locale][constraint.name], constraint.requirements);\n\n      return message || this.catalog[this.locale].defaultMessage || this.catalog.en.defaultMessage;\n    },\n    // Kind of light `sprintf()` implementation\n    formatMessage: function formatMessage(string, parameters) {\n      if ('object' === _typeof(parameters)) {\n        for (var i in parameters) {\n          string = this.formatMessage(string, parameters[i]);\n        }\n\n        return string;\n      }\n\n      return 'string' === typeof string ? string.replace(/%s/i, parameters) : '';\n    },\n    // Here is the Parsley default validators list.\n    // A validator is an object with the following key values:\n    //  - priority: an integer\n    //  - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n    //  - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n    // Alternatively, a validator can be a function that returns such an object\n    //\n    validators: {\n      notblank: {\n        validateString: function validateString(value) {\n          return /\\S/.test(value);\n        },\n        priority: 2\n      },\n      required: {\n        validateMultiple: function validateMultiple(values) {\n          return values.length > 0;\n        },\n        validateString: function validateString(value) {\n          return /\\S/.test(value);\n        },\n        priority: 512\n      },\n      type: {\n        validateString: function validateString(value, type) {\n          var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n              _ref$step = _ref.step,\n              step = _ref$step === void 0 ? 'any' : _ref$step,\n              _ref$base = _ref.base,\n              base = _ref$base === void 0 ? 0 : _ref$base;\n\n          var tester = typeTesters[type];\n\n          if (!tester) {\n            throw new Error('validator type `' + type + '` is not supported');\n          }\n\n          if (!value) return true; // Builtin validators all accept empty strings, except `required` of course\n\n          if (!tester.test(value)) return false;\n\n          if ('number' === type) {\n            if (!/^any$/i.test(step || '')) {\n              var nb = Number(value);\n              var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n              if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n                return false; // Be careful of rounding errors by using integers.\n\n              var toInt = function toInt(f) {\n                return Math.round(f * Math.pow(10, decimals));\n              };\n\n              if ((toInt(nb) - toInt(base)) % toInt(step) != 0) return false;\n            }\n          }\n\n          return true;\n        },\n        requirementType: {\n          '': 'string',\n          step: 'string',\n          base: 'number'\n        },\n        priority: 256\n      },\n      pattern: {\n        validateString: function validateString(value, regexp) {\n          if (!value) return true; // Builtin validators all accept empty strings, except `required` of course\n\n          return regexp.test(value);\n        },\n        requirementType: 'regexp',\n        priority: 64\n      },\n      minlength: {\n        validateString: function validateString(value, requirement) {\n          if (!value) return true; // Builtin validators all accept empty strings, except `required` of course\n\n          return value.length >= requirement;\n        },\n        requirementType: 'integer',\n        priority: 30\n      },\n      maxlength: {\n        validateString: function validateString(value, requirement) {\n          return value.length <= requirement;\n        },\n        requirementType: 'integer',\n        priority: 30\n      },\n      length: {\n        validateString: function validateString(value, min, max) {\n          if (!value) return true; // Builtin validators all accept empty strings, except `required` of course\n\n          return value.length >= min && value.length <= max;\n        },\n        requirementType: ['integer', 'integer'],\n        priority: 30\n      },\n      mincheck: {\n        validateMultiple: function validateMultiple(values, requirement) {\n          return values.length >= requirement;\n        },\n        requirementType: 'integer',\n        priority: 30\n      },\n      maxcheck: {\n        validateMultiple: function validateMultiple(values, requirement) {\n          return values.length <= requirement;\n        },\n        requirementType: 'integer',\n        priority: 30\n      },\n      check: {\n        validateMultiple: function validateMultiple(values, min, max) {\n          return values.length >= min && values.length <= max;\n        },\n        requirementType: ['integer', 'integer'],\n        priority: 30\n      },\n      min: comparisonOperator(function (value, requirement) {\n        return value >= requirement;\n      }),\n      max: comparisonOperator(function (value, requirement) {\n        return value <= requirement;\n      }),\n      range: comparisonOperator(function (value, min, max) {\n        return value >= min && value <= max;\n      }),\n      equalto: {\n        validateString: function validateString(value, refOrValue) {\n          if (!value) return true; // Builtin validators all accept empty strings, except `required` of course\n\n          var $reference = $(refOrValue);\n          if ($reference.length) return value === $reference.val();else return value === refOrValue;\n        },\n        priority: 256\n      },\n      euvatin: {\n        validateString: function validateString(value, refOrValue) {\n          if (!value) {\n            return true; // Builtin validators all accept empty strings, except `required` of course\n          }\n\n          var re = /^[A-Z][A-Z][A-Za-z0-9 -]{2,}$/;\n          return re.test(value);\n        },\n        priority: 30\n      }\n    }\n  };\n\n  var UI = {};\n\n  var diffResults = function diffResults(newResult, oldResult, deep) {\n    var added = [];\n    var kept = [];\n\n    for (var i = 0; i < newResult.length; i++) {\n      var found = false;\n\n      for (var j = 0; j < oldResult.length; j++) {\n        if (newResult[i].assert.name === oldResult[j].assert.name) {\n          found = true;\n          break;\n        }\n      }\n\n      if (found) kept.push(newResult[i]);else added.push(newResult[i]);\n    }\n\n    return {\n      kept: kept,\n      added: added,\n      removed: !deep ? diffResults(oldResult, newResult, true).added : []\n    };\n  };\n\n  UI.Form = {\n    _actualizeTriggers: function _actualizeTriggers() {\n      var _this = this;\n\n      this.$element.on('submit.Parsley', function (evt) {\n        _this.onSubmitValidate(evt);\n      });\n      this.$element.on('click.Parsley', Utils._SubmitSelector, function (evt) {\n        _this.onSubmitButton(evt);\n      }); // UI could be disabled\n\n      if (false === this.options.uiEnabled) return;\n      this.element.setAttribute('novalidate', '');\n    },\n    focus: function focus() {\n      this._focusedField = null;\n      if (true === this.validationResult || 'none' === this.options.focus) return null;\n\n      for (var i = 0; i < this.fields.length; i++) {\n        var field = this.fields[i];\n\n        if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n          this._focusedField = field.$element;\n          if ('first' === this.options.focus) break;\n        }\n      }\n\n      if (null === this._focusedField) return null;\n      return this._focusedField.focus();\n    },\n    _destroyUI: function _destroyUI() {\n      // Reset all event listeners\n      this.$element.off('.Parsley');\n    }\n  };\n  UI.Field = {\n    _reflowUI: function _reflowUI() {\n      this._buildUI(); // If this field doesn't have an active UI don't bother doing something\n\n\n      if (!this._ui) return; // Diff between two validation results\n\n      var diff = diffResults(this.validationResult, this._ui.lastValidationResult); // Then store current validation result for next reflow\n\n      this._ui.lastValidationResult = this.validationResult; // Handle valid / invalid / none field class\n\n      this._manageStatusClass(); // Add, remove, updated errors messages\n\n\n      this._manageErrorsMessages(diff); // Triggers impl\n\n\n      this._actualizeTriggers(); // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n\n\n      if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n        this._failedOnce = true;\n\n        this._actualizeTriggers();\n      }\n    },\n    // Returns an array of field's error message(s)\n    getErrorsMessages: function getErrorsMessages() {\n      // No error message, field is valid\n      if (true === this.validationResult) return [];\n      var messages = [];\n\n      for (var i = 0; i < this.validationResult.length; i++) {\n        messages.push(this.validationResult[i].errorMessage || this._getErrorMessage(this.validationResult[i].assert));\n      }\n\n      return messages;\n    },\n    // It's a goal of Parsley that this method is no longer required [#1073]\n    addError: function addError(name) {\n      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          message = _ref.message,\n          assert = _ref.assert,\n          _ref$updateClass = _ref.updateClass,\n          updateClass = _ref$updateClass === void 0 ? true : _ref$updateClass;\n\n      this._buildUI();\n\n      this._addError(name, {\n        message: message,\n        assert: assert\n      });\n\n      if (updateClass) this._errorClass();\n    },\n    // It's a goal of Parsley that this method is no longer required [#1073]\n    updateError: function updateError(name) {\n      var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          message = _ref2.message,\n          assert = _ref2.assert,\n          _ref2$updateClass = _ref2.updateClass,\n          updateClass = _ref2$updateClass === void 0 ? true : _ref2$updateClass;\n\n      this._buildUI();\n\n      this._updateError(name, {\n        message: message,\n        assert: assert\n      });\n\n      if (updateClass) this._errorClass();\n    },\n    // It's a goal of Parsley that this method is no longer required [#1073]\n    removeError: function removeError(name) {\n      var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          _ref3$updateClass = _ref3.updateClass,\n          updateClass = _ref3$updateClass === void 0 ? true : _ref3$updateClass;\n\n      this._buildUI();\n\n      this._removeError(name); // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n      // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n\n\n      if (updateClass) this._manageStatusClass();\n    },\n    _manageStatusClass: function _manageStatusClass() {\n      if (this.hasConstraints() && this.needsValidation() && true === this.validationResult) this._successClass();else if (this.validationResult.length > 0) this._errorClass();else this._resetClass();\n    },\n    _manageErrorsMessages: function _manageErrorsMessages(diff) {\n      if ('undefined' !== typeof this.options.errorsMessagesDisabled) return; // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n\n      if ('undefined' !== typeof this.options.errorMessage) {\n        if (diff.added.length || diff.kept.length) {\n          this._insertErrorWrapper();\n\n          if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length) this._ui.$errorsWrapper.append($(this.options.errorTemplate).addClass('parsley-custom-error-message'));\n\n          this._ui.$errorClassHandler.attr('aria-describedby', this._ui.errorsWrapperId);\n\n          return this._ui.$errorsWrapper.addClass('filled').attr('aria-hidden', 'false').find('.parsley-custom-error-message').html(this.options.errorMessage);\n        }\n\n        this._ui.$errorClassHandler.removeAttr('aria-describedby');\n\n        return this._ui.$errorsWrapper.removeClass('filled').attr('aria-hidden', 'true').find('.parsley-custom-error-message').remove();\n      } // Show, hide, update failing constraints messages\n\n\n      for (var i = 0; i < diff.removed.length; i++) {\n        this._removeError(diff.removed[i].assert.name);\n      }\n\n      for (i = 0; i < diff.added.length; i++) {\n        this._addError(diff.added[i].assert.name, {\n          message: diff.added[i].errorMessage,\n          assert: diff.added[i].assert\n        });\n      }\n\n      for (i = 0; i < diff.kept.length; i++) {\n        this._updateError(diff.kept[i].assert.name, {\n          message: diff.kept[i].errorMessage,\n          assert: diff.kept[i].assert\n        });\n      }\n    },\n    _addError: function _addError(name, _ref4) {\n      var message = _ref4.message,\n          assert = _ref4.assert;\n\n      this._insertErrorWrapper();\n\n      this._ui.$errorClassHandler.attr('aria-describedby', this._ui.errorsWrapperId);\n\n      this._ui.$errorsWrapper.addClass('filled').attr('aria-hidden', 'false').append($(this.options.errorTemplate).addClass('parsley-' + name).html(message || this._getErrorMessage(assert)));\n    },\n    _updateError: function _updateError(name, _ref5) {\n      var message = _ref5.message,\n          assert = _ref5.assert;\n\n      this._ui.$errorsWrapper.addClass('filled').find('.parsley-' + name).html(message || this._getErrorMessage(assert));\n    },\n    _removeError: function _removeError(name) {\n      this._ui.$errorClassHandler.removeAttr('aria-describedby');\n\n      this._ui.$errorsWrapper.removeClass('filled').attr('aria-hidden', 'true').find('.parsley-' + name).remove();\n    },\n    _getErrorMessage: function _getErrorMessage(constraint) {\n      var customConstraintErrorMessage = constraint.name + 'Message';\n      if ('undefined' !== typeof this.options[customConstraintErrorMessage]) return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n      return window.Parsley.getErrorMessage(constraint);\n    },\n    _buildUI: function _buildUI() {\n      // UI could be already built or disabled\n      if (this._ui || false === this.options.uiEnabled) return;\n      var _ui = {}; // Give field its Parsley id in DOM\n\n      this.element.setAttribute(this.options.namespace + 'id', this.__id__);\n      /** Generate important UI elements and store them in this **/\n      // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n\n      _ui.$errorClassHandler = this._manageClassHandler(); // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n\n      _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n      _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId); // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n\n      _ui.lastValidationResult = [];\n      _ui.validationInformationVisible = false; // Store it in this for later\n\n      this._ui = _ui;\n    },\n    // Determine which element will have `parsley-error` and `parsley-success` classes\n    _manageClassHandler: function _manageClassHandler() {\n      // Class handled could also be determined by function given in Parsley options\n      if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length) return $(this.options.classHandler); // Class handled could also be determined by function given in Parsley options\n\n      var $handlerFunction = this.options.classHandler; // It might also be the function name of a global function\n\n      if ('string' === typeof this.options.classHandler && 'function' === typeof window[this.options.classHandler]) $handlerFunction = window[this.options.classHandler];\n\n      if ('function' === typeof $handlerFunction) {\n        var $handler = $handlerFunction.call(this, this); // If this function returned a valid existing DOM element, go for it\n\n        if ('undefined' !== typeof $handler && $handler.length) return $handler;\n      } else if ('object' === _typeof($handlerFunction) && $handlerFunction instanceof jQuery && $handlerFunction.length) {\n        return $handlerFunction;\n      } else if ($handlerFunction) {\n        Utils.warn('The class handler `' + $handlerFunction + '` does not exist in DOM nor as a global JS function');\n      }\n\n      return this._inputHolder();\n    },\n    _inputHolder: function _inputHolder() {\n      // if simple element (input, texatrea, select...) it will perfectly host the classes and precede the error container\n      if (!this.options.multiple || this.element.nodeName === 'SELECT') return this.$element; // But if multiple element (radio, checkbox), that would be their parent\n\n      return this.$element.parent();\n    },\n    _insertErrorWrapper: function _insertErrorWrapper() {\n      var $errorsContainer = this.options.errorsContainer; // Nothing to do if already inserted\n\n      if (0 !== this._ui.$errorsWrapper.parent().length) return this._ui.$errorsWrapper.parent();\n\n      if ('string' === typeof $errorsContainer) {\n        if ($($errorsContainer).length) return $($errorsContainer).append(this._ui.$errorsWrapper);else if ('function' === typeof window[$errorsContainer]) $errorsContainer = window[$errorsContainer];else Utils.warn('The errors container `' + $errorsContainer + '` does not exist in DOM nor as a global JS function');\n      }\n\n      if ('function' === typeof $errorsContainer) $errorsContainer = $errorsContainer.call(this, this);\n      if ('object' === _typeof($errorsContainer) && $errorsContainer.length) return $errorsContainer.append(this._ui.$errorsWrapper);\n      return this._inputHolder().after(this._ui.$errorsWrapper);\n    },\n    _actualizeTriggers: function _actualizeTriggers() {\n      var _this2 = this;\n\n      var $toBind = this._findRelated();\n\n      var trigger; // Remove Parsley events already bound on this field\n\n      $toBind.off('.Parsley');\n      if (this._failedOnce) $toBind.on(Utils.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), function () {\n        _this2._validateIfNeeded();\n      });else if (trigger = Utils.namespaceEvents(this.options.trigger, 'Parsley')) {\n        $toBind.on(trigger, function (event) {\n          _this2._validateIfNeeded(event);\n        });\n      }\n    },\n    _validateIfNeeded: function _validateIfNeeded(event) {\n      var _this3 = this;\n\n      // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n      // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n      // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n      if (event && /key|input/.test(event.type)) if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold) return;\n\n      if (this.options.debounce) {\n        window.clearTimeout(this._debounced);\n        this._debounced = window.setTimeout(function () {\n          return _this3.validate();\n        }, this.options.debounce);\n      } else this.validate();\n    },\n    _resetUI: function _resetUI() {\n      // Reset all event listeners\n      this._failedOnce = false;\n\n      this._actualizeTriggers(); // Nothing to do if UI never initialized for this field\n\n\n      if ('undefined' === typeof this._ui) return; // Reset all errors' li\n\n      this._ui.$errorsWrapper.removeClass('filled').children().remove(); // Reset validation class\n\n\n      this._resetClass(); // Reset validation flags and last validation result\n\n\n      this._ui.lastValidationResult = [];\n      this._ui.validationInformationVisible = false;\n    },\n    _destroyUI: function _destroyUI() {\n      this._resetUI();\n\n      if ('undefined' !== typeof this._ui) this._ui.$errorsWrapper.remove();\n      delete this._ui;\n    },\n    _successClass: function _successClass() {\n      this._ui.validationInformationVisible = true;\n\n      this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n    },\n    _errorClass: function _errorClass() {\n      this._ui.validationInformationVisible = true;\n\n      this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n    },\n    _resetClass: function _resetClass() {\n      this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n    }\n  };\n\n  var Form = function Form(element, domOptions, options) {\n    this.__class__ = 'Form';\n    this.element = element;\n    this.$element = $(element);\n    this.domOptions = domOptions;\n    this.options = options;\n    this.parent = window.Parsley;\n    this.fields = [];\n    this.validationResult = null;\n  };\n\n  var statusMapping = {\n    pending: null,\n    resolved: true,\n    rejected: false\n  };\n  Form.prototype = {\n    onSubmitValidate: function onSubmitValidate(event) {\n      var _this = this;\n\n      // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n      if (true === event.parsley) return; // If we didn't come here through a submit button, use the first one in the form\n\n      var submitSource = this._submitSource || this.$element.find(Utils._SubmitSelector)[0];\n      this._submitSource = null;\n      this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true);\n      if (submitSource && null !== submitSource.getAttribute('formnovalidate')) return;\n      window.Parsley._remoteCache = {};\n      var promise = this.whenValidate({\n        event: event\n      });\n\n      if ('resolved' === promise.state() && false !== this._trigger('submit')) ; else {\n        // Rejected or pending: cancel this submit\n        event.stopImmediatePropagation();\n        event.preventDefault();\n        if ('pending' === promise.state()) promise.done(function () {\n          _this._submit(submitSource);\n        });\n      }\n    },\n    onSubmitButton: function onSubmitButton(event) {\n      this._submitSource = event.currentTarget;\n    },\n    // internal\n    // _submit submits the form, this time without going through the validations.\n    // Care must be taken to \"fake\" the actual submit button being clicked.\n    _submit: function _submit(submitSource) {\n      if (false === this._trigger('submit')) return; // Add submit button's data\n\n      if (submitSource) {\n        var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n        if (0 === $synthetic.length) $synthetic = $('<input class=\"parsley-synthetic-submit-button\" type=\"hidden\">').appendTo(this.$element);\n        $synthetic.attr({\n          name: submitSource.getAttribute('name'),\n          value: submitSource.getAttribute('value')\n        });\n      }\n\n      this.$element.trigger(_extends($.Event('submit'), {\n        parsley: true\n      }));\n    },\n    // Performs validation on fields while triggering events.\n    // @returns `true` if all validations succeeds, `false`\n    // if a failure is immediately detected, or `null`\n    // if dependant on a promise.\n    // Consider using `whenValidate` instead.\n    validate: function validate(options) {\n      if (arguments.length >= 1 && !$.isPlainObject(options)) {\n        Utils.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n\n        var _arguments = Array.prototype.slice.call(arguments),\n            group = _arguments[0],\n            force = _arguments[1],\n            event = _arguments[2];\n\n        options = {\n          group: group,\n          force: force,\n          event: event\n        };\n      }\n\n      return statusMapping[this.whenValidate(options).state()];\n    },\n    whenValidate: function whenValidate() {\n      var _this2 = this,\n          _Utils$all$done$fail$;\n\n      var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          group = _ref.group,\n          force = _ref.force,\n          event = _ref.event;\n\n      this.submitEvent = event;\n\n      if (event) {\n        this.submitEvent = _extends({}, event, {\n          preventDefault: function preventDefault() {\n            Utils.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n            _this2.validationResult = false;\n          }\n        });\n      }\n\n      this.validationResult = true; // fire validate event to eventually modify things before every validation\n\n      this._trigger('validate'); // Refresh form DOM options and form's fields that could have changed\n\n\n      this._refreshFields();\n\n      var promises = this._withoutReactualizingFormOptions(function () {\n        return $.map(_this2.fields, function (field) {\n          return field.whenValidate({\n            force: force,\n            group: group\n          });\n        });\n      });\n\n      return (_Utils$all$done$fail$ = Utils.all(promises).done(function () {\n        _this2._trigger('success');\n      }).fail(function () {\n        _this2.validationResult = false;\n\n        _this2.focus();\n\n        _this2._trigger('error');\n      }).always(function () {\n        _this2._trigger('validated');\n      })).pipe.apply(_Utils$all$done$fail$, _toConsumableArray(this._pipeAccordingToValidationResult()));\n    },\n    // Iterate over refreshed fields, and stop on first failure.\n    // Returns `true` if all fields are valid, `false` if a failure is detected\n    // or `null` if the result depends on an unresolved promise.\n    // Prefer using `whenValid` instead.\n    isValid: function isValid(options) {\n      if (arguments.length >= 1 && !$.isPlainObject(options)) {\n        Utils.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n\n        var _arguments2 = Array.prototype.slice.call(arguments),\n            group = _arguments2[0],\n            force = _arguments2[1];\n\n        options = {\n          group: group,\n          force: force\n        };\n      }\n\n      return statusMapping[this.whenValid(options).state()];\n    },\n    // Iterate over refreshed fields and validate them.\n    // Returns a promise.\n    // A validation that immediately fails will interrupt the validations.\n    whenValid: function whenValid() {\n      var _this3 = this;\n\n      var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          group = _ref2.group,\n          force = _ref2.force;\n\n      this._refreshFields();\n\n      var promises = this._withoutReactualizingFormOptions(function () {\n        return $.map(_this3.fields, function (field) {\n          return field.whenValid({\n            group: group,\n            force: force\n          });\n        });\n      });\n\n      return Utils.all(promises);\n    },\n    refresh: function refresh() {\n      this._refreshFields();\n\n      return this;\n    },\n    // Reset UI\n    reset: function reset() {\n      // Form case: emit a reset event for each field\n      for (var i = 0; i < this.fields.length; i++) {\n        this.fields[i].reset();\n      }\n\n      this._trigger('reset');\n    },\n    // Destroy Parsley instance (+ UI)\n    destroy: function destroy() {\n      // Field case: emit destroy event to clean UI and then destroy stored instance\n      this._destroyUI(); // Form case: destroy all its fields and then destroy stored instance\n\n\n      for (var i = 0; i < this.fields.length; i++) {\n        this.fields[i].destroy();\n      }\n\n      this.$element.removeData('Parsley');\n\n      this._trigger('destroy');\n    },\n    _refreshFields: function _refreshFields() {\n      return this.actualizeOptions()._bindFields();\n    },\n    _bindFields: function _bindFields() {\n      var _this4 = this;\n\n      var oldFields = this.fields;\n      this.fields = [];\n      this.fieldsMappedById = {};\n\n      this._withoutReactualizingFormOptions(function () {\n        _this4.$element.find(_this4.options.inputs).not(_this4.options.excluded).not(\"[\".concat(_this4.options.namespace, \"excluded=true]\")).each(function (_, element) {\n          var fieldInstance = new window.Parsley.Factory(element, {}, _this4); // Only add valid and not excluded `Field` and `FieldMultiple` children\n\n          if ('Field' === fieldInstance.__class__ || 'FieldMultiple' === fieldInstance.__class__) {\n            var uniqueId = fieldInstance.__class__ + '-' + fieldInstance.__id__;\n\n            if ('undefined' === typeof _this4.fieldsMappedById[uniqueId]) {\n              _this4.fieldsMappedById[uniqueId] = fieldInstance;\n\n              _this4.fields.push(fieldInstance);\n            }\n          }\n        });\n\n        $.each(Utils.difference(oldFields, _this4.fields), function (_, field) {\n          field.reset();\n        });\n      });\n\n      return this;\n    },\n    // Internal only.\n    // Looping on a form's fields to do validation or similar\n    // will trigger reactualizing options on all of them, which\n    // in turn will reactualize the form's options.\n    // To avoid calling actualizeOptions so many times on the form\n    // for nothing, _withoutReactualizingFormOptions temporarily disables\n    // the method actualizeOptions on this form while `fn` is called.\n    _withoutReactualizingFormOptions: function _withoutReactualizingFormOptions(fn) {\n      var oldActualizeOptions = this.actualizeOptions;\n\n      this.actualizeOptions = function () {\n        return this;\n      };\n\n      var result = fn();\n      this.actualizeOptions = oldActualizeOptions;\n      return result;\n    },\n    // Internal only.\n    // Shortcut to trigger an event\n    // Returns true iff event is not interrupted and default not prevented.\n    _trigger: function _trigger(eventName) {\n      return this.trigger('form:' + eventName);\n    }\n  };\n\n  var Constraint = function Constraint(parsleyField, name, requirements, priority, isDomConstraint) {\n    var validatorSpec = window.Parsley._validatorRegistry.validators[name];\n    var validator = new Validator(validatorSpec);\n    priority = priority || parsleyField.options[name + 'Priority'] || validator.priority;\n    isDomConstraint = true === isDomConstraint;\n\n    _extends(this, {\n      validator: validator,\n      name: name,\n      requirements: requirements,\n      priority: priority,\n      isDomConstraint: isDomConstraint\n    });\n\n    this._parseRequirements(parsleyField.options);\n  };\n\n  var capitalize = function capitalize(str) {\n    var cap = str[0].toUpperCase();\n    return cap + str.slice(1);\n  };\n\n  Constraint.prototype = {\n    validate: function validate(value, instance) {\n      var _this$validator;\n\n      return (_this$validator = this.validator).validate.apply(_this$validator, [value].concat(_toConsumableArray(this.requirementList), [instance]));\n    },\n    _parseRequirements: function _parseRequirements(options) {\n      var _this = this;\n\n      this.requirementList = this.validator.parseRequirements(this.requirements, function (key) {\n        return options[_this.name + capitalize(key)];\n      });\n    }\n  };\n\n  var Field = function Field(field, domOptions, options, parsleyFormInstance) {\n    this.__class__ = 'Field';\n    this.element = field;\n    this.$element = $(field); // Set parent if we have one\n\n    if ('undefined' !== typeof parsleyFormInstance) {\n      this.parent = parsleyFormInstance;\n    }\n\n    this.options = options;\n    this.domOptions = domOptions; // Initialize some properties\n\n    this.constraints = [];\n    this.constraintsByName = {};\n    this.validationResult = true; // Bind constraints\n\n    this._bindConstraints();\n  };\n\n  var statusMapping$1 = {\n    pending: null,\n    resolved: true,\n    rejected: false\n  };\n  Field.prototype = {\n    // # Public API\n    // Validate field and trigger some events for mainly `UI`\n    // @returns `true`, an array of the validators that failed, or\n    // `null` if validation is not finished. Prefer using whenValidate\n    validate: function validate(options) {\n      if (arguments.length >= 1 && !$.isPlainObject(options)) {\n        Utils.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n        options = {\n          options: options\n        };\n      }\n\n      var promise = this.whenValidate(options);\n      if (!promise) // If excluded with `group` option\n        return true;\n\n      switch (promise.state()) {\n        case 'pending':\n          return null;\n\n        case 'resolved':\n          return true;\n\n        case 'rejected':\n          return this.validationResult;\n      }\n    },\n    // Validate field and trigger some events for mainly `UI`\n    // @returns a promise that succeeds only when all validations do\n    // or `undefined` if field is not in the given `group`.\n    whenValidate: function whenValidate() {\n      var _this$whenValid$alway,\n          _this = this;\n\n      var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          force = _ref.force,\n          group = _ref.group;\n\n      // do not validate a field if not the same as given validation group\n      this.refresh();\n      if (group && !this._isInGroup(group)) return;\n      this.value = this.getValue(); // Field Validate event. `this.value` could be altered for custom needs\n\n      this._trigger('validate');\n\n      return (_this$whenValid$alway = this.whenValid({\n        force: force,\n        value: this.value,\n        _refreshed: true\n      }).always(function () {\n        _this._reflowUI();\n      }).done(function () {\n        _this._trigger('success');\n      }).fail(function () {\n        _this._trigger('error');\n      }).always(function () {\n        _this._trigger('validated');\n      })).pipe.apply(_this$whenValid$alway, _toConsumableArray(this._pipeAccordingToValidationResult()));\n    },\n    hasConstraints: function hasConstraints() {\n      return 0 !== this.constraints.length;\n    },\n    // An empty optional field does not need validation\n    needsValidation: function needsValidation(value) {\n      if ('undefined' === typeof value) value = this.getValue(); // If a field is empty and not required, it is valid\n      // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n\n      if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty) return false;\n      return true;\n    },\n    _isInGroup: function _isInGroup(group) {\n      if (Array.isArray(this.options.group)) return -1 !== $.inArray(group, this.options.group);\n      return this.options.group === group;\n    },\n    // Just validate field. Do not trigger any event.\n    // Returns `true` iff all constraints pass, `false` if there are failures,\n    // or `null` if the result can not be determined yet (depends on a promise)\n    // See also `whenValid`.\n    isValid: function isValid(options) {\n      if (arguments.length >= 1 && !$.isPlainObject(options)) {\n        Utils.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n\n        var _arguments = Array.prototype.slice.call(arguments),\n            force = _arguments[0],\n            value = _arguments[1];\n\n        options = {\n          force: force,\n          value: value\n        };\n      }\n\n      var promise = this.whenValid(options);\n      if (!promise) // Excluded via `group`\n        return true;\n      return statusMapping$1[promise.state()];\n    },\n    // Just validate field. Do not trigger any event.\n    // @returns a promise that succeeds only when all validations do\n    // or `undefined` if the field is not in the given `group`.\n    // The argument `force` will force validation of empty fields.\n    // If a `value` is given, it will be validated instead of the value of the input.\n    whenValid: function whenValid() {\n      var _this2 = this;\n\n      var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          _ref2$force = _ref2.force,\n          force = _ref2$force === void 0 ? false : _ref2$force,\n          value = _ref2.value,\n          group = _ref2.group,\n          _refreshed = _ref2._refreshed;\n\n      // Recompute options and rebind constraints to have latest changes\n      if (!_refreshed) this.refresh(); // do not validate a field if not the same as given validation group\n\n      if (group && !this._isInGroup(group)) return;\n      this.validationResult = true; // A field without constraint is valid\n\n      if (!this.hasConstraints()) return $.when(); // Value could be passed as argument, needed to add more power to 'field:validate'\n\n      if ('undefined' === typeof value || null === value) value = this.getValue();\n      if (!this.needsValidation(value) && true !== force) return $.when();\n\n      var groupedConstraints = this._getGroupedConstraints();\n\n      var promises = [];\n      $.each(groupedConstraints, function (_, constraints) {\n        // Process one group of constraints at a time, we validate the constraints\n        // and combine the promises together.\n        var promise = Utils.all($.map(constraints, function (constraint) {\n          return _this2._validateConstraint(value, constraint);\n        }));\n        promises.push(promise);\n        if (promise.state() === 'rejected') return false; // Interrupt processing if a group has already failed\n      });\n      return Utils.all(promises);\n    },\n    // @returns a promise\n    _validateConstraint: function _validateConstraint(value, constraint) {\n      var _this3 = this;\n\n      var result = constraint.validate(value, this); // Map false to a failed promise\n\n      if (false === result) result = $.Deferred().reject(); // Make sure we return a promise and that we record failures\n\n      return Utils.all([result]).fail(function (errorMessage) {\n        if (!(_this3.validationResult instanceof Array)) _this3.validationResult = [];\n\n        _this3.validationResult.push({\n          assert: constraint,\n          errorMessage: 'string' === typeof errorMessage && errorMessage\n        });\n      });\n    },\n    // @returns Parsley field computed value that could be overrided or configured in DOM\n    getValue: function getValue() {\n      var value; // Value could be overriden in DOM or with explicit options\n\n      if ('function' === typeof this.options.value) value = this.options.value(this);else if ('undefined' !== typeof this.options.value) value = this.options.value;else value = this.$element.val(); // Handle wrong DOM or configurations\n\n      if ('undefined' === typeof value || null === value) return '';\n      return this._handleWhitespace(value);\n    },\n    // Reset UI\n    reset: function reset() {\n      this._resetUI();\n\n      return this._trigger('reset');\n    },\n    // Destroy Parsley instance (+ UI)\n    destroy: function destroy() {\n      // Field case: emit destroy event to clean UI and then destroy stored instance\n      this._destroyUI();\n\n      this.$element.removeData('Parsley');\n      this.$element.removeData('FieldMultiple');\n\n      this._trigger('destroy');\n    },\n    // Actualize options and rebind constraints\n    refresh: function refresh() {\n      this._refreshConstraints();\n\n      return this;\n    },\n    _refreshConstraints: function _refreshConstraints() {\n      return this.actualizeOptions()._bindConstraints();\n    },\n    refreshConstraints: function refreshConstraints() {\n      Utils.warnOnce(\"Parsley's refreshConstraints is deprecated. Please use refresh\");\n      return this.refresh();\n    },\n\n    /**\n    * Add a new constraint to a field\n    *\n    * @param {String}   name\n    * @param {Mixed}    requirements      optional\n    * @param {Number}   priority          optional\n    * @param {Boolean}  isDomConstraint   optional\n    */\n    addConstraint: function addConstraint(name, requirements, priority, isDomConstraint) {\n      if (window.Parsley._validatorRegistry.validators[name]) {\n        var constraint = new Constraint(this, name, requirements, priority, isDomConstraint); // if constraint already exist, delete it and push new version\n\n        if ('undefined' !== this.constraintsByName[constraint.name]) this.removeConstraint(constraint.name);\n        this.constraints.push(constraint);\n        this.constraintsByName[constraint.name] = constraint;\n      }\n\n      return this;\n    },\n    // Remove a constraint\n    removeConstraint: function removeConstraint(name) {\n      for (var i = 0; i < this.constraints.length; i++) {\n        if (name === this.constraints[i].name) {\n          this.constraints.splice(i, 1);\n          break;\n        }\n      }\n\n      delete this.constraintsByName[name];\n      return this;\n    },\n    // Update a constraint (Remove + re-add)\n    updateConstraint: function updateConstraint(name, parameters, priority) {\n      return this.removeConstraint(name).addConstraint(name, parameters, priority);\n    },\n    // # Internals\n    // Internal only.\n    // Bind constraints from config + options + DOM\n    _bindConstraints: function _bindConstraints() {\n      var constraints = [];\n      var constraintsByName = {}; // clean all existing DOM constraints to only keep javascript user constraints\n\n      for (var i = 0; i < this.constraints.length; i++) {\n        if (false === this.constraints[i].isDomConstraint) {\n          constraints.push(this.constraints[i]);\n          constraintsByName[this.constraints[i].name] = this.constraints[i];\n        }\n      }\n\n      this.constraints = constraints;\n      this.constraintsByName = constraintsByName; // then re-add Parsley DOM-API constraints\n\n      for (var name in this.options) {\n        this.addConstraint(name, this.options[name], undefined, true);\n      } // finally, bind special HTML5 constraints\n\n\n      return this._bindHtml5Constraints();\n    },\n    // Internal only.\n    // Bind specific HTML5 constraints to be HTML5 compliant\n    _bindHtml5Constraints: function _bindHtml5Constraints() {\n      // html5 required\n      if (null !== this.element.getAttribute('required')) this.addConstraint('required', true, undefined, true); // html5 pattern\n\n      if (null !== this.element.getAttribute('pattern')) this.addConstraint('pattern', this.element.getAttribute('pattern'), undefined, true); // range\n\n      var min = this.element.getAttribute('min');\n      var max = this.element.getAttribute('max');\n      if (null !== min && null !== max) this.addConstraint('range', [min, max], undefined, true); // HTML5 min\n      else if (null !== min) this.addConstraint('min', min, undefined, true); // HTML5 max\n        else if (null !== max) this.addConstraint('max', max, undefined, true); // length\n\n      if (null !== this.element.getAttribute('minlength') && null !== this.element.getAttribute('maxlength')) this.addConstraint('length', [this.element.getAttribute('minlength'), this.element.getAttribute('maxlength')], undefined, true); // HTML5 minlength\n      else if (null !== this.element.getAttribute('minlength')) this.addConstraint('minlength', this.element.getAttribute('minlength'), undefined, true); // HTML5 maxlength\n        else if (null !== this.element.getAttribute('maxlength')) this.addConstraint('maxlength', this.element.getAttribute('maxlength'), undefined, true); // html5 types\n\n      var type = Utils.getType(this.element); // Small special case here for HTML5 number: integer validator if step attribute is undefined or an integer value, number otherwise\n\n      if ('number' === type) {\n        return this.addConstraint('type', ['number', {\n          step: this.element.getAttribute('step') || '1',\n          base: min || this.element.getAttribute('value')\n        }], undefined, true); // Regular other HTML5 supported types\n      } else if (/^(email|url|range|date)$/i.test(type)) {\n        return this.addConstraint('type', type, undefined, true);\n      }\n\n      return this;\n    },\n    // Internal only.\n    // Field is required if have required constraint without `false` value\n    _isRequired: function _isRequired() {\n      if ('undefined' === typeof this.constraintsByName.required) return false;\n      return false !== this.constraintsByName.required.requirements;\n    },\n    // Internal only.\n    // Shortcut to trigger an event\n    _trigger: function _trigger(eventName) {\n      return this.trigger('field:' + eventName);\n    },\n    // Internal only\n    // Handles whitespace in a value\n    // Use `data-parsley-whitespace=\"squish\"` to auto squish input value\n    // Use `data-parsley-whitespace=\"trim\"` to auto trim input value\n    _handleWhitespace: function _handleWhitespace(value) {\n      if (true === this.options.trimValue) Utils.warnOnce('data-parsley-trim-value=\"true\" is deprecated, please use data-parsley-whitespace=\"trim\"');\n      if ('squish' === this.options.whitespace) value = value.replace(/\\s{2,}/g, ' ');\n      if ('trim' === this.options.whitespace || 'squish' === this.options.whitespace || true === this.options.trimValue) value = Utils.trimString(value);\n      return value;\n    },\n    _isDateInput: function _isDateInput() {\n      var c = this.constraintsByName.type;\n      return c && c.requirements === 'date';\n    },\n    // Internal only.\n    // Returns the constraints, grouped by descending priority.\n    // The result is thus an array of arrays of constraints.\n    _getGroupedConstraints: function _getGroupedConstraints() {\n      if (false === this.options.priorityEnabled) return [this.constraints];\n      var groupedConstraints = [];\n      var index = {}; // Create array unique of priorities\n\n      for (var i = 0; i < this.constraints.length; i++) {\n        var p = this.constraints[i].priority;\n        if (!index[p]) groupedConstraints.push(index[p] = []);\n        index[p].push(this.constraints[i]);\n      } // Sort them by priority DESC\n\n\n      groupedConstraints.sort(function (a, b) {\n        return b[0].priority - a[0].priority;\n      });\n      return groupedConstraints;\n    }\n  };\n\n  var Multiple = function Multiple() {\n    this.__class__ = 'FieldMultiple';\n  };\n\n  Multiple.prototype = {\n    // Add new `$element` sibling for multiple field\n    addElement: function addElement($element) {\n      this.$elements.push($element);\n      return this;\n    },\n    // See `Field._refreshConstraints()`\n    _refreshConstraints: function _refreshConstraints() {\n      var fieldConstraints;\n      this.constraints = []; // Select multiple special treatment\n\n      if (this.element.nodeName === 'SELECT') {\n        this.actualizeOptions()._bindConstraints();\n\n        return this;\n      } // Gather all constraints for each input in the multiple group\n\n\n      for (var i = 0; i < this.$elements.length; i++) {\n        // Check if element have not been dynamically removed since last binding\n        if (!$('html').has(this.$elements[i]).length) {\n          this.$elements.splice(i, 1);\n          continue;\n        }\n\n        fieldConstraints = this.$elements[i].data('FieldMultiple')._refreshConstraints().constraints;\n\n        for (var j = 0; j < fieldConstraints.length; j++) {\n          this.addConstraint(fieldConstraints[j].name, fieldConstraints[j].requirements, fieldConstraints[j].priority, fieldConstraints[j].isDomConstraint);\n        }\n      }\n\n      return this;\n    },\n    // See `Field.getValue()`\n    getValue: function getValue() {\n      // Value could be overriden in DOM\n      if ('function' === typeof this.options.value) return this.options.value(this);else if ('undefined' !== typeof this.options.value) return this.options.value; // Radio input case\n\n      if (this.element.nodeName === 'INPUT') {\n        var type = Utils.getType(this.element);\n        if (type === 'radio') return this._findRelated().filter(':checked').val() || ''; // checkbox input case\n\n        if (type === 'checkbox') {\n          var values = [];\n\n          this._findRelated().filter(':checked').each(function () {\n            values.push($(this).val());\n          });\n\n          return values;\n        }\n      } // Select multiple case\n\n\n      if (this.element.nodeName === 'SELECT' && null === this.$element.val()) return []; // Default case that should never happen\n\n      return this.$element.val();\n    },\n    _init: function _init() {\n      this.$elements = [this.$element];\n      return this;\n    }\n  };\n\n  var Factory = function Factory(element, options, parsleyFormInstance) {\n    this.element = element;\n    this.$element = $(element); // If the element has already been bound, returns its saved Parsley instance\n\n    var savedparsleyFormInstance = this.$element.data('Parsley');\n\n    if (savedparsleyFormInstance) {\n      // If the saved instance has been bound without a Form parent and there is one given in this call, add it\n      if ('undefined' !== typeof parsleyFormInstance && savedparsleyFormInstance.parent === window.Parsley) {\n        savedparsleyFormInstance.parent = parsleyFormInstance;\n\n        savedparsleyFormInstance._resetOptions(savedparsleyFormInstance.options);\n      }\n\n      if ('object' === _typeof(options)) {\n        _extends(savedparsleyFormInstance.options, options);\n      }\n\n      return savedparsleyFormInstance;\n    } // Parsley must be instantiated with a DOM element or jQuery $element\n\n\n    if (!this.$element.length) throw new Error('You must bind Parsley on an existing element.');\n    if ('undefined' !== typeof parsleyFormInstance && 'Form' !== parsleyFormInstance.__class__) throw new Error('Parent instance must be a Form instance');\n    this.parent = parsleyFormInstance || window.Parsley;\n    return this.init(options);\n  };\n\n  Factory.prototype = {\n    init: function init(options) {\n      this.__class__ = 'Parsley';\n      this.__version__ = '2.9.2';\n      this.__id__ = Utils.generateID(); // Pre-compute options\n\n      this._resetOptions(options); // A Form instance is obviously a `<form>` element but also every node that is not an input and has the `data-parsley-validate` attribute\n\n\n      if (this.element.nodeName === 'FORM' || Utils.checkAttr(this.element, this.options.namespace, 'validate') && !this.$element.is(this.options.inputs)) return this.bind('parsleyForm'); // Every other element is bound as a `Field` or `FieldMultiple`\n\n      return this.isMultiple() ? this.handleMultiple() : this.bind('parsleyField');\n    },\n    isMultiple: function isMultiple() {\n      var type = Utils.getType(this.element);\n      return type === 'radio' || type === 'checkbox' || this.element.nodeName === 'SELECT' && null !== this.element.getAttribute('multiple');\n    },\n    // Multiples fields are a real nightmare :(\n    // Maybe some refactoring would be appreciated here...\n    handleMultiple: function handleMultiple() {\n      var _this = this;\n\n      var name;\n      var parsleyMultipleInstance; // Handle multiple name\n\n      this.options.multiple = this.options.multiple || (name = this.element.getAttribute('name')) || this.element.getAttribute('id'); // Special select multiple input\n\n      if (this.element.nodeName === 'SELECT' && null !== this.element.getAttribute('multiple')) {\n        this.options.multiple = this.options.multiple || this.__id__;\n        return this.bind('parsleyFieldMultiple'); // Else for radio / checkboxes, we need a `name` or `data-parsley-multiple` to properly bind it\n      } else if (!this.options.multiple) {\n        Utils.warn('To be bound by Parsley, a radio, a checkbox and a multiple select input must have either a name or a multiple option.', this.$element);\n        return this;\n      } // Remove special chars\n\n\n      this.options.multiple = this.options.multiple.replace(/(:|\\.|\\[|\\]|\\{|\\}|\\$)/g, ''); // Add proper `data-parsley-multiple` to siblings if we have a valid multiple name\n\n      if (name) {\n        $('input[name=\"' + name + '\"]').each(function (i, input) {\n          var type = Utils.getType(input);\n          if (type === 'radio' || type === 'checkbox') input.setAttribute(_this.options.namespace + 'multiple', _this.options.multiple);\n        });\n      } // Check here if we don't already have a related multiple instance saved\n\n\n      var $previouslyRelated = this._findRelated();\n\n      for (var i = 0; i < $previouslyRelated.length; i++) {\n        parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley');\n\n        if ('undefined' !== typeof parsleyMultipleInstance) {\n          if (!this.$element.data('FieldMultiple')) {\n            parsleyMultipleInstance.addElement(this.$element);\n          }\n\n          break;\n        }\n      } // Create a secret Field instance for every multiple field. It will be stored in `data('FieldMultiple')`\n      // And will be useful later to access classic `Field` stuff while being in a `FieldMultiple` instance\n\n\n      this.bind('parsleyField', true);\n      return parsleyMultipleInstance || this.bind('parsleyFieldMultiple');\n    },\n    // Return proper `Form`, `Field` or `FieldMultiple`\n    bind: function bind(type, doNotStore) {\n      var parsleyInstance;\n\n      switch (type) {\n        case 'parsleyForm':\n          parsleyInstance = $.extend(new Form(this.element, this.domOptions, this.options), new Base(), window.ParsleyExtend)._bindFields();\n          break;\n\n        case 'parsleyField':\n          parsleyInstance = $.extend(new Field(this.element, this.domOptions, this.options, this.parent), new Base(), window.ParsleyExtend);\n          break;\n\n        case 'parsleyFieldMultiple':\n          parsleyInstance = $.extend(new Field(this.element, this.domOptions, this.options, this.parent), new Multiple(), new Base(), window.ParsleyExtend)._init();\n          break;\n\n        default:\n          throw new Error(type + 'is not a supported Parsley type');\n      }\n\n      if (this.options.multiple) Utils.setAttr(this.element, this.options.namespace, 'multiple', this.options.multiple);\n\n      if ('undefined' !== typeof doNotStore) {\n        this.$element.data('FieldMultiple', parsleyInstance);\n        return parsleyInstance;\n      } // Store the freshly bound instance in a DOM element for later access using jQuery `data()`\n\n\n      this.$element.data('Parsley', parsleyInstance); // Tell the world we have a new Form or Field instance!\n\n      parsleyInstance._actualizeTriggers();\n\n      parsleyInstance._trigger('init');\n\n      return parsleyInstance;\n    }\n  };\n\n  var vernums = $.fn.jquery.split('.');\n\n  if (parseInt(vernums[0]) <= 1 && parseInt(vernums[1]) < 8) {\n    throw \"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.\";\n  }\n\n  if (!vernums.forEach) {\n    Utils.warn('Parsley requires ES5 to run properly. Please include https://github.com/es-shims/es5-shim');\n  } // Inherit `on`, `off` & `trigger` to Parsley:\n\n\n  var Parsley = _extends(new Base(), {\n    element: document,\n    $element: $(document),\n    actualizeOptions: null,\n    _resetOptions: null,\n    Factory: Factory,\n    version: '2.9.2'\n  }); // Supplement Field and Form with Base\n  // This way, the constructors will have access to those methods\n\n\n  _extends(Field.prototype, UI.Field, Base.prototype);\n\n  _extends(Form.prototype, UI.Form, Base.prototype); // Inherit actualizeOptions and _resetOptions:\n\n\n  _extends(Factory.prototype, Base.prototype); // ### jQuery API\n  // `$('.elem').parsley(options)` or `$('.elem').psly(options)`\n\n\n  $.fn.parsley = $.fn.psly = function (options) {\n    if (this.length > 1) {\n      var instances = [];\n      this.each(function () {\n        instances.push($(this).parsley(options));\n      });\n      return instances;\n    } // Return undefined if applied to non existing DOM element\n\n\n    if (this.length == 0) {\n      return;\n    }\n\n    return new Factory(this[0], options);\n  }; // ### Field and Form extension\n  // Ensure the extension is now defined if it wasn't previously\n\n\n  if ('undefined' === typeof window.ParsleyExtend) window.ParsleyExtend = {}; // ### Parsley config\n  // Inherit from ParsleyDefault, and copy over any existing values\n\n  Parsley.options = _extends(Utils.objectCreate(Defaults), window.ParsleyConfig);\n  window.ParsleyConfig = Parsley.options; // Old way of accessing global options\n  // ### Globals\n\n  window.Parsley = window.psly = Parsley;\n  Parsley.Utils = Utils;\n  window.ParsleyUtils = {};\n  $.each(Utils, function (key, value) {\n    if ('function' === typeof value) {\n      window.ParsleyUtils[key] = function () {\n        Utils.warnOnce('Accessing `window.ParsleyUtils` is deprecated. Use `window.Parsley.Utils` instead.');\n        return Utils[key].apply(Utils, arguments);\n      };\n    }\n  }); // ### Define methods that forward to the registry, and deprecate all access except through window.Parsley\n\n  var registry = window.Parsley._validatorRegistry = new ValidatorRegistry(window.ParsleyConfig.validators, window.ParsleyConfig.i18n);\n  window.ParsleyValidator = {};\n  $.each('setLocale addCatalog addMessage addMessages getErrorMessage formatMessage addValidator updateValidator removeValidator hasValidator'.split(' '), function (i, method) {\n    window.Parsley[method] = function () {\n      return registry[method].apply(registry, arguments);\n    };\n\n    window.ParsleyValidator[method] = function () {\n      var _window$Parsley;\n\n      Utils.warnOnce(\"Accessing the method '\".concat(method, \"' through Validator is deprecated. Simply call 'window.Parsley.\").concat(method, \"(...)'\"));\n      return (_window$Parsley = window.Parsley)[method].apply(_window$Parsley, arguments);\n    };\n  }); // ### UI\n  // Deprecated global object\n\n  window.Parsley.UI = UI;\n  window.ParsleyUI = {\n    removeError: function removeError(instance, name, doNotUpdateClass) {\n      var updateClass = true !== doNotUpdateClass;\n      Utils.warnOnce(\"Accessing UI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method.\");\n      return instance.removeError(name, {\n        updateClass: updateClass\n      });\n    },\n    getErrorsMessages: function getErrorsMessages(instance) {\n      Utils.warnOnce(\"Accessing UI is deprecated. Call 'getErrorsMessages' on the instance directly.\");\n      return instance.getErrorsMessages();\n    }\n  };\n  $.each('addError updateError'.split(' '), function (i, method) {\n    window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n      var updateClass = true !== doNotUpdateClass;\n      Utils.warnOnce(\"Accessing UI is deprecated. Call '\".concat(method, \"' on the instance directly. Please comment in issue 1073 as to your need to call this method.\"));\n      return instance[method](name, {\n        message: message,\n        assert: assert,\n        updateClass: updateClass\n      });\n    };\n  }); // ### PARSLEY auto-binding\n  // Prevent it by setting `ParsleyConfig.autoBind` to `false`\n\n  if (false !== window.ParsleyConfig.autoBind) {\n    $(function () {\n      // Works only on `data-parsley-validate`.\n      if ($('[data-parsley-validate]').length) $('[data-parsley-validate]').parsley();\n    });\n  }\n\n  var o = $({});\n\n  var deprecated = function deprecated() {\n    Utils.warnOnce(\"Parsley's pubsub module is deprecated; use the 'on' and 'off' methods on parsley instances or window.Parsley\");\n  }; // Returns an event handler that calls `fn` with the arguments it expects\n\n\n  function adapt(fn, context) {\n    // Store to allow unbinding\n    if (!fn.parsleyAdaptedCallback) {\n      fn.parsleyAdaptedCallback = function () {\n        var args = Array.prototype.slice.call(arguments, 0);\n        args.unshift(this);\n        fn.apply(context || o, args);\n      };\n    }\n\n    return fn.parsleyAdaptedCallback;\n  }\n\n  var eventPrefix = 'parsley:'; // Converts 'parsley:form:validate' into 'form:validate'\n\n  function eventName(name) {\n    if (name.lastIndexOf(eventPrefix, 0) === 0) return name.substr(eventPrefix.length);\n    return name;\n  } // $.listen is deprecated. Use Parsley.on instead.\n\n\n  $.listen = function (name, callback) {\n    var context;\n    deprecated();\n\n    if ('object' === _typeof(arguments[1]) && 'function' === typeof arguments[2]) {\n      context = arguments[1];\n      callback = arguments[2];\n    }\n\n    if ('function' !== typeof callback) throw new Error('Wrong parameters');\n    window.Parsley.on(eventName(name), adapt(callback, context));\n  };\n\n  $.listenTo = function (instance, name, fn) {\n    deprecated();\n    if (!(instance instanceof Field) && !(instance instanceof Form)) throw new Error('Must give Parsley instance');\n    if ('string' !== typeof name || 'function' !== typeof fn) throw new Error('Wrong parameters');\n    instance.on(eventName(name), adapt(fn));\n  };\n\n  $.unsubscribe = function (name, fn) {\n    deprecated();\n    if ('string' !== typeof name || 'function' !== typeof fn) throw new Error('Wrong arguments');\n    window.Parsley.off(eventName(name), fn.parsleyAdaptedCallback);\n  };\n\n  $.unsubscribeTo = function (instance, name) {\n    deprecated();\n    if (!(instance instanceof Field) && !(instance instanceof Form)) throw new Error('Must give Parsley instance');\n    instance.off(eventName(name));\n  };\n\n  $.unsubscribeAll = function (name) {\n    deprecated();\n    window.Parsley.off(eventName(name));\n    $('form,input,textarea,select').each(function () {\n      var instance = $(this).data('Parsley');\n\n      if (instance) {\n        instance.off(eventName(name));\n      }\n    });\n  }; // $.emit is deprecated. Use jQuery events instead.\n\n\n  $.emit = function (name, instance) {\n    var _instance;\n\n    deprecated();\n    var instanceGiven = instance instanceof Field || instance instanceof Form;\n    var args = Array.prototype.slice.call(arguments, instanceGiven ? 2 : 1);\n    args.unshift(eventName(name));\n\n    if (!instanceGiven) {\n      instance = window.Parsley;\n    }\n\n    (_instance = instance).trigger.apply(_instance, _toConsumableArray(args));\n  };\n\n  $.extend(true, Parsley, {\n    asyncValidators: {\n      'default': {\n        fn: function fn(xhr) {\n          // By default, only status 2xx are deemed successful.\n          // Note: we use status instead of state() because responses with status 200\n          // but invalid messages (e.g. an empty body for content type set to JSON) will\n          // result in state() === 'rejected'.\n          return xhr.status >= 200 && xhr.status < 300;\n        },\n        url: false\n      },\n      reverse: {\n        fn: function fn(xhr) {\n          // If reverse option is set, a failing ajax request is considered successful\n          return xhr.status < 200 || xhr.status >= 300;\n        },\n        url: false\n      }\n    },\n    addAsyncValidator: function addAsyncValidator(name, fn, url, options) {\n      Parsley.asyncValidators[name] = {\n        fn: fn,\n        url: url || false,\n        options: options || {}\n      };\n      return this;\n    }\n  });\n  Parsley.addValidator('remote', {\n    requirementType: {\n      '': 'string',\n      'validator': 'string',\n      'reverse': 'boolean',\n      'options': 'object'\n    },\n    validateString: function validateString(value, url, options, instance) {\n      var data = {};\n      var ajaxOptions;\n      var csr;\n      var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n      if ('undefined' === typeof Parsley.asyncValidators[validator]) throw new Error('Calling an undefined async validator: `' + validator + '`');\n      url = Parsley.asyncValidators[validator].url || url; // Fill current value\n\n      if (url.indexOf('{value}') > -1) {\n        url = url.replace('{value}', encodeURIComponent(value));\n      } else {\n        data[instance.element.getAttribute('name') || instance.element.getAttribute('id')] = value;\n      } // Merge options passed in from the function with the ones in the attribute\n\n\n      var remoteOptions = $.extend(true, options.options || {}, Parsley.asyncValidators[validator].options); // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n\n      ajaxOptions = $.extend(true, {}, {\n        url: url,\n        data: data,\n        type: 'GET'\n      }, remoteOptions); // Generate store key based on ajax options\n\n      instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n      csr = $.param(ajaxOptions); // Initialise query cache\n\n      if ('undefined' === typeof Parsley._remoteCache) Parsley._remoteCache = {}; // Try to retrieve stored xhr\n\n      var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n      var handleXhr = function handleXhr() {\n        var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n        if (!result) // Map falsy results to rejected promise\n          result = $.Deferred().reject();\n        return $.when(result);\n      };\n\n      return xhr.then(handleXhr, handleXhr);\n    },\n    priority: -1\n  });\n  Parsley.on('form:submit', function () {\n    Parsley._remoteCache = {};\n  });\n\n  Base.prototype.addAsyncValidator = function () {\n    Utils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n    return Parsley.addAsyncValidator.apply(Parsley, arguments);\n  };\n\n  // This is included with the Parsley library itself,\n  Parsley.addMessages('en', {\n    defaultMessage: \"This value seems to be invalid.\",\n    type: {\n      email: \"This value should be a valid email.\",\n      url: \"This value should be a valid url.\",\n      number: \"This value should be a valid number.\",\n      integer: \"This value should be a valid integer.\",\n      digits: \"This value should be digits.\",\n      alphanum: \"This value should be alphanumeric.\"\n    },\n    notblank: \"This value should not be blank.\",\n    required: \"This value is required.\",\n    pattern: \"This value seems to be invalid.\",\n    min: \"This value should be greater than or equal to %s.\",\n    max: \"This value should be lower than or equal to %s.\",\n    range: \"This value should be between %s and %s.\",\n    minlength: \"This value is too short. It should have %s characters or more.\",\n    maxlength: \"This value is too long. It should have %s characters or fewer.\",\n    length: \"This value length is invalid. It should be between %s and %s characters long.\",\n    mincheck: \"You must select at least %s choices.\",\n    maxcheck: \"You must select %s choices or fewer.\",\n    check: \"You must select between %s and %s choices.\",\n    equalto: \"This value should be the same.\",\n    euvatin: \"It's not a valid VAT Identification Number.\"\n  });\n  Parsley.setLocale('en');\n\n  function InputEvent() {\n    var _this = this;\n\n    var globals = window || global; // Slightly odd way construct our object. This way methods are force bound.\n    // Used to test for duplicate library.\n\n    _extends(this, {\n      // For browsers that do not support isTrusted, assumes event is native.\n      isNativeEvent: function isNativeEvent(evt) {\n        return evt.originalEvent && evt.originalEvent.isTrusted !== false;\n      },\n      fakeInputEvent: function fakeInputEvent(evt) {\n        if (_this.isNativeEvent(evt)) {\n          $(evt.target).trigger('input');\n        }\n      },\n      misbehaves: function misbehaves(evt) {\n        if (_this.isNativeEvent(evt)) {\n          _this.behavesOk(evt);\n\n          $(document).on('change.inputevent', evt.data.selector, _this.fakeInputEvent);\n\n          _this.fakeInputEvent(evt);\n        }\n      },\n      behavesOk: function behavesOk(evt) {\n        if (_this.isNativeEvent(evt)) {\n          $(document) // Simply unbinds the testing handler\n          .off('input.inputevent', evt.data.selector, _this.behavesOk).off('change.inputevent', evt.data.selector, _this.misbehaves);\n        }\n      },\n      // Bind the testing handlers\n      install: function install() {\n        if (globals.inputEventPatched) {\n          return;\n        }\n\n        globals.inputEventPatched = '0.0.3';\n\n        for (var _i = 0, _arr = ['select', 'input[type=\"checkbox\"]', 'input[type=\"radio\"]', 'input[type=\"file\"]']; _i < _arr.length; _i++) {\n          var selector = _arr[_i];\n          $(document).on('input.inputevent', selector, {\n            selector: selector\n          }, _this.behavesOk).on('change.inputevent', selector, {\n            selector: selector\n          }, _this.misbehaves);\n        }\n      },\n      uninstall: function uninstall() {\n        delete globals.inputEventPatched;\n        $(document).off('.inputevent');\n      }\n    });\n  }\n  var inputevent = new InputEvent();\n\n  inputevent.install();\n\n  describe('Base', () => {\n    it('should provide a actualizeOptions() method', () => {\n      $('body').append('<input type=\"email\" data-parsley-pattern=\"[A-F][0-9]{5}\" data-parsley-required id=\"element\" />');\n      var parsleyField = $('#element').parsley({\n        foo: 'bar'\n      });\n      expect(parsleyField.options.pattern).to.eql('[A-F][0-9]{5}');\n      expect(parsleyField.options.required).to.eql('');\n      $('#element').removeAttr('data-parsley-pattern');\n      parsleyField.actualizeOptions();\n      expect(parsleyField.options.pattern).to.be(undefined);\n      expect(parsleyField.options.required).to.eql('');\n    });\n    it('should use reset() on field', () => {\n      $('body').append('<input type=\"email\" data-parsley-pattern=\"[A-F][0-9]{5}\" data-parsley-required id=\"element\" />');\n      var parsleyField = $('#element').parsley();\n      parsleyField.validate();\n      expect($('#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(1);\n      parsleyField.reset();\n      expect($('#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(0);\n    });\n    it('should use reset() on form', done => {\n      $('body').append('<form id=\"element\">' + '<input id=\"field1\" type=\"text\" required />' + '<div id=\"field2\"></div>' + '<textarea id=\"field2\"></textarea>' + '</form>');\n      var parsleyForm = $('#element').parsley();\n      parsleyForm.validate();\n      expect($('#parsley-id-' + $('#field1').psly().__id__ + ' li').length).to.be(1);\n      $('#element').parsley().on('form:reset', () => {\n        done();\n      });\n      parsleyForm.reset();\n      expect($('#parsley-id-' + $('#field1').psly().__id__ + ' li').length).to.be(0);\n    });\n    it('should use destroy() on field', done => {\n      $('body').append('<input type=\"email\" data-parsley-pattern=\"[A-F][0-9]{5}\" data-parsley-required id=\"element\" />');\n      var parsleyField = $('#element').parsley();\n      $('#element').parsley().on('field:destroy', () => {\n        done();\n      });\n      expect($('#element').data('Parsley')).to.have.key('__class__');\n      expect($('#element').data('Parsley').__class__).to.be('Field');\n      parsleyField.destroy();\n      expect($('#element').data('Parsley')).to.be(undefined);\n    });\n    it('should use destroy() on form', done => {\n      $('body').append('<form id=\"element\">' + '<input id=\"field1\" type=\"text\"/>' + '<div id=\"field2\"></div>' + '<textarea id=\"field2\"></textarea>' + '</form>');\n      var parsleyForm = $('#element').parsley();\n      var fieldEventsCount = 0;\n      var formEventsCount = 0; // Test that a subscribed field event on parent form would be triggered by fields too\n      // Here we only have field1 and field2 as valid parsley fields\n\n      $('#element').parsley().on('field:destroy', () => {\n        fieldEventsCount++;\n      });\n      $('#element').parsley().on('form:destroy', () => {\n        formEventsCount++;\n      });\n      expect($('#element').data('Parsley')).to.have.key('__class__');\n      expect($('#element').data('Parsley').__class__).to.be('Form');\n      expect($('#field1').data('Parsley')).to.have.key('__class__');\n      expect($('#field1').data('Parsley').__class__).to.be('Field');\n      parsleyForm.destroy();\n      expect(fieldEventsCount).to.be(2);\n      expect(formEventsCount).to.be(1); // we should never enter here since parsley form instance is destroyed\n\n      Parsley.on('form:validate', () => {\n        expect(true).to.be(false);\n      }); // test that a submit event does not trigger parsley validation anymore\n\n      $('#element').on('submit', e => {\n        e.preventDefault();\n        expect($('#element').data('Parsley')).to.be(undefined);\n        expect($('#field1').data('Parsley')).to.be(undefined);\n        Parsley.off('form:validate');\n        done();\n      });\n      $('#element').submit();\n    });\n    afterEach(() => {\n      $('#element, .parsley-errors-list').remove();\n    });\n  });\n\n  describe('Field', () => {\n    it('should be a function', () => {\n      expect(Field).to.be.a('function');\n    });\n    it('should throw an error if no parsleyInstance given', () => {\n      expect(Field).to.throwException();\n    });\n    it('should properly bind DOM constraints', () => {\n      $('body').append('<input type=\"text\" id=\"element\" data-parsley-required />');\n      var parsleyField = $('#element').parsley();\n      expect(parsleyField.constraints.length).to.be(1);\n      expect(parsleyField.constraints[0].name).to.be('required');\n      expect(parsleyField.constraints[0].isDomConstraint).to.be(true);\n    });\n    it('should properly bind HTML DOM supported constraints', () => {\n      $('body').append('<input type=\"email\" id=\"element\" />');\n      var parsleyField = $('#element').parsley();\n      expect(parsleyField.constraints.length).to.be(1);\n      expect(parsleyField.constraints[0].name).to.be('type');\n      expect(parsleyField.constraints[0].isDomConstraint).to.be(true);\n    });\n    it('should ignore unknown types', () => {\n      $('body').append('<input type=\"\" id=\"element\" />');\n      var parsleyField = $('#element').parsley();\n      expect(parsleyField.constraints.length).to.be(0);\n    });\n    it('should ignore mistyped types', () => {\n      $('body').append('<input type=\"    email\" id=\"element\" />');\n      var parsleyField = $('#element').parsley();\n      expect(parsleyField.constraints.length).to.be(0);\n    });\n    it('should have a proper addConstraint() javascript method', () => {\n      $('body').append('<input type=\"text\" id=\"element\" />');\n      var parsleyField = $('#element').parsley().addConstraint('required', true);\n      expect(parsleyField.constraints.length).to.be(1);\n      expect(parsleyField.constraints[0].name).to.be('required');\n      expect(parsleyField.constraints[0].requirements).to.be(true);\n      expect(parsleyField.constraints[0].priority).to.be(512);\n      expect(parsleyField.constraints[0].isDomConstraint).to.be(false); // trying to add an existing constraint result in an update\n\n      parsleyField.addConstraint('required', false, 64);\n      expect(parsleyField.constraints.length).to.be(1);\n      expect(parsleyField.constraints[0].name).to.be('required');\n      expect(parsleyField.constraints[0].requirements).to.be(false);\n      expect(parsleyField.constraints[0].priority).to.be(64);\n    });\n    it('should have a proper updateConstraint() javascript method', () => {\n      $('body').append('<input type=\"text\" id=\"element\" />');\n      var parsleyField = $('#element').parsley().addConstraint('required', true); // same as above test where addConstraint resulted in an updateConstraint\n\n      parsleyField.updateConstraint('required', false, 64);\n      expect(parsleyField.constraints.length).to.be(1);\n      expect(parsleyField.constraints[0].name).to.be('required');\n      expect(parsleyField.constraints[0].requirements).to.be(false);\n      expect(parsleyField.constraints[0].priority).to.be(64);\n    });\n    it('should have a proper removeConstraint() javascript method', () => {\n      $('body').append('<input type=\"text\" id=\"element\" />');\n      var parsleyField = $('#element').parsley().addConstraint('required', true).addConstraint('notblank', true).removeConstraint('required');\n      expect(parsleyField.constraints.length).to.be(1);\n      expect(parsleyField.constraints[0].name).to.be('notblank');\n      expect(parsleyField._isRequired()).to.be(false);\n    });\n    it('should return true for fields without constraints', () => {\n      $('body').append('<input type=\"text\" id=\"element\" value=\"hola\" data-parsley-minlength=\"5\" />');\n      var parsleyField = $('#element').parsley(); // Start with some validation errors:\n\n      expect(parsleyField.isValid()).to.eql(false); // The remove constraint and check result:\n\n      $('#element').removeAttr('data-parsley-minlength');\n      expect(parsleyField.isValid()).to.be(true);\n    });\n    it('should properly bind HTML5 supported constraints', () => {\n      $('body').append('<input type=\"email\" pattern=\"\\\\w+\" id=\"element\" required min=\"5\" max=\"100\" minlength=\"1\" maxlength=\"3\" />');\n      var parsleyField = $('#element').parsley(); // 5 validators: type=email, pattern, required, (min+max => range) and (minlength+maxlength => length)\n\n      expect(parsleyField.constraints.length).to.be(5);\n      $('#element').removeAttr('min'); // still 5 validators, with max instead of range now\n\n      expect(parsleyField.actualizeOptions().constraints.length).to.be(5);\n      $('#element').removeAttr('minlength'); // still 5 validators, with maxlength instead of length now\n\n      expect(parsleyField.actualizeOptions().constraints.length).to.be(5);\n    });\n    it('should properly bind HTML5 date inputs', () => {\n      // Uses RFC 3339/ISO 8601 format YYYY-MM-DD\n      $('body').append('<input type=\"date\" id=\"element\" max=\"2000-01-02\" min=\"1999-01-02\" value=\"1998-12-30\" />');\n      var parsleyField = $('#element').parsley();\n      expect(parsleyField.constraints.length).to.be(2); // Type=Date, Range\n\n      expect(parsleyField.isValid()).to.be(false);\n      expect(parsleyField.isValid({\n        value: '1999-02-03'\n      })).to.be(true);\n      $('#element').removeAttr('min');\n      expect(parsleyField.isValid()).to.be(true);\n      expect(parsleyField.constraints.length).to.be(2); // Type=Date, Max\n\n      $('#element').val('2001-03-03');\n      expect(parsleyField.isValid()).to.be(false);\n      $('#element').val('2001/01/01').removeAttr('max');\n      expect(parsleyField.isValid()).to.be(false); // Still invalid because of format\n\n      expect(parsleyField.constraints.length).to.be(1); // Type=Date\n    });\n\n    var itShouldFollowSpecForNumber = (step, min, initial, value, valid) => {\n      var attrs = [step ? `step=\"${step}\" ` : '', min ? `min=\"${min}\" ` : '', initial ? `value=\"${initial}\" ` : ''].join('');\n      it('should follow HTML5 spec to validate \"number\" type ' + (attrs ? `with attributes ${attrs}` : '') + `by ${valid ? 'accepting' : 'rejecting'} \"${value}\"`, () => {\n        var $input = $(`<input type=\"number\" ${attrs}>`);\n        expect($input.parsley().isValid({\n          value\n        })).to.be(valid);\n      });\n    };\n\n    var checks = [// step | min | initial | good        | bad values\n    //      |     |  value  | values      |\n    // ---- | --- | ------- | ----------- | ----------\n    \"       |     |         | 1, -2, 4.0  | 1.1, 4.       \", \"  any  |     |         | -2, 4.3, .1 | 4., hi, ., 1. \", \"  AnY  |     |         | .1e+2, -.2  | 4e, 4e-, .e+2 \", \"  0.1  |     |         | -2, 4.3     | 4.03          \", \"  0.01 |     |         | 1.11        | 1.111         \", // Bug #1056\n    \"       | 0.3 |         | 4.3         | -2, -2.7, 4.0 \", \"       |     |   0.3   | -2.7, 4.3   | -2, -2.3, 4.0 \", \"  0.4  | 0.3 |         | 1.1         | -2.9, 1.6, 1.8\", \"  0.4  |     |   0.3   | -2.9, 1.1   | 1.6, 1.8      \", \"  0.4  | 0.3 |   0.5   | 1.1         | -2.9, 1.6, 1.8\"];\n    $.each(checks, (_, check) => {\n      var trim = val => {\n        return val.trim();\n      };\n\n      var [step, min, initial, ...goodAndBad] = check.split('|').map(trim);\n      var xs = goodAndBad.map(values => {\n        return values.split(',').map(trim);\n      });\n      var [good, bad] = xs;\n      $.each(good, (_, val) => {\n        itShouldFollowSpecForNumber(step, min, initial, val, true);\n        itShouldFollowSpecForNumber(step, min, initial, val.trim() + '0', true);\n      });\n      $.each(bad, (_, val) => {\n        itShouldFollowSpecForNumber(step, min, initial, val, false);\n      });\n    }); // 'any' must be exact match\n\n    itShouldFollowSpecForNumber('   any    ', '', '', '4.2', false); // min / initial should be auto-trimmed\n\n    itShouldFollowSpecForNumber('0.2', '   0.3    ', '', '0.3', true); // scientific notation\n\n    itShouldFollowSpecForNumber('', '0.3', '', '43e-1', true); // commas are not accepted in the spec\n\n    itShouldFollowSpecForNumber('any', '', '', '1,000', false);\n\n    var itShouldFollowSpecForNumber = (step, min, initial, value, valid) => {\n      var attrs = [step ? `step=\"${step}\" ` : '', min ? `min=\"${min}\" ` : '', initial ? `value=\"${initial}\" ` : ''].join('');\n      it('should follow HTML5 spec to validate \"number\" type ' + (attrs ? `with attributes ${attrs}` : '') + `by ${valid ? 'accepting' : 'rejecting'} \"${value}\"`, () => {\n        var $input = $(`<input type=\"number\" ${attrs}>`);\n        expect($input.parsley().isValid({\n          value\n        })).to.be(valid);\n      });\n    };\n\n    it('should have a default step of \"any\" for data-parsley-type=\"number\"', () => {\n      var $input = $(`<input data-parsley-type=\"number\" value=\"4.444\">`);\n      expect($input.parsley().isValid()).to.be(true);\n      $input.attr('data-parsley-type-step', '1');\n      expect($input.parsley().isValid()).to.be(false);\n    });\n    it('should valid simple validator', () => {\n      $('body').append('<input type=\"text\" id=\"element\" value=\"\" />');\n      var parsleyField = $('#element').parsley().addConstraint('required', true);\n      expect(parsleyField.isValid()).to.be(false);\n      $('#element').val('foo');\n      expect(parsleyField.isValid()).to.be(true);\n    });\n    it('should valid more complex `type` validator', () => {\n      $('body').append('<input type=\"text\" id=\"element\" value=\"foo\" />');\n      var parsleyField = $('#element').parsley().addConstraint('type', 'email');\n      expect(parsleyField.isValid()).to.be(false);\n      $('#element').val('foo');\n      expect(parsleyField.isValid()).to.be(false);\n      $('#element').val('foo@bar.baz');\n      expect(parsleyField.isValid()).to.be(true);\n    });\n    it('should valid most complex Callback() validator', () => {\n      $('body').append('<input type=\"text\" id=\"element\" value=\"\" />');\n      window.Parsley.addValidator('ismultiple', (value, multiple) => {\n        if (!isNaN(parseFloat(value)) && isFinite(value)) return !(Number(value) % multiple);\n        return false;\n      }, 512);\n      var parsleyField = $('#element').parsley().addConstraint('ismultiple', 2);\n      expect(parsleyField.isValid()).to.eql(true);\n      $('#element').val('1');\n      expect(parsleyField.isValid()).to.be(false);\n      $('#element').val('2');\n      expect(parsleyField.isValid()).to.be(true);\n      parsleyField.updateConstraint('ismultiple', 3);\n      expect(parsleyField.isValid()).to.be(false);\n      $('#element').val('9');\n      expect(parsleyField.isValid()).to.be(true);\n      window.Parsley.removeValidator('ismultiple');\n    });\n    it('should properly compute constraints on each validation', () => {\n      $('body').append('<input type=\"email\" data-parsley-required id=\"element\" />');\n      window.Parsley.addValidator('foobazer', value => {\n        return 'foobar' === value;\n      }, 2);\n      window.Parsley.addValidator('ismultiple', (value, multiple) => {\n        if (!isNaN(parseFloat(value)) && isFinite(value)) return !(Number(value) % multiple);\n        return false;\n      }, 512);\n      var parsleyField = $('#element').parsley().addConstraint('ismultiple', 4).addConstraint('foobazer', true);\n      parsleyField.refresh();\n      expect(parsleyField.constraints.length).to.be(4);\n      $('#element').removeAttr('data-parsley-required');\n      parsleyField.refresh();\n      expect(parsleyField.constraints.length).to.be(3);\n      parsleyField.removeConstraint('ismultiple').refresh();\n      expect(parsleyField.constraints.length).to.be(2);\n      window.Parsley.removeValidator('foobazer');\n      window.Parsley.removeValidator('ismultiple');\n    });\n    it('should handle constraints priorities on validation', () => {\n      $('body').append('<input type=\"email\" pattern=\"[A-F][0-9]{5}\" required id=\"element\" />');\n      var parsleyField = $('#element').parsley();\n      expect(parsleyField.isValid()).to.be(false);\n      expect(parsleyField.validationResult.length).to.be(1);\n      expect(parsleyField.validationResult[0].assert.name).to.be('required');\n      $('#element').val('foo');\n      expect(parsleyField.isValid()).to.be(false);\n      expect(parsleyField.validationResult.length).to.be(1);\n      expect(parsleyField.validationResult[0].assert.name).to.be('type');\n      $('#element').val('foo@bar.baz');\n      expect(parsleyField.isValid()).to.be(false);\n      expect(parsleyField.validationResult.length).to.be(1);\n      expect(parsleyField.validationResult[0].assert.name).to.be('pattern');\n    });\n    it('should handle all violations if `priorityEnabled` is set to false', () => {\n      $('body').append('<input type=\"email\" pattern=\"[A-F][0-9]{5}\" value=\"x\" id=\"element\" />');\n      var parsleyField = $('#element').parsley({\n        priorityEnabled: false\n      });\n      expect(parsleyField.isValid()).to.be(false);\n      expect(parsleyField.validationResult.length).to.be(2);\n    });\n    it('should trigger field:validate event', done => {\n      $('body').append('<input type=\"email\" pattern=\"[A-F][0-9]{5}\" required id=\"element\" />');\n      $('#element').psly().on('field:validate', function () {\n        // we are before validation!\n        expect(this.validationResult).to.be(true);\n        done();\n      }).validate();\n    });\n    it('should trigger field:validated event', done => {\n      $('body').append('<input type=\"email\" pattern=\"[A-F][0-9]{5}\" required id=\"element\" />');\n      $('#element').psly().on('field:validated', function () {\n        // we are after validation!\n        expect(this.validationResult.length).to.be(1);\n        done();\n      }).validate();\n    });\n    it('should trigger field:error event', done => {\n      $('body').append('<input type=\"email\" pattern=\"[A-F][0-9]{5}\" required id=\"element\" />');\n      $('#element').psly().on('field:error', function () {\n        expect(this.validationResult.length).to.be(1);\n        done();\n      }).validate();\n    });\n    it('should trigger parsley:field:success event', done => {\n      $('body').append('<input type=\"email\" required id=\"element\" value=\"foo@bar.baz\" />');\n      $('#element').psly().on('field:success', function () {\n        expect(this.validationResult).to.be(true);\n        done();\n      }).validate();\n    });\n    it('should have the validationResult be changeable', () => {\n      var submitted = false;\n      $('<form id=\"element\"><input/></form>').appendTo('body').parsley().on('field:success', field => {\n        field.validationResult = false;\n      }).on('field:error', field => {\n        field.validationResult = true;\n      }).on('form:submit', form => {\n        submitted = true;\n        return false;\n      });\n      $('#element').submit();\n      expect(submitted).to.be(false);\n      $('#element input').attr('required', true);\n      $('#element').submit();\n      expect(submitted).to.be(true);\n    });\n    it('should allow `this.value` alteration with field:validate.parsley event', () => {\n      $('body').append('<input type=\"email\" required id=\"element\" value=\"foo@bar.baz\" />');\n      expect($('#element').parsley().validate()).to.be(true);\n      $('#element').parsley().on('field:validate', function () {\n        this.value = '';\n      });\n      expect($('#element').parsley().validate()).not.to.be(true);\n    });\n    it('should have validateIfEmpty / force:true to validate empty fields', () => {\n      var calls = [];\n      window.Parsley.addValidator('checkevenwhenempty', value => {\n        calls.push(value);\n        return 'foo@bar.com' === value;\n      }, 2);\n      $('body').append('<input type=\"email\" data-parsley-checkevenwhenempty id=\"element\" />');\n      expect($('#element').psly().isValid()).to.be.eql(true);\n      expect(calls).to.be.eql([]);\n      expect($('#element').psly().isValid({\n        force: true\n      })).to.be.eql(false);\n      expect(calls).to.be.eql(['']);\n      $('#element').attr('data-parsley-validate-if-empty', '');\n      expect($('#element').psly().isValid()).to.be.eql(false);\n      expect(calls).to.be.eql(['', '']);\n      $('#element').val('foo@bar.com');\n      expect($('#element').psly().isValid()).to.be.eql(true);\n      expect(calls).to.be.eql(['', '', 'foo@bar.com']);\n      window.Parsley.removeValidator('checkevenwhenempty');\n    });\n    it('should allow passing a specific value to `isValid` method', () => {\n      expect($('<input type=\"email\" value=\"foo\">').parsley().isValid()).to.be(false);\n      expect($('<input type=\"email\" value=\"foo\">').parsley().isValid({\n        value: ''\n      })).to.be(true);\n      expectWarning(() => {\n        expect($('<input type=\"email\" value=\"foo\">').parsley().isValid(true, '')).to.be(true);\n      });\n    });\n    it('should have a whitespace=\"squish\" option', () => {\n      $('body').append('<input type=\"text\" id=\"element\" value=\" foo    bar \" />');\n      expect($('#element').parsley().getValue()).to.be(' foo    bar ');\n      $('#element').attr('data-parsley-whitespace', 'squish').parsley().actualizeOptions();\n      expect($('#element').parsley().getValue()).to.be('foo bar');\n    });\n    it('should have a whitespace=\"trim\" option', () => {\n      $('body').append('<input type=\"text\" id=\"element\" value=\" foo \" />');\n      expect($('#element').parsley().getValue()).to.be(' foo ');\n      $('#element').attr('data-parsley-whitespace', 'trim').parsley().actualizeOptions();\n      expect($('#element').parsley().getValue()).to.be('foo');\n    });\n    it('should have a trim-value option', () => {\n      $('body').append('<input type=\"text\" id=\"element\" value=\" foo \" />');\n      expect($('#element').parsley().getValue()).to.be(' foo ');\n      $('#element').attr('data-parsley-trim-value', true).parsley().actualizeOptions();\n      expectWarning(() => {\n        expect($('#element').parsley().getValue()).to.be('foo');\n      });\n    });\n    it('should delay validation if debounce option specified', done => {\n      // Use a an initially valid input. Any success event will be a sign that validation completed\n      // and treated as a failure. We will make the field invalid before delayed validation occurs,\n      // so only error event will be a test success.\n      $('body').append('<input data-parsley-debounce=\"100\" value=\"x\" required data-parsley-trigger=\"validatenow\" id=\"element\"/>');\n      $('#element').parsley().on('field:error', () => done()).on('field:success', () => expect().fail('validation should not happen yet')); // Trigger validation immediately\n\n      $('#element').trigger('validatenow'); // and a bit later, which should reset the counter\n\n      setTimeout(() => $('#element').trigger('validatenow'), 50); // Set final condition after a delay longer than our debounce, less than 50+debounce\n\n      setTimeout(() => $('#element').val(''), 140);\n    });\n    it('should inherit options from the form, even if the form is bound after', () => {\n      $('body').append('<form id=\"element\" data-parsley-required>' + '<input type=\"text\"/></form>');\n      var psly = $('#element input').parsley();\n      expect(psly.isValid()).not.to.be(false);\n      $('#element').parsley();\n      expect(psly.isValid()).to.be(false);\n    });\n    it('should have options that can be set easily', () => {\n      var psly = $('<input type=\"text\"/>').parsley();\n      psly.options.required = true;\n      expect(psly.isValid()).to.be(false);\n    });\n    it('should have a value option', () => {\n      $('body').append('<input type=\"text\" id=\"element\"/>');\n      expect($('#element').parsley({\n        value: 'foo'\n      }).getValue()).to.be('foo');\n    });\n    it('should accept a function as value option', () => {\n      $('body').append('<input type=\"text\" id=\"element\"/>');\n      var str = 'fo';\n      var parsley = $('#element').parsley({\n        value: () => {\n          return str = str + 'o';\n        }\n      });\n      expect(parsley.getValue()).to.be('foo');\n      expect(parsley.getValue()).to.be('fooo');\n    });\n    it('should properly handle null or undefined values', () => {\n      $('body').append('<input type=\"text\" id=\"element\" required value/>');\n      expect($('#element').parsley().isValid()).to.be(false);\n    });\n    afterEach(() => {\n      $('#element, .parsley-errors-list').remove();\n    });\n  });\n\n  describe('Form', () => {\n    it('should be a function', () => {\n      expect(Form).to.be.a('function');\n    });\n    it('should bind parsleyFields children', () => {\n      $('body').append('<form id=\"element\">' + '<input id=\"field1\" type=\"text\"/>' + '<div id=\"field2\"></div>' + '<textarea id=\"field2\"></textarea>' + '</form>');\n      var parsleyForm = $('#element').parsley();\n      expect(parsleyForm.fields.length).to.be(2);\n    });\n    it('should bind parsleyFields children, and not excluded ones', () => {\n      $('body').append('<form id=\"element\">' + '<input id=\"field1\" type=\"text\"/>' + '<div id=\"field2\"></div>' + '<textarea id=\"field2\"></textarea>' + '<div data-parsley-validate></div>' + // Form, not a valid child\n      '<input id=\"field3\" disabled />' + // Disabled, excluded by custom options below\n      '<input id=\"field-excluded\" data-parsley-excluded=\"true\" />' + // Excluded with 'excluded' option\n      '<input type=\"submit\"/>' + // Excluded field, not valid\n      '</form>');\n      var parsleyForm = $('#element').parsley({\n        excluded: '[disabled], input[type=button], input[type=submit], input[type=reset]'\n      });\n      expect(parsleyForm.fields.length).to.be(2);\n      expect($('#field-excluded').data('Parsley')).to.be(undefined);\n    });\n    it('should properly reset excluded', () => {\n      $('body').append('<form id=\"element\">' + '<input id=\"field\" required class=\"foo\"/>' + '</form>');\n      var parsleyForm = $('#element').parsley();\n      parsleyForm.validate();\n      expect($('.parsley-error').length).to.be(1);\n      parsleyForm.options.excluded = \".foo\";\n      parsleyForm.validate();\n      expect($('.parsley-error').length).to.be(0);\n    });\n    it('should properly bind options for form and children fields', () => {\n      $('body').append('<form id=\"element\" data-parsley-trigger=\"change\">' + '<input id=\"field1\" type=\"text\" data-parsley-required=\"true\" />' + '<div id=\"field2\"></div>' + '<textarea id=\"field3\" data-parsley-notblank=\"true\"></textarea>' + '</form>');\n      var parsleyForm = $('#element').parsley();\n      expect(parsleyForm.fields.length).to.be(2);\n      expect($('#field1').parsley().options.trigger).to.be('change');\n      expect($('#field1').parsley().options.required).to.eql(true);\n      expect($('#field1').parsley().options.notblank).to.be(undefined);\n      expect($('#field3').parsley().options.notblank).to.eql(true);\n      expect($('#field3').parsley().options.required).to.be(undefined);\n    });\n    it('should properly store validation state after `validate()`', () => {\n      $('body').append('<form id=\"element\" data-parsley-trigger=\"change\">' + '<input id=\"field1\" type=\"text\" data-parsley-required=\"true\" />' + '<div id=\"field2\"></div>' + '<textarea id=\"field3\" data-parsley-notblank=\"true\"></textarea>' + '</form>');\n      var parsleyForm = $('#element').parsley();\n      parsleyForm.validate();\n      expect(parsleyForm.validationResult).to.be(false);\n      $('#field1').val('foo');\n      $('#field3').val('foo');\n      expect(parsleyForm.validate()).to.be(true);\n    });\n    it('should handle group validation', () => {\n      $('body').append('<form id=\"element\">' + '<input id=\"field1\" type=\"text\" data-parsley-group=\"foo\" data-parsley-required=\"true\" />' + '<div id=\"field2\"></div>' + '<textarea id=\"field3\" data-parsley-required=\"true\"></textarea>' + '</form>');\n      var parsleyForm = $('#element').parsley();\n      expect(parsleyForm.isValid()).to.be(false);\n      $('#field1').val('value');\n      expect(parsleyForm.isValid()).to.be(false);\n      expect(parsleyForm.isValid({\n        group: 'foo'\n      })).to.be(true);\n      $('#field3').attr('data-parsley-group', 'bar');\n      expectWarning(() => {\n        expect(parsleyForm.isValid('bar')).to.be(false);\n      });\n    });\n    it('should handle group validation with controls with multiple group names', () => {\n      $('body').append('<form id=\"element\">' + '<input id=\"field1\" type=\"text\" data-parsley-group=\\'[\"foo\", \"bar\"]\\' data-parsley-required=\"true\" />' + '<input id=\"field2\" type=\"text\" data-parsley-group=\\'[\"bar\", \"baz\"]\\' data-parsley-required=\"true\" />' + '<textarea id=\"field3\" data-parsley-group=\\'[\"baz\", \"qux\"]\\' data-parsley-required=\"true\"></textarea>' + '</form>');\n      var parsleyForm = $('#element').parsley();\n      expect(parsleyForm.isValid()).to.be(false);\n      $('#field1').val('value');\n      $('#field2').val('value');\n      expect(parsleyForm.isValid()).to.be(false); // group name only on one required field, with value\n\n      expect(parsleyForm.isValid('foo')).to.be(true); // group name on multiple required fields, all with values\n\n      expect(parsleyForm.isValid('bar')).to.be(true); // group name on multiple required fields, one missing a value\n\n      expect(parsleyForm.isValid('baz')).to.be(false); // group name on single required field, without value\n\n      expect(parsleyForm.isValid('qux')).to.be(false);\n    });\n    it('should send submit button values, even for async validations', () => {\n      var deferred = null;\n      window.Parsley.addValidator('custom', () => {\n        deferred = $.Deferred();\n        return deferred.promise();\n      });\n      $('body').append('<form id=\"element\">' + '<input id=\"field1\" type=\"text\" name=\"nick\" data-parsley-custom data-parsley-required />' + '<div id=\"field2\" name=\"comment\"></div>' + '<input type=\"submit\" name=\"foo\" value=\"bar\" />' + '<input type=\"submit\" name=\"foo\" value=\"other\" />' + '<button name=\"foo\" value=\"but\">ok</button>' + '</form>');\n      var parsleyForm = $('#element').parsley();\n      $('#element input:last').click(); // Form should not be submitted at this point, coz field is required\n\n      expect(deferred).to.be(null);\n      $('#field1').val('something');\n      var values = [];\n      $('#element').on('submit', evt => {\n        expect(evt.parsley).to.be(true);\n        values.push($('form input[type!=submit][name=\"foo\"]').val());\n        evt.preventDefault();\n      });\n      $('#element button').click();\n      expect(values).to.eql([]);\n      deferred.resolve();\n      expect(values).to.eql(['but']);\n      $('#element input[value=\"other\"]').click();\n      deferred.resolve();\n      expect(values).to.eql(['but', 'other']);\n      $('#element').submit(); // Similar to pressing 'enter'\n\n      deferred.resolve();\n      expect(values).to.eql(['but', 'other', 'bar']);\n      window.Parsley.removeValidator('custom');\n    });\n    it('should not validate when triggered by a button with formnovalidate', () => {\n      var $form = $('<form id=\"element\"><input type=\"string\" required /><input type=\"submit\" formnovalidate /><form>').appendTo($('body'));\n      $form.on('submit', e => {\n        e.preventDefault();\n      });\n      var callbacks = [];\n      $.each(['validate', 'error', 'success', 'validated', 'submit'], (i, cb) => {\n        $form.parsley().on('form:' + cb, () => {\n          callbacks.push(cb);\n        });\n      });\n      $form.parsley();\n      $form.find('input[type=submit]').click();\n      expect(callbacks.join()).to.be('');\n    });\n    it('should have a force option for validate and isValid methods', () => {\n      $('body').append('<form id=\"element\">' + '<input id=\"field1\" type=\"email\" />' + '<input id=\"field3\" data-parsley-notblank=\"true\" />' + '</form>');\n      expect($('#element').parsley().isValid()).to.be(true);\n      expect($('#element').parsley().isValid({\n        force: true\n      })).to.be(false);\n      expect($('#element').parsley().validate()).to.be(true);\n      expectWarning(() => {\n        expect($('#element').parsley().validate(undefined, true)).to.be(false);\n      });\n    });\n    it('should properly bind dynamically added fields', () => {\n      $('body').append('<form id=\"element\" data-parsley-trigger=\"change\"></form>');\n      $('#element').append('<input type=\"email\" id=\"email\" required />');\n      var fieldInstance = $('#email').psly();\n      expect(fieldInstance.__class__).to.be('Field');\n      var formInstance = $('#element').psly(); // form corectly have its field, and field have finaly its parent form\n\n      expect(formInstance.fields[0].$element.attr('id')).to.be('email');\n      expect(fieldInstance.parent.__class__).to.be('Form');\n    });\n    it('should fire the right callbacks in the right order', () => {\n      var $form = $('<form id=\"element\"><input type=\"string\" required /><form>').appendTo($('body'));\n      $form.on('submit', e => {\n        e.preventDefault();\n      });\n      var callbacks = [];\n      $.each(['validate', 'error', 'success', 'validated', 'submit'], (i, cb) => {\n        $form.parsley().on('form:' + cb, () => {\n          callbacks.push(cb);\n        });\n      });\n      $form.parsley();\n      $form.submit();\n      $form.find('input').val('Hello');\n      $form.submit();\n      expect(callbacks.join()).to.be('validate,error,validated,validate,success,validated,submit');\n    });\n    it('should fire \"form:validate.parsley\" to give the opportunity for changes before validation occurs', () => {\n      var $form = $('<form id=\"element\"><input type=\"string\" required /><form>').appendTo($('body'));\n      $form.parsley().on('form:validate', function () {\n        this.$element.find('input').remove();\n      });\n      expect($form.parsley().validate()).to.be(true);\n    });\n    it('should stop event propagation on form submit', done => {\n      $('body').append('<form id=\"element\"><input type=\"text\" required/></form>');\n      var parsleyInstance = $('#element').parsley().on('form:validated', () => {\n        done();\n      });\n      $('#element').on('submit', () => {\n        // It sould never pass here!\n        expect(true).to.be(false);\n      }).submit();\n    });\n    it('should have the validationResult be changeable', () => {\n      var submitted = false;\n      $('<form id=\"element\"></form>').appendTo('body').parsley().on('form:success', form => {\n        form.validationResult = false;\n      }).on('form:error', form => {\n        form.validationResult = true;\n      }).on('form:submit', form => {\n        submitted = true;\n        return false;\n      });\n      $('#element').submit();\n      expect(submitted).to.be(false);\n      $('#element').append('<input required>').submit();\n      expect(submitted).to.be(true);\n    });\n    it('should fire form:submit.event and be interruptable when validated', done => {\n      $('<form id=\"element\"></form>').appendTo('body').parsley().on('form:submit', () => {\n        done();\n        return false;\n      });\n      $('#element').submit();\n    });\n    it('should deprecate interruptions with submitEvent.preventDefault()', () => {\n      expectWarning(() => {\n        $('<form id=\"element\"></form>').appendTo('body').parsley().on('form:validate', form => {\n          form.submitEvent.preventDefault();\n        }).on('form:submit', form => {\n          throw new Error('Form should not have been submitted');\n        });\n        $('#element').submit();\n      });\n    });\n    it('should fire field:reset event if fields are removed or excluded', () => {\n      var parsleyInstance;\n      var steps = [];\n      var step = 'init';\n      var parsleyForm = $('<form id=\"element\"><input type=\"text\" required></form>').appendTo('body').parsley().on('field:reset', function () {\n        steps.push('form: ' + step);\n        expect(this).to.be(parsleyInstance);\n      });\n      parsleyInstance = $('#element input').parsley().on('field:reset', function () {\n        steps.push('field: ' + step);\n        expect(this).to.be(parsleyInstance);\n      });\n      parsleyForm.validate();\n      parsleyForm.validate();\n      parsleyForm.options.excluded = '[required]';\n      step = 'excluded';\n      parsleyForm.validate();\n      parsleyForm.validate();\n      parsleyForm.options.excluded = '';\n      step = 'not excluded';\n      parsleyForm.validate();\n      parsleyForm.validate();\n      var $i = $('#element input').detach();\n      step = 'detached';\n      parsleyForm.validate();\n      parsleyForm.validate();\n      $i.appendTo('form');\n      step = 'reattached';\n      parsleyForm.validate();\n      parsleyForm.validate();\n      $i.remove();\n      step = 'removed';\n      parsleyForm.validate();\n      parsleyForm.validate();\n      expect(steps).to.eql(['field: excluded', 'form: excluded', 'field: detached', 'form: detached', 'field: removed', 'form: removed']);\n    });\n    it('should handle validators returning promises', done => {\n      var called = 0;\n      var shouldSubmit = false;\n      var form = $('<form id=\"element\"><input data-parsley-custom value=\"x\"/></form>').appendTo('body').parsley();\n      var deferred;\n      window.Parsley.addValidator('custom', () => {\n        called++;\n        deferred = $.Deferred();\n        return deferred.promise();\n      });\n      $('#element').on('submit', evt => {\n        evt.preventDefault();\n        expect(evt.parsley).to.be(true); // Sanity check\n\n        expect(shouldSubmit).to.be(true);\n        window.Parsley.removeValidator('custom');\n        done();\n      });\n      $('#element').submit();\n      expect(called).to.eql(1);\n      deferred.reject();\n      var promise = form.whenValidate();\n      expect(called).to.eql(2);\n      expect(promise.state()).to.eql('pending');\n      deferred.reject();\n      expect(promise.state()).to.eql('rejected');\n      $('#element').submit();\n      expect(called).to.eql(3);\n      shouldSubmit = true;\n      deferred.resolve();\n    });\n    it('should handle priority correctly', () => {\n      var calls = [];\n      var form = $('<form id=\"element\"><input value=\"0\" data-parsley-custom1 data-parsley-custom2 data-parsley-custom3 data-parsley-custom4/></form>').appendTo('body').parsley().on('form:submit', evt => {\n        return false;\n      });\n\n      for (const i of [1, 2, 3, 4]) window.Parsley.addValidator(`custom${i}`, {\n        priority: i <= 2 ? 100 : 10 - i,\n        validateNumber: function (value, requirement) {\n          calls.push(i);\n          return value > i;\n        }\n      });\n\n      $('#element').submit();\n      $('#element input').val('3');\n      $('#element').submit();\n      $('#element input').val('5');\n      $('#element').submit();\n      expect(calls).to.eql([2, 1, 2, 1, 3, 2, 1, 3, 4]);\n\n      for (const i of [1, 2, 3, 4]) window.Parsley.removeValidator(`custom${i}`);\n    });\n    it('should refresh', () => {\n      $('body').append('<form id=\"element\">' + '<input required />' + '</form>');\n      var parsleyForm = $('#element').parsley();\n      parsleyForm.validate();\n      expect($('.parsley-error').length).to.be(1);\n      parsleyForm.options.excluded = \"input\";\n      parsleyForm.refresh();\n      expect($('.parsley-error').length).to.be(0);\n    });\n    afterEach(() => {\n      $('#element').remove();\n    });\n  });\n\n  describe('Multiple', () => {\n    it('should not throw errors with multiple items with weird automated generated names', () => {\n      $('body').append('<form id=\"element\">' + '<input type=\"checkbox\" name=\"hello[]\" id=\"check1\" value=\"1\" />' + '<input type=\"checkbox\" name=\"{{ hello }}\" id=\"check2\" value=\"2\" />' + '<input type=\"checkbox\" name=\"$hello$\" id=\"check3\" value=\"3\" />' + '<input type=\"checkbox\" name=\"hello world[ x ]\" id=\"check4\" value=\"4\" />' + '<input type=\"checkbox\" value=\"foo\" />' + '</form>');\n      expectWarning(() => {\n        $('#element').parsley();\n      });\n    });\n    it('should return same Multiple instance for each field in same multiple group, and it should count as one field in form', () => {\n      $('body').append('<form id=\"element\" >' + '<input type=\"checkbox\" name=\"check\" id=\"check1\" value=\"1\" />' + '<input type=\"checkbox\" name=\"check\" id=\"check2\" value=\"2\" />' + '<input type=\"checkbox\" name=\"check\" id=\"check3\" value=\"3\" />' + '</form>');\n      var parsleyMultipleInstance = $('#check1').parsley();\n      expect($('#check2').parsley().__id__).to.be(parsleyMultipleInstance.__id__);\n      expect($('#check3').parsley().__id__).to.be(parsleyMultipleInstance.__id__);\n      expect(parsleyMultipleInstance.$elements.length).to.be(3);\n      expect($('#element').parsley().fields.length).to.be(1);\n    });\n    it('should auto add a data-parsley-multiple attribute to each correctly binded multiple input', () => {\n      $('body').append('<form id=\"element\" >' + '<input type=\"checkbox\" name=\"check\" id=\"check1\" value=\"1\" />' + '<input type=\"checkbox\" name=\"check\" id=\"check2\" value=\"2\" />' + '<input type=\"checkbox\" name=\"check\" id=\"check3\" value=\"3\" />' + '<input type=\"checkbox\" value=\"foo\" />' + '</form>');\n      expectWarning(() => {\n        $('#element').parsley();\n      });\n      expect($('#check1').attr('data-parsley-multiple')).to.be('check');\n      expect($('#check2').attr('data-parsley-multiple')).to.be('check');\n      expect($('#check3').attr('data-parsley-multiple')).to.be('check');\n      expect($('#check4').eq(3).attr('data-parsley-multiple')).to.be(undefined);\n    });\n    it('should have a specific `getValue` method (checkbox)', () => {\n      $('body').append('<form id=\"element\" >' + '<input type=\"checkbox\" name=\"check[]\" id=\"check1\" value=\"1\" />' + '<input type=\"checkbox\" name=\"check[]\" id=\"check2\" value=\"2\" />' + '</form>');\n      expect($('#check1').parsley().getValue()).to.be.eql([]);\n      expect($('#check2').attr('checked', 'checked').parsley().getValue()).to.be.eql(['2']);\n    });\n    it('should have a specific `getValue` method (radio)', () => {\n      $('body').append('<form id=\"element\" >' + '<input type=\"radio\" name=\"radio\" id=\"radio1\" value=\"3\" />' + '<input type=\"radio\" name=\"radio\" id=\"radio2\" value=\"4\" />' + '</form>');\n      expect($('#radio1').parsley().getValue()).to.be.eql('');\n      expect($('#radio2').attr('checked', 'checked').parsley().getValue()).to.be.eql('4');\n    });\n    it('should handle required constraint (checkbox)', () => {\n      $('body').append('<form id=\"element\" >' + '<input type=\"checkbox\" name=\"check[]\" id=\"check1\" value=\"1\" />' + '<input type=\"checkbox\" name=\"check[]\" id=\"check2\" value=\"2\" required />' + '</form>');\n      expect($('#element').parsley().isValid()).to.be(false);\n      $('#check2').attr('checked', 'checked');\n      expect($('#element').parsley().isValid()).to.be(true);\n    });\n    it('should handle required constraint (radio)', () => {\n      $('body').append('<form id=\"element\" >' + '<input type=\"radio\" name=\"radio\" id=\"radio1\" value=\"3\" required />' + '<input type=\"radio\" name=\"radio\" id=\"radio2\" value=\"4\" />' + '</form>');\n      expect($('#element').parsley().isValid()).to.be(false);\n      $('#radio1').attr('checked', 'checked');\n      expect($('#element').parsley().isValid()).to.be(true);\n    });\n    it('should handle check constraint', () => {\n      $('body').append('<form id=\"element\" >' + '<input type=\"checkbox\" name=\"check[]\" id=\"check1\" value=\"1\" data-parsley-check=\"[1, 2]\" />' + '<input type=\"checkbox\" name=\"check[]\" id=\"check2\" value=\"2\" />' + '<input type=\"checkbox\" name=\"check[]\" id=\"check3\" value=\"3\" />' + '<input type=\"checkbox\" name=\"check[]\" id=\"check4\" value=\"4\" />' + '</form>'); // if not required, field is optional and do not fail\n\n      expect($('#check1').parsley().isValid()).to.be.eql(true);\n      expect($('#element').parsley().isValid()).to.be(true); // once required, it fails if not rightly checked\n\n      $('#check1').attr('required', 'true');\n      expect($('#element').parsley().isValid()).to.be(false);\n      $('#check2').attr('checked', 'checked');\n      expect($('#element').parsley().isValid()).to.be(true);\n      $('#check1').attr('checked', 'checked');\n      $('#check3').attr('checked', 'checked');\n      expect($('#element').parsley().isValid()).to.be(false);\n    });\n    it('should support select multiple', () => {\n      $('body').append('<select multiple name=\"foo\" id=\"element\" required data-parsley-mincheck=\"2\">' + '<option value=\"1\">1</option>' + '<option value=\"2\">2</option>' + '<option value=\"3\">3</option>' + '</select>');\n      var parsleyField = $('#element').parsley();\n      expect(parsleyField.__class__).to.be('FieldMultiple');\n      expect(parsleyField.options.multiple).to.be('foo');\n      expect(parsleyField.getValue()).to.be.eql([]);\n      expect(parsleyField.isValid()).to.be(false);\n      $('#element option[value=\"1\"]').attr('selected', 'selected');\n      expect(parsleyField.getValue()).to.be.eql(['1']);\n      expect(parsleyField.isValid()).to.be(false);\n      $('#element option[value=\"2\"]').attr('selected', 'selected');\n      expect(parsleyField.getValue()).to.be.eql(['1', '2']);\n      expect(parsleyField.isValid()).to.be(true);\n    });\n    it('should support select with default without a value', () => {\n      $('body').append('<select id=\"element\" required>' + '<option selected=\"selected\" value>default</option>' + '<option value=\"2\">2</option>' + '</select>');\n      expect($('#element').parsley().isValid()).to.be(false);\n    });\n    it('should not bind radio or checkboxes without a name or and id or a multiple option', () => {\n      $('body').append('<input type=\"radio\" value=\"foo\" />');\n      var parsleyInstance = expectWarning(() => {\n        return $('input[type=radio]').psly();\n      });\n      expect(parsleyInstance.__class__).to.be('Parsley');\n      $('input[type=radio]').attr('id', 'element');\n      parsleyInstance = $('#element').parsley();\n      expect(parsleyInstance.__class__).to.be('FieldMultiple');\n      expect(parsleyInstance.options.multiple).to.be('element');\n      $('#element').attr('name', 'element');\n      parsleyInstance = $('input[name=element]').parsley();\n      expect(parsleyInstance.__class__).to.be('FieldMultiple');\n      expect(parsleyInstance.options.multiple).to.be('element');\n      parsleyInstance.destroy();\n      $('#element').attr('data-parsley-multiple', 'elementfoo');\n      parsleyInstance = $('input[name=element]').parsley();\n      expect(parsleyInstance.__class__).to.be('FieldMultiple');\n      expect(parsleyInstance.options.multiple).to.be('elementfoo');\n    });\n    it('should bind select multiple input without a name or a multiple option', () => {\n      $('body').append('<select multiple id=\"element\"></select>');\n      expect($('#element').parsley().__class__).to.be('FieldMultiple');\n      expect($('#element').attr('data-parsley-multiple')).to.be('element');\n    });\n    it('should remove errors on change, whatever field is changed', () => {\n      $('body').append('<form id=\"element\" >' + '<input type=\"checkbox\" name=\"check[]\" id=\"check1\" value=\"1\" required />' + '<input type=\"checkbox\" name=\"check[]\" id=\"check2\" value=\"2\" />' + '<input type=\"checkbox\" name=\"check[]\" id=\"check3\" value=\"3\" />' + '<input type=\"checkbox\" name=\"check[]\" id=\"check4\" value=\"4\" />' + '</form>');\n      $('#element').parsley().validate();\n      expect($('.parsley-errors-list.filled').length).to.be(1);\n      $('#check2').attr('checked', 'checked').trigger('input');\n      expect($('.parsley-errors-list.filled').length).to.be(0);\n    });\n    it('should add errors on change if trigger enabled, whatever field is changed', () => {\n      $('body').append('<form id=\"element\" >' + '<input type=\"checkbox\" name=\"check[]\" id=\"check1\" value=\"1\" required data-parsley-mincheck=\"2\" data-parsley-trigger=\"change\" />' + '<input type=\"checkbox\" name=\"check[]\" id=\"check2\" value=\"2\" />' + '<input type=\"checkbox\" name=\"check[]\" id=\"check3\" value=\"3\" />' + '<input type=\"checkbox\" name=\"check[]\" id=\"check4\" value=\"4\" />' + '</form>');\n      var parsleyInstance = $('#check1').parsley();\n      expect(parsleyInstance.validationResult).to.be(true);\n      $('#check3').trigger($.Event('change'));\n      expect(parsleyInstance.validationResult.length).to.be(1);\n    });\n    it('should bind only valid multiple siblings sharing the same name', () => {\n      $('body').append('<form id=\"element\">' + '<input name=\"foo\" type=\"hidden\" value=\"0\"/>' + '<input name=\"foo\" id=\"check\" type=\"checkbox\" value=\"1\"/>' + '<input name=\"foo\" id=\"check-2\" type=\"checkbox\" value=\"2\"/>' + '</form>' + '<form id=\"element-2\">' + '<input name=\"foo\" id=\"other-check\" type=\"checkbox\" value=\"3\"/>' + '</form>');\n      $('#element, #element-2').parsley();\n      expect($('#check').parsley().$elements.length).to.be(2);\n    });\n    it('should handle form namespace configuration inheritance and click events while multiple binding through Form', () => {\n      $('body').append('<form id=\"element\" >' + '<input type=\"radio\" name=\"radio\" id=\"radio1\" value=\"3\" foo-bar-required />' + '<input type=\"radio\" name=\"radio\" id=\"radio2\" value=\"4\" />' + '</form>'); // set specific namespace here for form\n\n      var parsleyInstance = $('#element').parsley({\n        namespace: 'foo-bar-'\n      });\n      parsleyInstance.validate();\n      expect($('ul.parsley-errors-list li').length).to.be(1);\n      $('#radio2').trigger('click').trigger('input');\n      expect($('ul.parsley-errors-list li').length).to.be(0);\n    });\n    it('should handle dynamic multiple items removal', () => {\n      $('body').append('<form id=\"element\" >' + '<input type=\"checkbox\" name=\"check[]\" id=\"check1\" value=\"1\" data-parsley-check=\"[1, 2]\" />' + '<input type=\"checkbox\" name=\"check[]\" id=\"check2\" value=\"2\" />' + '<input type=\"checkbox\" name=\"check[]\" id=\"check3\" value=\"3\" />' + '<input type=\"checkbox\" name=\"check[]\" id=\"check4\" value=\"4\" />' + '</form>'); // bind all multiple checkbox inputs. TODO refacto multiple binding\n\n      $('#element').parsley();\n      var parsleyInstance = $('[type=checkbox]:first').parsley();\n      expect(parsleyInstance.$elements.length).to.be(4);\n      $('[type=checkbox]:last').remove(); // validate form to go through all multiple inputs. TODO refacto multiple binding\n\n      $('#element').parsley().validate();\n      expect(parsleyInstance.$elements.length).to.be(3);\n    });\n    it('value option can be a function', () => {\n      $('body').append('<form id=\"element\" >' + '<input type=\"checkbox\" name=\"check[]\" id=\"check1\" value=\"1\" required />' + '<input type=\"checkbox\" name=\"check[]\" id=\"check2\" value=\"2\" />' + '<input type=\"checkbox\" name=\"check[]\" id=\"check3\" value=\"3\" />' + '<input type=\"checkbox\" name=\"check[]\" id=\"check4\" value=\"4\" />' + '</form>');\n      var called = false;\n      var valid = $('#element').parsley({\n        value: function () {\n          called = true;\n          return ['x'];\n        }\n      }).isValid();\n      expect(valid).to.be(true);\n      expect(called).to.be(true);\n    });\n    afterEach(() => {\n      $('#element, #element-2, .parsley-errors-list').remove();\n    });\n  });\n\n  var Factory$1 = Parsley.Factory;\n  describe('Factory', () => {\n    it('should be a function', () => {\n      expect(Factory$1).to.be.a('function');\n    });\n    it('should register some window globals', () => {\n      expect(window.ParsleyUtils).not.to.be(undefined);\n      expect(window.ParsleyValidator).not.to.be(undefined);\n    });\n    it('should throw an error if no element given', () => {\n      expect(Factory$1).to.throwException();\n    });\n    it('should return Form instance if instantiated on a form', () => {\n      $('body').append('<form id=\"element\"></form>');\n      var parsleyInstance = new Factory$1($('#element')[0]);\n      expect(parsleyInstance).to.be.an('object');\n      expect(parsleyInstance.__class__).to.be('Form');\n    });\n    it('should return Field instance if instantiated on a field', () => {\n      $('body').append('<input id=\"element\" />');\n      var parsleyInstance = new Factory$1($('#element')[0]);\n      expect(parsleyInstance).to.be.an('object');\n      expect(parsleyInstance.__class__).to.be('Field');\n    });\n    it('should return Field even if instantiated on an unsupported element', () => {\n      $('body').append('<div id=\"element\"></div>');\n      var parsleyInstance = new Factory$1($('#element')[0]);\n      expect(parsleyInstance).to.be.an('object');\n      expect(parsleyInstance.__class__).to.be('Field');\n    });\n    it('should return Field instance even if instantiated on an excluded field type, and do not have an errors container', () => {\n      $('body').append('<input type=\"submit\" id=\"element\" />');\n      var parsleyInstance = new Factory$1($('#element')[0]);\n      expect(parsleyInstance).to.be.an('object');\n      expect(parsleyInstance.__class__).to.be('Field');\n    });\n    it('should have excluded fields by default', () => {\n      $('body').append('<form id=\"element\" >' + '<input type=\"submit\" />' + '<input type=\"reset\" />' + '<input type=\"hidden\" />' + '<input type=\"button\" />' + '</form>');\n      var parsleyInstance = $('#element').parsley();\n      expect(parsleyInstance.fields.length).to.be(0);\n    });\n    it('should return Form if instantiated on an unsupported element with data-parsley-validate attribute', () => {\n      $('body').append('<div id=\"element\" data-parsley-validate></div>');\n      var parsleyInstance = new Factory$1($('#element')[0]);\n      expect(parsleyInstance).to.be.an('object');\n      expect(parsleyInstance.__class__).to.be('Form');\n    });\n    it('should handle namespace configuration', () => {\n      $('body').append('<div id=\"element\"></div>'); // default ParsleyOptions.namespace\n\n      expect(new Factory$1($('#element')[0]).options.namespace).to.be('data-parsley-'); // global JS config\n\n      $('#element').parsley().destroy();\n      window.ParsleyConfig.namespace = 'data-foo-';\n      expect(new Factory$1($('#element')[0]).options.namespace).to.be('data-foo-'); // option on the go\n\n      $('#element').parsley().destroy();\n      expect(new Factory$1($('#element')[0], {\n        namespace: 'data-bar-'\n      }).options.namespace).to.be('data-bar-'); // data- DOM-API\n\n      $('#element').parsley().destroy();\n      $('#element').attr('data-parsley-namespace', 'data-baz-');\n      expect(new Factory$1($('#element')[0], {\n        namespace: 'data-bar-'\n      }).options.namespace).to.be('data-bar-');\n      delete window.ParsleyConfig.namespace;\n    });\n    it('should handle proper options management', () => {\n      $('body').append('<form id=\"element\" data-parsley-foo=\"bar\" data-parsley-baz=\"baz\"></form>');\n      window.ParsleyConfig = Object.assign(window.ParsleyConfig, {\n        bar: 'baz',\n        baz: 'qux'\n      });\n      var parsleyInstance = new Factory$1($('#element')[0], {\n        qux: 'bux'\n      });\n      expect(parsleyInstance.options.foo).to.be('bar');\n      expect(parsleyInstance.options.baz).to.be('baz');\n      expect(parsleyInstance.options.bar).to.be('baz');\n      expect(parsleyInstance.options.qux).to.be('bux');\n      delete window.ParsleyConfig.bar;\n      delete window.ParsleyConfig.baz;\n    });\n    it('should have a jquery plugin API', () => {\n      $('body').append('<input type=\"text\" id=\"element\" data-parsley-namespace=\"baz-\"></div>');\n      var parsleyInstance = $('#element').parsley({\n        foo: 'bar'\n      });\n      expect(parsleyInstance.__class__).to.be('Field');\n      expect(parsleyInstance.options.namespace).to.be('baz-');\n      expect(parsleyInstance.options.foo).to.be('bar');\n    });\n    it('should have a jquery API returning undefined if done on a empty set', () => {\n      expect($('#foo').parsley()).to.be(undefined);\n    });\n    it('should have a jquery API that binds multiple selectors', () => {\n      $('body').append('<div id=\"element\">' + '<input type=\"text\" id=\"foo\" required />' + '<input type=\"text\" id=\"bar\" required />' + '</div>');\n      expect($('input').parsley().length).to.be(2);\n    });\n    it('should set options with $.fn.parsley', () => {\n      $('body').append('<form id=\"element\" data-parsley-foo=\"bar\"></form>');\n      var parsleyInstance = $('#element').parsley({\n        foo: 42\n      });\n      expect(parsleyInstance.options.foo).to.be(42);\n      $('#element').parsley({\n        foo: 'updated'\n      });\n      expect(parsleyInstance.options.foo).to.be('updated');\n      delete parsleyInstance.options.foo;\n      expect(parsleyInstance.options.foo).to.be('bar');\n    });\n    afterEach(() => {\n      $('#element').remove();\n    });\n  });\n\n  describe('PubSub', () => {\n    it('listen() without context', done => {\n      expectWarning(() => {\n        $.listen('foo', (instance, arg) => {\n          expect(arg).to.be('bar');\n          done();\n        });\n      });\n      $.emit('foo', 'bar');\n    });\n    it('listen() with context', done => {\n      var obj = {\n        foo: bar => {\n          return 'foo' + bar;\n        }\n      };\n      $.listen('foo', obj, function (instance, arg) {\n        expect(this.foo(arg)).to.be('foobar');\n        done();\n      });\n      $.emit('foo', 'bar');\n    });\n    it('listenTo() Field', done => {\n      $('body').append('<input type=\"text\" id=\"element\" />');\n      $('body').append('<input type=\"text\" id=\"element2\" />');\n      var instance = $('#element').psly();\n      $.listenTo(instance, 'foo', parsleyInstance => {\n        expect(parsleyInstance.__id__).to.be(instance.__id__);\n        done();\n      });\n      $.emit('foo', 'bar');\n      $.emit('foo', $('#element2').psly());\n      $.emit('foo', instance);\n    });\n    it('listenTo() Form will listen to Form', done => {\n      $('body').append('<form id=\"element\" data-parsley-trigger=\"change\">' + '<input id=\"field1\" type=\"text\" data-parsley-required=\"true\" />' + '<div id=\"field2\"></div>' + '<textarea id=\"field3\" data-parsley-notblank=\"true\"></textarea>' + '</form>');\n      $.listenTo($('#element').psly(), 'foo', parsleyInstance => {\n        expect($('#element').psly().__id__ === parsleyInstance.__id__);\n        done();\n      });\n      $.emit('foo', $('#element').psly());\n    });\n    it('listenTo() Form will listen to its fields too', done => {\n      $('body').append('<form id=\"element\" data-parsley-trigger=\"change\">' + '<input id=\"field1\" type=\"text\" data-parsley-required=\"true\" />' + '<div id=\"field2\"></div>' + '<textarea id=\"field3\" data-parsley-notblank=\"true\"></textarea>' + '</form>');\n      $.listenTo($('#element').psly(), 'foo', instance => {\n        done();\n      });\n      $.emit('foo', $('#field1').psly());\n    });\n    it('unsubscribeTo()', done => {\n      $('body').append('<input type=\"text\" id=\"element\" />');\n      $.listen('foo', () => {\n        done();\n      });\n      $.listenTo($('#element').psly(), 'foo', () => {\n        expect(true).to.be(false);\n      });\n      $.unsubscribeTo($('#element').psly(), 'foo');\n      $.emit('foo', $('#element').psly());\n    });\n    it('unsubscribe()', () => {\n      var fn = () => {\n        expect(true).to.be(false);\n      };\n\n      $.listen('foo', fn);\n      $.unsubscribe('foo', fn);\n      $.emit('foo');\n    });\n    afterEach(() => {\n      $('#element, #element2').remove();\n      $.unsubscribeAll('foo');\n    });\n  });\n\n  describe('ParsleyRemote', () => {\n    var stubbed = false;\n\n    var stubAjax = status => {\n      restoreAjax();\n      var deferred = $.Deferred();\n      var xhr = Object.assign(deferred.promise(), {\n        status: status\n      });\n\n      if (status === 200) {\n        deferred.resolve({}, 'success', 'xhr');\n      } else {\n        deferred.reject(xhr, 'error', 'error');\n      }\n\n      sinon.stub($, 'ajax').returns(xhr);\n      stubbed = true;\n    };\n\n    var restoreAjax = () => {\n      if (stubbed) $.ajax.restore();\n      stubbed = false;\n    };\n\n    afterEach(restoreAjax);\n    beforeEach(() => {\n      delete window.Parsley._remoteCache;\n    });\n    it('should have window.ParsleyExtend defined', () => {\n      expect(window.ParsleyExtend).not.to.be(undefined);\n    });\n    it('should handle properly validation with remote validator', done => {\n      $('body').append('<input type=\"text\" data-parsley-remote=\"http://foo.bar\" id=\"element\" required name=\"element\" value=\"foo\" />');\n      var parsleyInstance = $('#element').parsley();\n      stubAjax(400);\n      parsleyInstance.whenValid().fail(() => {\n        stubAjax(200);\n        $('#element').val('bar');\n        parsleyInstance.whenValid().done(() => {\n          done();\n        });\n      });\n    });\n    it('should handle remote reverse option', done => {\n      $('body').append('<input type=\"text\" data-parsley-remote=\"http://foo.bar\" id=\"element\" data-parsley-remote-reverse=\"true\" required name=\"element\" value=\"baz\" />');\n      var parsleyInstance = $('#element').parsley();\n      stubAjax(200);\n      parsleyInstance.whenValid().fail(() => {\n        stubAjax(400);\n        $('#element').val('bux');\n        parsleyInstance.whenValid().done(() => {\n          done();\n        });\n      });\n    });\n    it('should handle remote options', done => {\n      $('body').append('<input type=\"text\" data-parsley-remote=\"http://foo.bar\" id=\"element\" data-parsley-remote-options=\\'{ \"type\": \"POST\", \"data\": {\"foo\": \"bar\"} }\\' required name=\"element\" value=\"baz\" />');\n      var parsleyInstance = $('#element').parsley();\n      stubAjax(200);\n      parsleyInstance.whenValid().done(() => {\n        expect($.ajax.calledWithMatch({\n          type: 'POST'\n        })).to.be(true);\n        expect($.ajax.calledWithMatch({\n          url: 'http://foo.bar'\n        })).to.be(true);\n        expect($.ajax.calledWithMatch({\n          data: {\n            foo: 'bar',\n            element: 'baz'\n          }\n        })).to.be(true);\n        done();\n      });\n    });\n    it('should save some calls for queries already done', done => {\n      $('body').append('<input type=\"text\" data-parsley-remote=\"http://foo.bar\" id=\"element\" required name=\"element\" value=\"foo\" />');\n      var parsleyInstance = $('#element').parsley();\n      stubAjax(200);\n      parsleyInstance.whenValid().done(() => {\n        expect($.ajax.calledOnce).to.be(true);\n        expect($.ajax.calledWithMatch({\n          data: {\n            element: 'foo'\n          }\n        })).to.be(true);\n        stubAjax(400);\n        $('#element').val('bar');\n        parsleyInstance.whenValid().fail(() => {\n          expect($.ajax.calledOnce).to.be(true);\n          expect($.ajax.calledWithMatch({\n            data: {\n              element: 'bar'\n            }\n          })).to.be(true);\n          stubAjax(200);\n          $('#element').val('foo');\n          parsleyInstance.whenValid().done(() => {\n            expect($.ajax.callCount).to.be(0);\n            expect($.ajax.calledOnce).to.be(false);\n            done();\n          });\n        });\n      });\n    });\n    it('should handle remote validator option', done => {\n      window.Parsley.addAsyncValidator('custom', xhr => {\n        return xhr.status === 404;\n      });\n      $('body').append('<input type=\"text\" data-parsley-remote=\"http://foo.bar\" id=\"element\" data-parsley-remote-validator=\"custom\" required name=\"element\" value=\"foobar\" />');\n      var parsleyInstance = $('#element').parsley();\n      stubAjax(200);\n      parsleyInstance.whenValid().fail(() => {\n        stubAjax(400);\n        $('#element').val('foobaz');\n        parsleyInstance.whenValid().fail(() => {\n          stubAjax(404);\n          $('#element').val('fooquux');\n          parsleyInstance.whenValid().done(() => {\n            done();\n          });\n        });\n      });\n    });\n    it('should handle remote validator option with custom url', done => {\n      $('body').append('<input type=\"text\" data-parsley-remote id=\"element\" data-parsley-remote-validator=\"mycustom\" required name=\"element\" value=\"foobar\" />');\n      var parsleyInstance = $('#element').parsley();\n      window.Parsley.addAsyncValidator('mycustom', xhr => {\n        return xhr.status === 404;\n      }, 'http://foobar.baz');\n      stubAjax(200);\n      parsleyInstance.whenValid().fail(() => {\n        expect($.ajax.calledWithMatch({\n          url: 'http://foobar.baz'\n        })).to.be(true);\n        done();\n      });\n    });\n    it('should have PluginField as the `this` context of the AJAX callback', done => {\n      $('body').append('<input type=\"text\" data-parsley-remote id=\"element\" data-parsley-remote-validator=\"mycustom\" required name=\"element\" value=\"foobar\" />');\n      var parsleyInstance = $('#element').parsley();\n      window.Parsley.addAsyncValidator('mycustom', function (xhr) {\n        expect(this.__class__).to.be('Field');\n      }, 'http://foobar.baz');\n      stubAjax(200);\n      parsleyInstance.whenValid().fail(() => {\n        expect($.ajax.calledWithMatch({\n          url: 'http://foobar.baz'\n        })).to.be(true);\n        done();\n      });\n    });\n    it('should handle deprecated call to addAsyncValidator using an instance', () => {\n      $('body').append('<input type=\"text\" data-parsley-remote id=\"element\" data-parsley-remote-validator=\"mycustom\" required name=\"element\" value=\"foobar\" />');\n      expectWarning(() => {\n        $('input').parsley().addAsyncValidator('instancetest', $.noop, '');\n      });\n      expect(Parsley.asyncValidators.instancetest).not.to.be(undefined);\n    });\n    it('should clear the cache before and after submitting a form', () => {\n      var parsleyInstance = $('<form id=\"element\"><input type=\"text\" required></form>').appendTo('body').on('submit', evt => {\n        evt.preventDefault();\n      }).parsley();\n      window.Parsley._remoteCache = {\n        dummy: 42\n      };\n      $('#element').submit();\n      expect(window.Parsley._remoteCache.dummy).to.be(undefined);\n      window.Parsley._remoteCache = {\n        dummy: 42\n      };\n      $('#element input').val('hello');\n      parsleyInstance.validate();\n      expect(window.Parsley._remoteCache.dummy).to.be(42);\n      $('#element').submit();\n      expect(window.Parsley._remoteCache.dummy).to.be(undefined);\n    });\n    it('should allow the change of XHR options', done => {\n      var parsleyInstance = $('<input id=\"element\" data-parsley-remote=\"http://parsleyjs.org\" name=\"element\" value=\"foobar\"/>').appendTo('body').parsley().on('field:ajaxoptions', (field, options) => {\n        options.url = options.url + '/test/' + options.data.element;\n      });\n      stubAjax(200);\n      parsleyInstance.whenValid().done(() => {\n        expect($.ajax.calledWithMatch({\n          url: 'http://parsleyjs.org/test/foobar'\n        })).to.be(true);\n        expect($.ajax.calledWithMatch({\n          data: {\n            element: 'foobar'\n          }\n        })).to.be(true);\n        done();\n      });\n    });\n    it('should allow RESTful URLs', done => {\n      var parsleyInstance = $('<input id=\"element\" data-parsley-remote=\"http://parsleyjs.org/thisisrest/{value}\" name=\"element\" value=\"foo bar\"/>').appendTo('body').parsley();\n      stubAjax(200);\n      parsleyInstance.whenValid().done(() => {\n        expect($.ajax.calledWithMatch({\n          url: 'http://parsleyjs.org/thisisrest/foo%20bar'\n        })).to.be(true);\n        expect($.ajax.calledWithMatch({\n          data: {\n            element: 'foo bar'\n          }\n        })).to.be(false);\n        done();\n      });\n    });\n    it.skip('should abort successives querries and do not handle their return');\n    afterEach(() => {\n      $('#element, .parsley-errors-list').remove();\n    });\n  });\n\n  describe('UI', () => {\n    before(() => {\n      Parsley.setLocale('en');\n    });\n    it('should create proper errors container when needed', () => {\n      $('body').append('<input type=\"text\" id=\"element\" data-parsley-required />');\n      var parsleyField = $('#element').psly();\n      expect($('ul#parsley-id-' + parsleyField.__id__).length).to.be(0);\n      parsleyField.validate();\n      expect($('#element').attr('data-parsley-id')).to.be(parsleyField.__id__);\n      expect($('ul#parsley-id-' + parsleyField.__id__).length).to.be(1);\n      expect($('ul#parsley-id-' + parsleyField.__id__).hasClass('parsley-errors-list')).to.be(true);\n    });\n    it('should handle errors-container option', () => {\n      $('body').append('<form id=\"element\">' + '<input id=\"field1\" type=\"text\" required data-parsley-errors-container=\"#container\" />' + '<div id=\"container\"></div>' + '<div id=\"container2\"></div>' + '</form>');\n      $('#element').psly().validate();\n      expect($('#container .parsley-errors-list').length).to.be(1);\n      $('#element').psly().destroy();\n      $('#field1').removeAttr('data-parsley-errors-container');\n      $('#element').psly({\n        errorsContainer: function (ins) {\n          expect(ins).to.be($('#field1').psly());\n          expect(this).to.be($('#field1').psly());\n          return $('#container2');\n        }\n      }).validate();\n      expect($('#container2 .parsley-errors-list').length).to.be(1);\n    });\n    it('should handle errors-container option with function', () => {\n      $('body').append('<form id=\"element\">' + '<input id=\"field1\" type=\"text\" required data-parsley-errors-container=\"parsleyContainerFunction\" />' + '<div id=\"container\"></div>' + '<div id=\"container2\"></div>' + '</form>');\n\n      window.parsleyContainerFunction = function (ins) {\n        expect(ins).to.be($('#field1').psly());\n        expect(this).to.be($('#field1').psly());\n        return $('#container2');\n      };\n\n      $('#element').psly().validate();\n      expect($('#container2 .parsley-errors-list').length).to.be(1);\n      delete window.parsleyContainerFunction;\n    });\n    it('should handle wrong errors-container option', () => {\n      $('body').append('<input type=\"text\" id=\"element\" data-parsley-errors-container=\"#donotexist\" required/>');\n      var parsley = $('#element').psly();\n      expectWarning(() => {\n        parsley.validate();\n      });\n    });\n    it('should not add success class on a field without constraints', () => {\n      $('body').append('<input type=\"text\" id=\"element\" />');\n      var parsleyField = $('#element').psly();\n      parsleyField.validate();\n      expect($('#element').hasClass('parsley-error')).to.be(false);\n      expect($('#element').hasClass('parsley-success')).to.be(false);\n    });\n    it('should not add success class on an empty optional field', () => {\n      $('body').append('<input type=\"number\" id=\"element\" />');\n      var parsleyField = $('#element').psly();\n      parsleyField.validate();\n      expect($('#element').hasClass('parsley-error')).to.be(false);\n      expect($('#element').hasClass('parsley-success')).to.be(false);\n    });\n\n    var checkType = (type, html, fillValue) => {\n      it(`should add proper parsley class on success or failure (${type})`, () => {\n        $('body').append(`<form id=\"element\"><section>${html}</section></form>`);\n        let form = $('#element').parsley();\n        let $inputHolder = $('#element section').children().first();\n        form.validate();\n        expect($inputHolder.attr('class')).to.be('parsley-error');\n        expect($('.parsley-errors-list').parent().prop(\"tagName\")).to.be('SECTION'); // Fill and revalidate:\n\n        fillValue($inputHolder);\n        form.validate();\n        expect($inputHolder.attr('class')).to.be('parsley-success');\n      });\n    };\n\n    let callVal = $input => $input.val('foo');\n\n    checkType('text', '<input type=\"text\" required/>', callVal);\n    checkType('select', '<select multiple required><option value=\"foo\">foo</option>', callVal);\n\n    let callProp = $fieldset => $fieldset.find('input').prop('checked', true);\n\n    checkType('radio', '<fieldset><input type=\"radio\" name=\"foo\" required /></fieldset>', callProp);\n    checkType('checkbox', '<fieldset><input type=\"checkbox\" name=\"foo\" required /></fieldset>', callProp);\n    it('should handle class-handler option', () => {\n      $('body').append('<form id=\"element\">' + '<input id=\"field1\" type=\"email\" data-parsley-class-handler=\"#field2\" required />' + '<div id=\"field2\"></div>' + '<div id=\"field3\"></div>' + '</form>');\n      $('#element').psly().validate();\n      expect($('#field2').hasClass('parsley-error')).to.be(true);\n      $('#element').psly().destroy();\n      $('#field1').removeAttr('data-parsley-class-handler');\n      $('#element').psly({\n        classHandler: function (ins) {\n          expect(ins).to.be($('#field1').parsley());\n          expect(this).to.be($('#field1').parsley());\n          return $('#field3');\n        }\n      }).validate();\n      expect($('#field3').hasClass('parsley-error')).to.be(true);\n    });\n    it('should handle class-handler option with a function', () => {\n      $('body').append('<form id=\"element\">' + '<input id=\"field1\" type=\"email\" data-parsley-class-handler=\"#field2\" required />' + '<div id=\"field4\"></div>' + '</form>');\n      $('#field1').attr('data-parsley-class-handler', 'parsleyClassHandler');\n\n      window.parsleyClassHandler = function (ins) {\n        expect(ins).to.be($('#field1').parsley());\n        expect(this).to.be($('#field1').parsley());\n        return $('#field4');\n      };\n\n      $('#element').psly().validate();\n      expect($('#field4').hasClass('parsley-error')).to.be(true);\n      $('#element').psly().destroy();\n      $('#field1').attr('data-parsley-class-handler', 'someUndefinedFunctionName');\n      expectWarning(() => {\n        $('#element').psly().validate();\n      });\n      expect($('#field1').hasClass('parsley-error')).to.be(true);\n      delete window.parsleyClassHandler;\n    });\n    it('should show higher priority error message by default', () => {\n      $('body').append('<input type=\"email\" id=\"element\" required />');\n      var parsleyField = $('#element').psly();\n      parsleyField.validate();\n      expect($('#element').hasClass('parsley-error')).to.be(true);\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(1);\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').hasClass('parsley-required')).to.be(true);\n      $('#element').val('foo').psly().validate();\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(1);\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').hasClass('parsley-type')).to.be(true);\n    });\n    it('should show custom error message by validator', () => {\n      $('body').append('<input type=\"email\" id=\"element\" required data-parsley-required-message=\"foo\" data-parsley-type-message=\"bar\"/>');\n      var parsleyField = $('#element').psly();\n      parsleyField.validate();\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').text()).to.be('foo');\n      $('#element').val('foo').psly().validate();\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').text()).to.be('bar');\n    });\n    it('should show custom error message with variabilized parameters', () => {\n      $('body').append('<input type=\"text\" id=\"element\" value=\"bar\" data-parsley-minlength=\"7\" data-parsley-minlength-message=\"foo %s bar\"/>');\n      var parsleyField = $('#element').psly();\n      parsleyField.validate();\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').text()).to.be('foo 7 bar');\n    });\n    it('should show custom error message for whole field', () => {\n      $('body').append('<input type=\"email\" id=\"element\" required data-parsley-error-message=\"baz\"/>');\n      var parsleyField = $('#element').psly();\n      parsleyField.validate();\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').text()).to.be('baz');\n      $('#element').val('foo').psly().validate();\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').text()).to.be('baz');\n      $('#element').val('foo@bar.baz').psly().validate();\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(0);\n    });\n    it('should display no error message if diabled', () => {\n      $('body').append('<input type=\"email\" id=\"element\" required data-parsley-errors-messages-disabled />');\n      var parsleyField = $('#element').psly();\n      parsleyField.validate();\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(0);\n      expect($('#element').hasClass('parsley-error')).to.be(true);\n    });\n    it('should handle simple triggers (change, focus...)', () => {\n      $('body').append('<input type=\"email\" id=\"element\" required data-parsley-trigger=\"change\" />');\n      var parsleyField = $('#element').psly();\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(0);\n      $('#element').trigger($.Event('change'));\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(1);\n    });\n    it('should allow customization of triggers after first error', () => {\n      $('body').append('<input type=\"email\" id=\"element\" required data-parsley-trigger-after-failure=\"focusout\" />');\n      var parsleyField = $('#element').psly();\n      parsleyField.validate();\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(1);\n      $('#element').val('a@example.com');\n      $('#element').trigger('input');\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(1);\n      $('#element').trigger('focusout');\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(0);\n    });\n    it('should auto bind error trigger on select field error (input=text)', () => {\n      $('body').append('<input type=\"email\" id=\"element\" required />');\n      var parsleyField = $('#element').psly();\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(0);\n      parsleyField.validate();\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(1);\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').hasClass('parsley-required')).to.be(true);\n      $('#element').val('foo').trigger('input');\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').hasClass('parsley-type')).to.be(true);\n    });\n    it('should auto bind error trigger on select field error (select)', () => {\n      $('body').append('<select id=\"element\" required>' + '<option value=\"\">Choose</option>' + '<option value=\"foo\">foo</option>' + '<option value=\"bar\">bar</option>' + '</select>');\n      var parsleyField = $('#element').psly();\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(0);\n      parsleyField.validate();\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(1);\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').hasClass('parsley-required')).to.be(true);\n      $('#element [option=\"foo\"]').attr('selected', 'selected');\n      $('#element').trigger($.Event('change'));\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').hasClass('parsley-type')).to.be(false);\n    });\n    it('should handle complex triggers (keyup, keypress...)', () => {\n      $('body').append('<input type=\"email\" id=\"element\" required data-parsley-trigger=\"keyup\" />');\n      var parsleyField = $('#element').psly();\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(0);\n      $('#element').val('foo').trigger($.Event('keyup'));\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(0);\n      $('#element').val('foob').trigger($.Event('keyup'));\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(1);\n    });\n    it('should handle trigger keyup threshold validation', () => {\n      $('body').append('<input type=\"email\" id=\"element\" data-parsley-validation-threshold=\"7\" required data-parsley-trigger=\"keyup\" />');\n      var parsleyField = $('#element').psly();\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(0);\n      $('#element').val('a@b.com').trigger('keyup');\n      expect($('#element').hasClass('success')).to.be(false);\n      $('#element').val('aa@b.com').trigger('keyup');\n      expect($('#element').hasClass('parsley-success')).to.be(true);\n      $('#element').val('@b.com').trigger('keyup');\n      expect($('#element').hasClass('parsley-success')).to.be(false);\n    });\n    it('should handle UI disabling', () => {\n      $('body').append('<input type=\"email\" id=\"element\" data-parsley-ui-enabled=\"false\" required data-parsley-trigger=\"keyup\" />');\n      var parsleyField = $('#element').psly();\n      expect($('ul#parsley-id-' + parsleyField.__id__).length).to.be(0);\n      parsleyField.validate();\n      expect($('ul#parsley-id-' + parsleyField.__id__).length).to.be(0);\n    });\n    it('should add novalidate on form elem', () => {\n      $('body').append('<form id=\"element\" data-parsley-trigger=\"change\">' + '<input id=\"field1\" type=\"text\" data-parsley-required=\"true\" />' + '<div id=\"field2\"></div>' + '<textarea id=\"field3\" data-parsley-notblank=\"true\"></textarea>' + '</form>');\n      var parsleyForm = $('#element').parsley();\n      expect($('#element').attr('novalidate')).not.to.be(undefined);\n    });\n    it('should test the no-focus option', () => {\n      $('body').append('<form id=\"element\" data-parsley-focus=\"first\">' + '<input id=\"field1\" type=\"text\" data-parsley-required=\"true\" data-parsley-no-focus />' + '<input id=\"field2\" data-parsley-required />' + '</form>');\n      $('#element').parsley().validate();\n      expect($('#element').parsley()._focusedField.attr('id')).to.be('field2');\n      $('#field2').val('foo');\n      $('#element').psly().validate();\n      expect($('#element').parsley()._focusedField).to.be(null);\n      $('#field1').removeAttr('data-parsley-no-focus');\n      $('#element').psly().validate();\n      expect($('#element').parsley()._focusedField.attr('id')).to.be('field1');\n      $('#element').attr('data-parsley-focus', 'last');\n      $('#element').psly().validate();\n      expect($('#element').parsley()._focusedField.attr('id')).to.be('field1');\n      $('#field2').val('');\n      $('#element').psly().validate();\n      expect($('#element').parsley()._focusedField.attr('id')).to.be('field2');\n    });\n    it('should test the manual add / update / remove error', () => {\n      $('body').append('<input type=\"text\" id=\"element\" />');\n      var parsleyField = $('#element').parsley();\n      parsleyField.removeError('non-existent');\n      parsleyField.validate();\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(0);\n      expect($('#element').hasClass('parsley-error')).to.be(false);\n      expectWarning(() => {\n        window.ParsleyUI.addError(parsleyField, 'foo', 'bar');\n      });\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(1);\n      expect($('#element').hasClass('parsley-error')).to.be(true);\n      expect($('li.parsley-foo').length).to.be(1);\n      expect($('li.parsley-foo').text()).to.be('bar');\n      expectWarning(() => {\n        window.ParsleyUI.updateError(parsleyField, 'foo', 'baz');\n      });\n      expect($('li.parsley-foo').text()).to.be('baz');\n      expectWarning(() => {\n        window.ParsleyUI.removeError(parsleyField, 'foo');\n      });\n      expect($('#element').hasClass('parsley-error')).to.be(false);\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(0);\n    });\n    it('should have a getErrorsMessage() method', () => {\n      $('body').append('<input type=\"email\" id=\"element\" value=\"foo\" data-parsley-minlength=\"5\" />');\n      var parsleyInstance = $('#element').parsley();\n      parsleyInstance.validate();\n      expectWarning(() => {\n        window.ParsleyUI.getErrorsMessages(parsleyInstance);\n      });\n      expect(window.ParsleyUI.getErrorsMessages(parsleyInstance).length).to.be(1);\n      expect(window.ParsleyUI.getErrorsMessages(parsleyInstance)[0]).to.be('This value should be a valid email.');\n      $('#element').attr('data-parsley-priority-enabled', false);\n      parsleyInstance.validate();\n      expect(window.ParsleyUI.getErrorsMessages(parsleyInstance).length).to.be(2);\n      expect(window.ParsleyUI.getErrorsMessages(parsleyInstance)[0]).to.be('This value is too short. It should have 5 characters or more.');\n    });\n    it('should not have errors ul created for excluded fields', () => {\n      $('body').append('<div id=\"hidden\"><input type=\"hidden\" id=\"element\" value=\"foo\" data-parsley-minlength=\"5\" /></div>');\n      var parsleyInstance = $('#element').parsley();\n      expect($('#hidden ul').length).to.be(0);\n      $('#hidden').remove();\n    });\n    it('should remove filled class from errors container when reseting', () => {\n      $('body').append('<input type=\"email\" id=\"element\" value=\"foo\" data-parsley-minlength=\"5\" />');\n      var parsleyInstance = $('#element').parsley();\n      parsleyInstance.validate();\n      parsleyInstance.reset();\n      expect($('ul#parsley-id-' + parsleyInstance.__id__).hasClass('filled')).to.be(false);\n    });\n    it('should re-bind error triggers after a reset (input=text)', () => {\n      $('body').append('<input type=\"text\" id=\"element\" required />');\n      var parsleyInstance = $('#element').parsley();\n      parsleyInstance.validate();\n      parsleyInstance.reset();\n      parsleyInstance.validate();\n      expect($('ul#parsley-id-' + parsleyInstance.__id__ + ' li').length).to.be(1);\n      $('#element').val('foo').trigger('input');\n      expect($('ul#parsley-id-' + parsleyInstance.__id__ + ' li').length).to.be(0);\n    });\n    it('should re-bind error triggers after a reset (select)', () => {\n      $('body').append('<select id=\"element\" required>' + '<option value=\"\">Choose</option>' + '<option value=\"foo\">foo</option>' + '<option value=\"bar\">bar</option>' + '</select>');\n      var parsleyInstance = $('#element').parsley();\n      parsleyInstance.validate();\n      parsleyInstance.reset();\n      parsleyInstance.validate();\n      expect($('ul#parsley-id-' + parsleyInstance.__id__ + ' li').length).to.be(1);\n      $('#element option[value=\"foo\"]').prop('selected', true);\n      $('#element').trigger('input');\n      expect($('ul#parsley-id-' + parsleyInstance.__id__ + ' li').length).to.be(0);\n    });\n    it('should re-bind custom triggers after a reset', () => {\n      $('body').append('<input type=\"text\" id=\"element\" required data-parsley-trigger=\"focusout\" />');\n      var parsleyInstance = $('#element').parsley();\n      parsleyInstance.validate();\n      parsleyInstance.reset();\n      $('#element').trigger('focusout');\n      expect($('ul#parsley-id-' + parsleyInstance.__id__ + ' li').length).to.be(1);\n    });\n    it('should handle custom error message for validators with compound names', () => {\n      $('body').append('<input type=\"text\" value=\"1\" id=\"element\" data-parsley-custom-validator=\"2\" data-parsley-custom-validator-message=\"custom-validator error\"/>');\n      window.Parsley.addValidator('customValidator', (value, requirement) => {\n        return requirement === value;\n      }, 32);\n      var parsleyField = $('#element').psly();\n      parsleyField.validate();\n      expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').text()).to.be('custom-validator error');\n      window.Parsley.removeValidator('customValidator');\n    });\n    it('should handle custom error messages returned from custom validators', () => {\n      $('body').append('<input type=\"text\" value=\"1\" id=\"element\" data-parsley-custom-validator=\"2\" data-parsley-custom-validator-message=\"custom-validator error\"/>');\n      window.Parsley.addValidator('customValidator', (value, requirement) => {\n        return $.Deferred().reject(\"Hey, this ain't good at all\").promise();\n      }, 32);\n      var parsleyField = $('#element').psly();\n      parsleyField.validate();\n      expect($(`ul#parsley-id-${parsleyField.__id__} li`).text()).to.be(\"Hey, this ain't good at all\");\n      window.Parsley.removeValidator('customValidator');\n    });\n    it('should run before events are fired', () => {\n      $('body').append('<input type=\"text\" id=\"element\" required/>');\n      var parsley = $('#element').parsley().on('field:validated', () => {\n        expect($('.parsley-errors-list')).to.have.length(1);\n      });\n      parsley.validate();\n    });\n    afterEach(() => {\n      $('#element, .parsley-errors-list').remove();\n    });\n  });\n\n  describe('Utils', () => {\n    it('should warn when using the old global ParsleyUtils', () => {\n      expectWarning(() => {\n        expect(window.ParsleyUtils.deserializeValue('true')).to.be(true);\n      });\n    });\n    it('should have a proper deserializeValue() function', () => {\n      expect(Utils.deserializeValue('true')).to.be(true);\n      expect(Utils.deserializeValue('1')).to.be(1);\n      expect(Utils.deserializeValue('[\"foo\", \"bar\"]')).to.be.an('array');\n      expect(Utils.deserializeValue('{\"foo\": \"bar\"}')).to.be.an('object');\n    });\n    it('should have a proper camelize() function', () => {\n      expect(Utils.camelize('foo-bar')).to.be('fooBar');\n      expect(Utils.camelize('foo-bar-baz')).to.be('fooBarBaz');\n      expect(Utils.camelize('foo-bAr-baz')).to.be('fooBArBaz');\n    });\n    it('should have a proper dasherize() function', () => {\n      expect(Utils.dasherize('fooBar')).to.be('foo-bar');\n      expect(Utils.dasherize('fooBarBaz')).to.be('foo-bar-baz');\n      expect(Utils.dasherize('fooBArBaz')).to.be('foo-b-ar-baz');\n    });\n    it('should have a proper attr() function', () => {\n      var element = {\n        attributes: [{\n          specified: true,\n          name: \"data-parsley-foo\",\n          value: \"bar\"\n        }, {\n          specified: true,\n          name: \"parsley-foo\",\n          value: \"baz\"\n        }, {\n          specified: true,\n          name: \"data-parsley-bar\",\n          value: \"[0, 42]\"\n        }, {\n          specified: false,\n          name: \"data-parsley-foo\",\n          value: \"bar\"\n        }, {\n          foo: \"bar\"\n        }]\n      };\n      var attr = Utils.attr(element, 'data-parsley-');\n      expect(attr).to.eql({\n        'foo': 'bar',\n        'bar': [0, 42]\n      });\n    });\n    it('should have a proper attr() function that rewrites a given object', () => {\n      var obj = Utils.objectCreate({\n        foo: 'x',\n        fox: 'trot'\n      });\n      obj.deleteMe = 'please';\n      var $element = $('<b data-parsley-foo=\"a\" data-parsley-bar=\"[0, 42]\" parsley-baz=\"baz\">');\n      Utils.attr($element[0], 'data-parsley-', obj);\n      expect(obj).to.eql({\n        foo: \"a\",\n        bar: [0, 42]\n      });\n      expect(obj.fox).to.eql('trot');\n    });\n    it('should have a checkAttr feature', () => {\n      var element = $('<span data-parsley-required-message=\"foo\" data-parsley-validate=\"true\">')[0];\n      expect(Utils.checkAttr(element, 'data-parsley-', 'required')).to.be(false);\n      expect(Utils.checkAttr(element, 'data-parsley-', 'required-message')).to.be(true);\n      expect(Utils.checkAttr(element, 'data-parsley-', 'validate')).to.be(true);\n    });\n    describe('namespaceEvents', () => {\n      var itMaps = (what, toWhat) => {\n        it(`maps '${what}' to ''`, () => {\n          expect(Utils.namespaceEvents(what, 'ns')).to.eql(toWhat);\n        });\n      };\n\n      itMaps('foo', 'foo.ns');\n\n      for (var evt of ['', '  ', false, null, undefined]) {\n        itMaps(evt, '');\n      }\n\n      itMaps('   foo    bar   ', 'foo.ns bar.ns');\n    });\n    describe('parse', () => {\n      describe('date', () => {\n        it('returns null for invalid dates', () => {\n          expect(Utils.parse.date('1972-13-02')).to.be.null;\n          expect(Utils.parse.date('1973-02-29')).to.be.null;\n          expect(Utils.parse.date('72-01-06')).to.be.null;\n          expect(Utils.parse.date('1972/01/06')).to.be.null;\n          expect(Utils.parse.date('1972-01-6')).to.be.null;\n          expect(Utils.parse.date('1972-1-06')).to.be.null;\n          expect(Utils.parse.date('  1972-01 -06  ')).to.be.null;\n        });\n        it('returns a date for strings of form YYYY/MM/DD', () => {\n          expect(Utils.parse.date('1972-01-06')).to.eql(new Date('1972/01/06'));\n        });\n      });\n    });\n  });\n\n  describe('Validator', () => {\n    var testParsing = function (type, input, output, extraOptions) {\n      it(`parses ${type} requirements`, () => {\n        var c = new Validator({\n          requirementType: type\n        });\n        expect(c.parseRequirements(input, extraOptions)).to.eql(output);\n      });\n    };\n\n    testParsing('integer', '42', [42]);\n    testParsing('number', '4.2', [4.2]);\n    testParsing('string', '42', ['42']);\n    testParsing(['number', 'string'], '[4.2, 4.2]', [4.2, '4.2']);\n    testParsing({\n      '': 'number',\n      'foo': 'string',\n      'bar': 'string'\n    }, '4.2', [4.2, {\n      foo: 'FOO',\n      bar: 'BAR'\n    }], value => {\n      return value.toUpperCase();\n    });\n  });\n\n  // Validation errors messages for Parsley\n  Parsley.addMessages('fr', {\n    defaultMessage: \"Cette valeur semble non valide.\",\n    type: {\n      email: \"Cette valeur n'est pas une adresse email valide.\",\n      url: \"Cette valeur n'est pas une URL valide.\",\n      number: \"Cette valeur doit être un nombre.\",\n      integer: \"Cette valeur doit être un entier.\",\n      digits: \"Cette valeur doit être numérique.\",\n      alphanum: \"Cette valeur doit être alphanumérique.\"\n    },\n    notblank: \"Cette valeur ne peut pas être vide.\",\n    required: \"Ce champ est requis.\",\n    pattern: \"Cette valeur semble non valide.\",\n    min: \"Cette valeur ne doit pas être inférieure à %s.\",\n    max: \"Cette valeur ne doit pas excéder %s.\",\n    range: \"Cette valeur doit être comprise entre %s et %s.\",\n    minlength: \"Cette chaîne est trop courte. Elle doit avoir au minimum %s caractères.\",\n    maxlength: \"Cette chaîne est trop longue. Elle doit avoir au maximum %s caractères.\",\n    length: \"Cette valeur doit contenir entre %s et %s caractères.\",\n    mincheck: \"Vous devez sélectionner au moins %s choix.\",\n    maxcheck: \"Vous devez sélectionner %s choix maximum.\",\n    check: \"Vous devez sélectionner entre %s et %s choix.\",\n    equalto: \"Cette valeur devrait être identique.\"\n  });\n  Parsley.setLocale('fr');\n\n  describe('ValidatorRegistry', () => {\n    var validatorRegistry = Parsley._validatorRegistry;\n    let instance = $('<input>').parsley();\n\n    var expectValidation = function (value, name, requirements, extra = {}) {\n      var validatorSpec = validatorRegistry.validators[name];\n      var validator = new Validator(validatorSpec);\n      var argList = validator.parseRequirements(requirements, key => {\n        return extra[key];\n      });\n      return expect(validator.validate(value, ...argList, instance));\n    };\n\n    afterEach(() => {\n      Parsley.setLocale('en');\n    });\n    it('should be a function', () => {\n      expect(ValidatorRegistry).to.be.a('function');\n    });\n    it('should bind global config validators if given in constructor', () => {\n      $.extend(true, Parsley.options, {\n        validators: {\n          foo: {\n            fn: () => {},\n            priority: 42\n          },\n          bar: {\n            fn: () => {},\n            priority: 12\n          }\n        }\n      });\n      var validator = new ValidatorRegistry(Parsley.options.validators);\n      expect(validator.validators).to.have.key('foo');\n      expect(validator.validators).to.have.key('bar');\n      expect(validatorRegistry.validators).not.to.have.key('foo');\n      delete Parsley.options.validators.foo;\n      delete Parsley.options.validators.bar;\n    });\n    it('should have a required validator', () => {\n      expectValidation('', 'required').not.to.be(true);\n      expectValidation('foo', 'required').to.be(true);\n    });\n    it('should have a notblank validator', () => {\n      expectValidation(' ', 'notblank').not.to.be(true);\n      expectValidation('foo', 'notblank').to.be(true);\n    });\n    it('should have a type=\"email\" validator', () => {\n      expectValidation('', 'type', 'email').to.be(true);\n      expectValidation('foo', 'type', 'email').not.to.be(true);\n      expectValidation('foo@bar.y', 'type', 'email').not.to.be(true);\n      expectValidation('foo@bar.y.zz', 'type', 'email').to.be(true);\n      expectValidation('foo@bar.baz', 'type', 'email').to.be(true);\n      expectValidation('foo+bar@bar.baz', 'type', 'email').to.be(true);\n      expectValidation('foo.bar@bar.baz', 'type', 'email').to.be(true);\n      expectValidation('foo.bar@bar.com.ext', 'type', 'email').to.be(true);\n      expectValidation('foo@bar..tt.com', 'type', 'email').to.be(false);\n    });\n    it('should have a type=\"date\" validator', () => {\n      expectValidation('', 'type', 'date').to.be(true);\n      expectValidation('foo', 'type', 'date').not.to.be(true);\n      expectValidation('12', 'type', 'date').not.to.be(true);\n      expectValidation('2001-01-30', 'type', 'date').to.be(true);\n      expectValidation('2001-02-30', 'type', 'date').not.to.be(true);\n      expectValidation('2001-30-01', 'type', 'date').not.to.be(true);\n    });\n    it('should have a min validator', () => {\n      expectValidation('', 'min', 6).to.be(true);\n      expectValidation('0', 'min', 6).not.to.be(true);\n      expectValidation('foo', 'min', 6).not.to.be(true);\n      expectValidation('1', 'min', 6).not.to.be(true);\n      expectValidation('6', 'min', 6).to.be(true);\n      expectValidation('10', 'min', 6).to.be(true);\n      $('body').append('<input type=\"text\" id=\"element\" value=\"7\" min=\"2\" />');\n      expect($('#element').parsley().isValid()).to.be(true);\n    });\n    it('should have a max validator', () => {\n      expectValidation('', 'max', 10).to.be(true);\n      expectValidation('0', 'max', -3).not.to.be(true);\n      expectValidation('foo', 'max', 10).not.to.be(true);\n      expectValidation('1', 'max', 10).to.be(true);\n      expectValidation('1', 'max', '10').to.be(true);\n      expectValidation('10', 'max', 10).to.be(true);\n      expectValidation('17', 'max', 10).not.to.be(true);\n      $('body').append('<input type=\"text\" id=\"element\" value=\"7\" max=\"20\" />');\n      expect($('#element').parsley().isValid()).to.be(true);\n    });\n    it('should have a range validator', () => {\n      expectValidation('1', 'range', [5, 10]).not.to.be(true);\n      expectValidation('7', 'range', [5, 10]).to.be(true);\n      expectValidation('17', 'range', [5, 10]).not.to.be(true);\n      $('body').append('<input type=\"text\" id=\"element\" value=\"7\" max=\"20\" min=\"2\" />');\n      expect($('#element').parsley().isValid()).to.be(true);\n      $('#element').remove();\n      $('body').append('<input type=\"range\" id=\"element\" value=\"7\" max=\"20\" min=\"2\" />');\n      expect($('#element').parsley().isValid()).to.be(true);\n    });\n    it('should have a type=\"number\" validator', () => {\n      expectValidation('foo', 'type', 'number').not.to.be(true);\n      expectValidation('-', 'type', 'number').not.to.be(true);\n      expectValidation('1', 'type', 'number').to.be(true);\n      expectValidation('1.5', 'type', 'number', {\n        step: 'any'\n      }).to.be(true);\n      expectValidation('-1.5', 'type', 'number', {\n        step: 'any'\n      }).to.be(true);\n      expectValidation('1500.642', 'type', 'number', {\n        step: 'any'\n      }).to.be(true);\n      expectValidation('0.5', 'type', 'number', {\n        step: 'any'\n      }).to.be(true);\n      expectValidation('.5', 'type', 'number', {\n        step: 'any'\n      }).to.be(true);\n    });\n    it('should have a type=\"digits\" validator', () => {\n      expectValidation('foo', 'type', 'digits').not.to.be(true);\n      expectValidation('1', 'type', 'digits').to.be(true);\n      expectValidation('-1', 'type', 'digits').not.to.be(true);\n      expectValidation('1.5', 'type', 'digits').not.to.be(true);\n      expectValidation('-1.5', 'type', 'digits').not.to.be(true);\n      expectValidation('1,500.642', 'type', 'digits').not.to.be(true);\n    });\n    it('should have a type=\"integer\" validator', () => {\n      expectValidation('foo', 'type', 'integer').not.to.be(true);\n      expectValidation('1', 'type', 'integer').to.be(true);\n      expectValidation('-1', 'type', 'integer').to.be(true);\n      expectValidation('1.5', 'type', 'integer').not.to.be(true);\n      expectValidation('-1.5', 'type', 'integer').not.to.be(true);\n    });\n    it('should have a type=\"alphanum\" validator', () => {\n      expectValidation('foo', 'type', 'alphanum').to.be(true);\n      expectValidation('foo bar', 'type', 'alphanum').not.to.be(true);\n      expectValidation('foo$', 'type', 'alphanum').not.to.be(true);\n      $('body').append('<input data-parsley-type=\"alphanum\" id=\"element\" value=\"v4kRRyhYvo0P\" />');\n      expect($('#element').parsley().isValid()).to.be(true);\n    });\n    it('should have a type=\"url\" validator', () => {\n      expectValidation('foo', 'type', 'url').not.to.be(true);\n      expectValidation('foo bar', 'type', 'url').not.to.be(true);\n      expectValidation('http://', 'type', 'url').not.to.be(true);\n      expectValidation('foo.bar', 'type', 'url').to.be(true);\n      expectValidation('www.foo.bar', 'type', 'url').to.be(true);\n      expectValidation('http://www.foo.bar', 'type', 'url').to.be(true);\n      expectValidation('https://www.foo.bar', 'type', 'url').to.be(true);\n      expectValidation('http://192.168.1.1/foo/bar', 'type', 'url').to.be(true);\n    });\n    it('should have a pattern validator', () => {\n      expectValidation('a', 'pattern', '[a-z]+').to.be(true);\n      expectValidation('A', 'pattern', '[a-z]+').not.to.be(true);\n      expectValidation('a', 'pattern', '/[a-z]+/').to.be(true);\n      expectValidation('A', 'pattern', '/[a-z]+/').not.to.be(true);\n      expectValidation('a', 'pattern', '/[a-z]+/i').to.be(true);\n      expectValidation('A', 'pattern', '/[a-z]+/i').to.be(true);\n    });\n    it('should have a pattern validator that behaves as the standard when not of the form /pattern/flag', () => {\n      expectValidation('aa', 'pattern', '[a-z]{1,2}').to.be(true);\n      expectValidation('aaa', 'pattern', '[a-z]{1,2}').not.to.be(true);\n      expectValidation('aa', 'pattern', '^[a-z]{2}$').to.be(true);\n    });\n    it('should have a pattern validator that extends the standard for form /pattern/flag', () => {\n      expectValidation('zAz', 'pattern', '/a/i').to.be(true);\n    });\n    it('should have a length validator', () => {\n      expectValidation('foobar', 'length', [3, 9]).to.be(true);\n      expectValidation('foo', 'length', [4, 9]).not.to.be(true);\n      expectValidation('foobarbaz', 'length', [3, 8]).not.to.be(true);\n    });\n    it('should have a minlength validator', () => {\n      expectValidation('foo', 'minlength', 3).to.be(true);\n      expectValidation('fo', 'minlength', 3).not.to.be(true);\n      $('body').append('<input type=\"text\" id=\"element\" value=\"foo\" data-parsley-minlength=\"2\" />');\n      expect($('#element').parsley().isValid()).to.be(true);\n    });\n    it('should have a maxlength validator', () => {\n      expectValidation('foo', 'maxlength', 3).to.be(true);\n      expectValidation('foobar', 'maxlength', 3).not.to.be(true);\n      $('body').append('<input type=\"text\" id=\"element\" value=\"foo\" data-parsley-maxlength=\"10\" />');\n      expect($('#element').parsley().isValid()).to.be(true);\n    });\n    it('should have a check validator', () => {\n      expectValidation(['foo', 'bar', 'baz'], 'check', [3, 5]).to.be(true);\n      expectValidation(['foo', 'bar', 'baz', 'qux', 'bux'], 'check', [3, 4]).not.to.be(true);\n      expectValidation(['foo', 'bar'], 'check', [3, 5]).not.to.be(true);\n    });\n    it('should have a mincheck validator', () => {\n      expectValidation(['foo', 'bar', 'baz'], 'mincheck', 3).to.be(true);\n      expectValidation(['foo', 'bar'], 'mincheck', 3).not.to.be(true);\n    });\n    it('should have a maxcheck validator', () => {\n      expectValidation(['foo', 'bar', 'baz'], 'maxcheck', 3).to.be(true);\n      expectValidation(['foo', 'bar', 'baz', 'qux'], 'maxcheck', 3).not.to.be(true);\n    });\n    it('should have an equalto validator', () => {\n      expectValidation('', 'equalto', 'foo').to.be(true);\n      expectValidation('bar', 'equalto', 'foo').not.to.be(true);\n      expectValidation('foo', 'equalto', 'foo').to.be(true);\n      $('body').append('<input type=\"text\" id=\"element\" data-parsley-equalto=\"#equalto\" required /><input type=\"text\" id=\"equalto\" value=\"foo\" />');\n      expect($('#element').psly().isValid()).to.be(false);\n      $('#element').val('fo');\n      expect($('#element').psly().isValid()).to.be(false);\n      $('#element').val('foo');\n      expect($('#element').psly().isValid()).to.be(true);\n      $('#equalto').remove();\n    });\n    it('should have a euvatin validator', () => {\n      expectValidation('foo', 'euvatin').not.to.be(true);\n      expectValidation('AA1', 'euvatin').not.to.be(true);\n      expectValidation('AA12', 'euvatin').to.be(true);\n      expectValidation('AA12-34', 'euvatin').to.be(true);\n      expectValidation('AA12 3X', 'euvatin').to.be(true);\n      expectValidation('AA12.3X', 'euvatin').not.to.be(true);\n    });\n    it('should handle proper error message for validators', () => {\n      expect(validatorRegistry.getErrorMessage({\n        name: 'length',\n        requirements: [3, 6]\n      })).to.be('This value length is invalid. It should be between 3 and 6 characters long.');\n      expect(validatorRegistry.getErrorMessage({\n        name: 'notexisting'\n      })).to.be('This value seems to be invalid.');\n    });\n    it('should handle proper error message for validators in various languages', () => {\n      validatorRegistry.setLocale('fr');\n      expect(validatorRegistry.getErrorMessage({\n        name: 'length',\n        requirements: [3, 6]\n      })).to.be('Cette valeur doit contenir entre 3 et 6 caractères.');\n      expect(validatorRegistry.getErrorMessage({\n        name: 'notexisting'\n      })).to.be('Cette valeur semble non valide.');\n    });\n    it('should not break for an incomplete language', () => {\n      validatorRegistry.addCatalog('klingon', {}, true);\n      expect(validatorRegistry.getErrorMessage({\n        name: 'type',\n        requirements: 'email'\n      })).to.be('This value seems to be invalid.');\n      expect(validatorRegistry.getErrorMessage({\n        name: 'length',\n        requirements: [3, 6]\n      })).to.be('This value seems to be invalid.');\n    });\n    afterEach(() => {\n      $('#element').remove();\n    });\n    it('should warn if a custom validator has a reserved name', () => {\n      $.extend(true, Parsley.options, {\n        validators: {\n          excluded: {\n            fn: () => {},\n            priority: 42\n          }\n        }\n      });\n      expectWarning(() => {\n        var validatorRegistry = new ValidatorRegistry(Parsley.options.validators);\n      });\n      delete Parsley.options.validators.excluded;\n    });\n    it('should warn when adding an already defined validator', () => {\n      validatorRegistry.addValidator('foo', $.noop);\n      expectWarning(() => {\n        validatorRegistry.addValidator('foo', $.noop);\n      });\n      validatorRegistry.removeValidator('foo');\n    });\n    it('should warn when updating or deleting a custom validator not already defined', () => {\n      expectWarning(() => {\n        validatorRegistry.updateValidator('foo', () => {});\n      });\n      validatorRegistry.removeValidator('foo');\n    });\n    it('should warn when updating or deleting a custom validator not already defined', () => {\n      expectWarning(() => {\n        validatorRegistry.removeValidator('foo');\n      });\n    });\n    it('should provide deprecated access through Validator for compatibility', () => {\n      window.Parsley.formatMessage('foo', 'bar');\n      expectWarning(() => {\n        window.ParsleyValidator.formatMessage('foo', 'bar');\n      });\n    });\n    it('should provide two ways to add error messages', () => {\n      window.Parsley.addValidator('testMessage', {\n        validateString: $.noop,\n        messages: {\n          en: 'Not good at all',\n          fr: 'Très nul'\n        }\n      });\n      window.Parsley.addMessage('es', 'testMessage', 'Muy malo');\n      expect(window.Parsley.getErrorMessage({\n        name: 'testMessage'\n      })).to.eql('Not good at all');\n      window.Parsley.setLocale('fr');\n      expect(window.Parsley.getErrorMessage({\n        name: 'testMessage'\n      })).to.eql('Très nul');\n      window.Parsley.setLocale('es');\n      expect(window.Parsley.getErrorMessage({\n        name: 'testMessage'\n      })).to.eql('Muy malo');\n      window.Parsley.setLocale('en');\n    });\n    it('can return the existence of a validator', () => {\n      expect(window.Parsley.hasValidator('required')).to.be(true);\n      expect(window.Parsley.hasValidator('deriuqer')).to.be(false);\n    });\n  });\n\n})));\n//# sourceMappingURL=spec-build.js.map\n"
  },
  {
    "path": "doc/download.html",
    "content": "\n<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Parsley, the ultimate frontend javascript form validation library\">\n    <meta name=\"author\" content=\"Guillaume Potier\">\n\n    <title>Parsley - Download the pieces</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../bower_components/bootstrap/dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"assets/docs.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js\"></script>\n      <script src=\"https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js\"></script>\n    <![endif]-->\n    <style>\n      body {\n        color: #111111;\n      }\n      h2 {\n        color: #FF851B;\n      }\n    </style>\n  </head>\n\n  <body>\n    <div class=\"container\">\n\n      <div class=\"masthead\">\n        <div class=\"header\">\n          <h3 class=\"text-muted\"><a href=\"../\">Parsley</a></h3>\n\n          <span class=\"social-buttons inline-block\">\n            <a href=\"https://twitter.com/share\" class=\"twitter-share-button\" data-url=\"http://parsleyjs.org\" data-text=\"Parsley, the ultimate javascript form validation library. #parsleyjs\" data-via=\"guillaumepotier\" data-related=\"guillaumepotier\" data-hashtags=\"parsleyjs\">Tweet</a>\n            <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>\n\n            <iframe src=\"http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=watch&count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"110\" height=\"20\"></iframe>\n\n            <iframe src=\"http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=fork&count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"110\" height=\"20\"></iframe>\n          </span>\n\n        </div>\n\n        <ul class=\"nav nav-justified\">\n          <li><a href=\"../\">Home</a></li>\n          <li><a href=\"examples.html\">Examples</a></li>\n          <li><a href=\"index.html\">Documentation</a></li>\n          <li class=\"active\"><a href=\"download.html\">Download</a></li>\n          <li><a href=\"help.html\">Help</a></li>\n          <li><a href=\"annotated-source/main.html\">Annotated&nbsp;source</a></li>\n          <li><a href=\"tests.html\">Tests</a></li>\n          <li><a href=\"about.html\">About</a></li>\n        </ul>\n      </div>\n\n      <!-- Jumbotron -->\n      <div class=\"jumbotron\">\n        <h1>Download <em>Parsley</em> <small class=\"parsley-version\">v2.9.2</small></h1>\n          <hr>\n          <div class=\"col-md-12\"><h2>Whole project..</h2></div>\n\n          <div class=\"col-md-12\"><code>$ bower install --save parsleyjs</code></div>\n          <div class=\"col-md-12\"><code>$ npm install --save parsleyjs</code></div>\n          <div class=\"col-md-12\"><a href=\"https://github.com/guillaumepotier/Parsley.js/releases/tag/2.9.2\" class=\"download\" data-version=\"zipball\" target=\"_blank\">parsley.zip</a> <small>250ko</small></div>\n\n          <div class=\"col-md-12\"><h2>..or pick & go!</h2></div>\n\n          <div class=\"col-md-6\"><a href=\"../dist/parsley.js\" class=\"download\" data-version=\"parsley.js\" target=\"_blank\">parsley.js</a> <small>21kb gz</small></div>\n          <div class=\"col-md-6\"><a href=\"../dist/parsley.min.js\" class=\"download\" data-version=\"parsley.min.js\" target=\"_blank\">parsley.min.js</a> <small>11kb gz</small></div>\n\n          <div class=\"col-md-12\"><a href=\"https://github.com/guillaumepotier/Parsley.js/releases\" class=\"download\" data-version=\"previous\" target=\"_blank\">Previous versions</a></div>\n      </div>\n\n      <div class=\"clearfix\"></div>\n\n      <!-- Site footer -->\n      <div class=\"footer\">\n        <p>&copy; <a href=\"https://twitter.com/guillaumepotier\" title=\"Guillaume Potier on Twitter\">Guillaume Potier</a> 2014 - <a href=\"http://wisembly.com\">@Wisembly</a></p>\n      </div>\n    </div>\n\n    <script src=\"../bower_components/jquery/dist/jquery.min.js\"></script>\n    <script>\n      $(document).ready(function () {\n        $('.download').on('click', function (event) {\n          _gaq.push(['_trackEvent','download', 'download ' + $(this).data('version'), $(this).data('version')]);\n          _gaq.push(['_trackPageview','/download/' + $(this).data('version')]);\n        });\n      });\n    </script>\n    <script>\n      var _gaq = _gaq || [];\n      _gaq.push(['_setAccount', 'UA-37229467-1']);\n      _gaq.push(['_trackPageview']);\n\n      (function() {\n        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;\n        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';\n        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);\n      })();\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "doc/examples/ajax.html",
    "content": "\n<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Parsley, the ultimate frontend javascript form validation library\">\n    <meta name=\"author\" content=\"Guillaume Potier\">\n\n    <title>Parsley - Examples | Custom validator</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../../bower_components/bootstrap/dist/css/bootstrap.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"../assets/docs.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js\"></script>\n      <script src=\"https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js\"></script>\n    <![endif]-->\n\n    <link href=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/7.3/styles/github.min.css\" rel=\"stylesheet\">\n\n    <link href=\"../../src/parsley.css\" rel=\"stylesheet\">\n    <style class=\"example\">\nfieldset {\n  border: 1px solid #ddd;\n  padding-left: 8px;\n}\nfieldset.parsley-success {\n  border-color: #468847;\n  background-color: #DFF0D8;\n}\nfieldset.parsley-error {\n  border-color: #B94A48;\n  background-color: #F2DEDE;\n}\n.error {\n  color: #B94A48\n}\n    </style>\n  </head>\n\n  <body class=\"examples\">\n\n    <div class=\"container\">\n\n      <div class=\"masthead\">\n        <div class=\"header\">\n          <h3 class=\"text-muted\"><a href=\"../../\">Parsley</a></h3>\n\n          <span class=\"social-buttons inline-block\">\n            <a href=\"https://twitter.com/share\" class=\"twitter-share-button\" data-url=\"http://parsleyjs.org\" data-text=\"Parsley, the ultimate javascript form validation library. #parsleyjs\" data-via=\"guillaumepotier\" data-related=\"guillaumepotier\" data-hashtags=\"parsleyjs\">Tweet</a>\n            <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>\n\n            <iframe src=\"http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=watch&count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"110\" height=\"20\"></iframe>\n\n            <iframe src=\"http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=fork&count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"110\" height=\"20\"></iframe>\n          </span>\n        </div>\n      </div>\n\n      <ul class=\"nav nav-justified\">\n        <li><a href=\"../../\">Home</a></li>\n        <li class=\"active\"><a href=\"../examples.html\">Examples</a></li>\n        <li><a href=\"../index.html\">Documentation</a></li>\n        <li><a href=\"../download.html\">Download</a></li>\n        <li><a href=\"../help.html\">Help</a></li>\n        <li><a href=\"../annotated-source/main.html\">Annotated&nbsp;source</a></li>\n        <li><a href=\"../tests.html\">Tests</a></li>\n      </ul>\n\n      <div class=\"row\">\n\n      <!-- ###################### BEGINNING OF EXAMPLE ######################-->\n\n        <div class=\"col-md-4\">\n          <h2>Craft your own validators demo</h2>\n          <small class=\"pull-left\"><a href=\"../examples.html\">&lt;&lt; Back to examples</a>\n          — <a href=\"#\" class=\"play\">Try it on CodePen</a>\n          </small>\n          <span class=\"clearfix\"></span>\n\n          <hr>\n          <div class=\"form-group example\">\n<h1>Custom validators</h1>\n<h3>Simple ajax request</h3>\n<form data-parsley-validate>\n  <label for=\"zip\">US Zip Code * :</label>\n  <input name=\"zip\" required data-parsley-type=\"digits\"\n         data-parsley-length=\"[5,5]\"\n         data-parsley-zip=\"us\">\n  <br>\n  <input type=\"submit\" value=\"validate\">\n\n  <p><small>* This checks the actual existence of a zip code using ajax (e.g.: 00001 is not an actual US Zip code).</small></p>\n</form>\n\n<h3>Complex ajax handling</h3>\n<form class=\"complex\">\n  <fieldset data-parsley-state-and-zip=\"us\" data-parsley-validate-if-empty data-parsley-errors-container=\".error\">\n    <h4>Location</h4><span class=\"error\"></span>\n    <label for=\"state\">US State:</label>\n    <select name=\"state\" required>\n      <option value=\"\" disabled selected hidden>Select a US State...</option>\n      <option value=\"AL\">Alabama</option><option value=\"AK\">Alaska</option><option value=\"AZ\">Arizona</option><option value=\"AR\">Arkansas</option><option value=\"CA\">California</option><option value=\"CO\">Colorado</option><option value=\"CT\">Connecticut</option><option value=\"DE\">Delaware</option><option value=\"DC\">District Of Columbia</option><option value=\"FL\">Florida</option><option value=\"GA\">Georgia</option><option value=\"HI\">Hawaii</option><option value=\"ID\">Idaho</option><option value=\"IL\">Illinois</option><option value=\"IN\">Indiana</option><option value=\"IA\">Iowa</option><option value=\"KS\">Kansas</option><option value=\"KY\">Kentucky</option><option value=\"LA\">Louisiana</option><option value=\"ME\">Maine</option><option value=\"MD\">Maryland</option><option value=\"MA\">Massachusetts</option><option value=\"MI\">Michigan</option><option value=\"MN\">Minnesota</option><option value=\"MS\">Mississippi</option><option value=\"MO\">Missouri</option><option value=\"MT\">Montana</option><option value=\"NE\">Nebraska</option><option value=\"NV\">Nevada</option><option value=\"NH\">New Hampshire</option><option value=\"NJ\">New Jersey</option><option value=\"NM\">New Mexico</option><option value=\"NY\">New York</option><option value=\"NC\">North Carolina</option><option value=\"ND\">North Dakota</option><option value=\"OH\">Ohio</option><option value=\"OK\">Oklahoma</option><option value=\"OR\">Oregon</option><option value=\"PA\">Pennsylvania</option><option value=\"RI\">Rhode Island</option><option value=\"SC\">South Carolina</option><option value=\"SD\">South Dakota</option><option value=\"TN\">Tennessee</option><option value=\"TX\">Texas</option><option value=\"UT\">Utah</option><option value=\"VT\">Vermont</option><option value=\"VA\">Virginia</option><option value=\"WA\">Washington</option><option value=\"WV\">West Virginia</option><option value=\"WI\">Wisconsin</option><option value=\"WY\">Wyoming</option>\n    </select>\n    <br>\n    <label for=\"state\">Zip:</label>\n    <input name=\"zip\" required data-parsley-type=\"digits\"\n           data-parsley-length=\"[5,5]\"\n           data-parsley-zip=\"us\">\n  </fieldset>\n  <br>\n  <input type=\"submit\" value=\"validate\">\n\n  <p><small>* A complete example showing Ajax, promise chaining, dynamic custom error message, interdependent fields.</small></p>\n</form>\n\n          </div>\n        </div>\n        <div class=\"col-md-8\">\n          <div class=\"code-block\">\n<pre><code class=\"example\"></code></pre>\n          </div>\n        </div>\n      </div>\n\n      <!-- ###################### END OF EXAMPLE ######################-->\n\n      <!-- Site footer -->\n      <div class=\"footer\">\n        <p>&copy; <a href=\"https://twitter.com/malafortune\" title=\"Marc-André Lafortune on Twitter\">Marc-André Lafortune</a> 2017</p>\n      </div>\n    </div>\n\n    <script src=\"../../bower_components/jquery/dist/jquery.min.js\"></script>\n    <script src=\"../../bower_components/bootstrap/js/affix.js\"></script>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/7.3/highlight.min.js\"></script>\n\n    <script src=\"../../dist/parsley.js\"></script>\n\n    <script class=\"example\">\nParsley.addValidator('zip', {\n  validateString: function(value, country) {\n    // Zippopotam.us returns a status 404 for incorrect zip codes,\n    // so we simply return the ajax request:\n    return $.ajax('//www.zippopotam.us/' + country + '/' + value)\n  },\n  messages: {en: 'There is no such zip for the country \"%s\"'}\n});\nParsley.addValidator('stateAndZip', {\n  validateString: function(_ignoreValue, country, instance) {\n    var state = instance.$element.find('[name=\"state\"]').val();\n    var zip = instance.$element.find('[name=\"zip\"]').val();\n    var xhr = $.ajax('//www.zippopotam.us/' + country + '/' + zip)\n    // When Zippopotam.us returns the info of the given zip, check it:\n    return xhr.then(function(json) {\n      var actualState = json.places[0]['state abbreviation'];\n      if (actualState !== state) {\n        // We could return `false`, but for an even better result\n        // we can fail the promise with a custom error message:\n        return $.Deferred().reject(\"The zip code \" + zip + \" is in \" + actualState + \", not in \" + state);\n        // Note: in jQuery 3.0+, you can `throw('my custom error')` for the same result\n      }\n    })\n  },\n  // The following error message will still show if the xhr itself fails\n  // (404 because zip does not exist, network error, etc.)\n  messages: {en: 'There is no such zip for the country \"%s\"'}\n});\n$(function() {\n  $('.complex').parsley({\n    inputs: Parsley.options.inputs + ',fieldset'\n  })\n});\nParsley.on('form:submit', function() {\n  return false; // Don't submit form for this demo\n});\n    </script>\n    <script src=\"../assets/example.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "doc/examples/custom-validator-events.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Parsley, the ultimate frontend javascript form validation library\">\n    <meta name=\"author\" content=\"Guillaume Potier\">\n\n    <title>Parsley - Examples | Validators</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../../bower_components/bootstrap/dist/css/bootstrap.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"../assets/docs.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js\"></script>\n      <script src=\"https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js\"></script>\n    <![endif]-->\n\n    <link href=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/7.3/styles/github.min.css\" rel=\"stylesheet\">\n\n    <link href=\"../../src/parsley.css\" rel=\"stylesheet\">\n    <style class=\"example\">\n  .first {\n    padding-left: 15px;\n    border-left: 2px solid #FF851B;\n  }\n  .second {\n    padding-left: 15px;\n    border-left: 2px solid #5bc0de;\n  }\n  .validate {\n    margin-top: 10px;\n  }\n  h4 {\n    margin-bottom: 10px;\n  }\n  .invalid-form-error-message {\n    margin-top: 10px;\n    padding: 5px;\n  }\n  .invalid-form-error-message.filled {\n    border-left: 2px solid red;\n  }\n</style>\n  </head>\n\n  <body class=\"examples\">\n\n    <div class=\"container\">\n\n      <div class=\"masthead\">\n        <div class=\"header\">\n          <h3 class=\"text-muted\"><a href=\"../../\">Parsley</a></h3>\n\n          <span class=\"social-buttons inline-block\">\n            <a href=\"https://twitter.com/share\" class=\"twitter-share-button\" data-url=\"http://parsleyjs.org\" data-text=\"Parsley, the ultimate javascript form validation library. #parsleyjs\" data-via=\"guillaumepotier\" data-related=\"guillaumepotier\" data-hashtags=\"parsleyjs\">Tweet</a>\n            <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>\n\n            <iframe src=\"http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=watch&count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"110\" height=\"20\"></iframe>\n\n            <iframe src=\"http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=fork&count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"110\" height=\"20\"></iframe>\n          </span>\n        </div>\n      </div>\n\n      <ul class=\"nav nav-justified\">\n        <li><a href=\"../../\">Home</a></li>\n        <li class=\"active\"><a href=\"../examples.html\">Examples</a></li>\n        <li><a href=\"../index.html\">Documentation</a></li>\n        <li><a href=\"../download.html\">Download</a></li>\n        <li><a href=\"../help.html\">Help</a></li>\n        <li><a href=\"../annotated-source/main.html\">Annotated&nbsp;source</a></li>\n        <li><a href=\"../tests.html\">Tests</a></li>\n      </ul>\n\n      <div class=\"row\">\n\n      <!-- ###################### BEGINNING OF EXAMPLE ######################-->\n\n        <div class=\"col-md-4\">\n          <h2>Parsley Validator Demo</h2>\n          <small class=\"pull-left\"><a href=\"../examples.html\">&lt;&lt; Back to examples</a>\n          — <a href=\"#\" class=\"play\">Try it on CodePen</a>\n          </small>\n          <span class=\"clearfix\"></span>\n\n          <hr>\n          <div class=\"form-group example\">\n<h4>Correctly fill at least one of these blocks</h4>\n<form class=\"demo-form\">\n  <div data-parsley-check-children=\"2\" data-parsley-validate-if-empty>\n    <div class=\"first\">\n      <label for=\"firstname\">Firstname:</label>\n      <input type=\"text\" class=\"form-control\" name=\"firstname\" data-parsley-length=\"[4, 20]\" data-parsley-group=\"block-1\" />\n\n      <label for=\"lastname\">Lastname:</label>\n      <input type=\"text\" class=\"form-control\" name=\"lastname\" data-parsley-length=\"[4, 20]\" data-parsley-group=\"block-1\" />\n    </div>\n\n    <hr>\n\n    <div class=\"second\">\n      <label for=\"fullname\">Fullname:</label>\n      <input type=\"text\" class=\"form-control\" name=\"fullname\" data-parsley-length=\"[8, 40]\" data-parsley-group=\"block-2\" />\n    </div>\n  </div>\n  <input type=\"submit\" class=\"btn btn-default validate\" />\n</form>\n          </div>\n          <div class=\"explanation\">\n            <p>This example uses a trick. It uses a <code>&lt;div&gt;</code> tag like if it was an input. That input uses a custom validator that succeeds only if one of the groups (here <code>\"block-1\"</code> and <code>\"block-2\"</code>) validate with the <code>force</code> option set.\n            </p>\n            <p>Note that the <code>&lt;div&gt;</code> contains the fields in question. This way, events like <code>change</code> or <code>input</code> generated when the user fills in these fields will bubble up to the div and revalidate the custom field.\n            </p>\n          </div>\n        </div>\n        <div class=\"col-md-8\">\n          <div class=\"code-block\">\n            <pre><code class=\"example\">\n            </code></pre>\n          </div>\n        </div>\n      </div>\n\n      <!-- ###################### END OF EXAMPLE ######################-->\n\n      <!-- Site footer -->\n      <div class=\"footer\">\n        <p>&copy; <a href=\"https://twitter.com/guillaumepotier\" title=\"Guillaume Potier on Twitter\">Guillaume Potier</a> 2014 - <a href=\"http://wisembly.com\">@Wisembly</a></p>\n      </div>\n    </div>\n\n    <script src=\"../../bower_components/jquery/dist/jquery.min.js\"></script>\n    <script src=\"../../bower_components/bootstrap/js/affix.js\"></script>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/7.3/highlight.min.js\"></script>\n\n    <script src=\"../../dist/parsley.js\"></script>\n    <script class=\"example\">\n$(function () {\n  Parsley.addValidator('checkChildren', {\n    messages: {en: 'You must correctly fill at least one of these blocks!'},\n    requirementType: 'integer',\n    validate: function(_value, requirement, instance) {\n      for(var i = 1; i <= requirement; i++)\n        if (instance.parent.isValid({group: 'block-' + i, force: true}))\n          return true; // One section is filled, this check is valid\n      return false; // No section is filled, this validation fails\n    }\n  });\n\n  Parsley.on('form:submit', function() {\n    alert(\"The form would be submitted at this point. \" +\n      \"For this demo, we interrupt the processing.\");\n    return false; // Don't submit for this demo\n  });\n\n  $('.demo-form').parsley({\n    inputs: Parsley.options.inputs + ',[data-parsley-check-children]'\n  });\n});\n    </script>\n    <script src=\"../assets/example.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "doc/examples/customvalidator.html",
    "content": "\n<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Parsley, the ultimate frontend javascript form validation library\">\n    <meta name=\"author\" content=\"Guillaume Potier\">\n\n    <title>Parsley - Examples | Custom validator</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../../bower_components/bootstrap/dist/css/bootstrap.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"../assets/docs.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js\"></script>\n      <script src=\"https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js\"></script>\n    <![endif]-->\n\n    <link href=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/7.3/styles/github.min.css\" rel=\"stylesheet\">\n\n    <link href=\"../../src/parsley.css\" rel=\"stylesheet\">\n  </head>\n\n  <body class=\"examples\">\n\n    <div class=\"container\">\n\n      <div class=\"masthead\">\n        <div class=\"header\">\n          <h3 class=\"text-muted\"><a href=\"../../\">Parsley</a></h3>\n\n          <span class=\"social-buttons inline-block\">\n            <a href=\"https://twitter.com/share\" class=\"twitter-share-button\" data-url=\"http://parsleyjs.org\" data-text=\"Parsley, the ultimate javascript form validation library. #parsleyjs\" data-via=\"guillaumepotier\" data-related=\"guillaumepotier\" data-hashtags=\"parsleyjs\">Tweet</a>\n            <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>\n\n            <iframe src=\"http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=watch&count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"110\" height=\"20\"></iframe>\n\n            <iframe src=\"http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=fork&count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"110\" height=\"20\"></iframe>\n          </span>\n        </div>\n      </div>\n\n      <ul class=\"nav nav-justified\">\n        <li><a href=\"../../\">Home</a></li>\n        <li class=\"active\"><a href=\"../examples.html\">Examples</a></li>\n        <li><a href=\"../index.html\">Documentation</a></li>\n        <li><a href=\"../download.html\">Download</a></li>\n        <li><a href=\"../help.html\">Help</a></li>\n        <li><a href=\"../annotated-source/main.html\">Annotated&nbsp;source</a></li>\n        <li><a href=\"../tests.html\">Tests</a></li>\n      </ul>\n\n      <div class=\"row\">\n\n      <!-- ###################### BEGINNING OF EXAMPLE ######################-->\n\n        <div class=\"col-md-4\">\n          <h2>Craft your own validators demo</h2>\n          <small class=\"pull-left\"><a href=\"../examples.html\">&lt;&lt; Back to examples</a>\n          — <a href=\"#\" class=\"play\">Try it on CodePen</a>\n          </small>\n          <span class=\"clearfix\"></span>\n\n          <hr>\n          <div class=\"form-group example\">\n<form id=\"demo-form\" data-parsley-validate>\n  <label for=\"question\">Please enter a palindrome:</label>\n  <input type=\"text\" class=\"form-control\" name=\"s\" required data-parsley-palindrome>\n\n  <label for=\"question\">Please enter a multiple of 3:</label>\n  <input type=\"text\" class=\"form-control\" name=\"nb\" required data-parsley-multiple-of=\"3\">\n\n  <label for=\"question\">Please provide a file smaller than 42Kb:</label>\n  <input type=\"file\" name=\"f\" required data-parsley-max-file-size=\"42\">\n\n  <input type=\"submit\" class=\"btn btn-default pull-right\" />\n</form>\n          </div>\n        </div>\n        <div class=\"col-md-8\">\n          <div class=\"code-block\">\n<pre><code class=\"example\"></code></pre>\n          </div>\n        </div>\n      </div>\n\n      <!-- ###################### END OF EXAMPLE ######################-->\n\n      <!-- Site footer -->\n      <div class=\"footer\">\n        <p>&copy; <a href=\"https://twitter.com/guillaumepotier\" title=\"Guillaume Potier on Twitter\">Guillaume Potier</a> 2014 - <a href=\"http://wisembly.com\">@Wisembly</a></p>\n      </div>\n    </div>\n\n    <script src=\"../../bower_components/jquery/dist/jquery.min.js\"></script>\n    <script src=\"../../bower_components/bootstrap/js/affix.js\"></script>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/7.3/highlight.min.js\"></script>\n\n    <script src=\"../../dist/parsley.js\"></script>\n\n    <script class=\"example\">\nwindow.Parsley.addValidator('palindrome', {\n  validateString: function(value) {\n    return value.split('').reverse().join('') === value;\n  },\n  messages: {\n    en: 'This string is not the reverse of itself',\n    fr: \"Cette valeur n'est pas l'inverse d'elle même.\"\n  }\n});\n\nwindow.Parsley.addValidator('multipleOf', {\n  validateNumber: function(value, requirement) {\n    return value % requirement === 0;\n  },\n  requirementType: 'integer',\n  messages: {\n    en: 'This value should be a multiple of %s.',\n    fr: \"Ce nombre n'est pas un multiple de %s.\"\n  }\n});\n\nwindow.Parsley.addValidator('maxFileSize', {\n  validateString: function(_value, maxSize, parsleyInstance) {\n    if (!window.FormData) {\n      alert('You are making all developpers in the world cringe. Upgrade your browser!');\n      return true;\n    }\n    var files = parsleyInstance.$element[0].files;\n    return files.length != 1  || files[0].size <= maxSize * 1024;\n  },\n  requirementType: 'integer',\n  messages: {\n    en: 'This file should not be larger than %s Kb',\n    fr: 'Ce fichier est plus grand que %s Kb.'\n  }\n});\n\n    </script>\n    <script src=\"../assets/example.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "doc/examples/events.html",
    "content": "\n<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Parsley, the ultimate frontend javascript form validation library\">\n    <meta name=\"author\" content=\"Guillaume Potier\">\n\n    <title>Parsley - Examples | Events</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../../bower_components/bootstrap/dist/css/bootstrap.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"../assets/docs.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js\"></script>\n      <script src=\"https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js\"></script>\n    <![endif]-->\n\n    <link href=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/7.3/styles/github.min.css\" rel=\"stylesheet\">\n\n    <link href=\"../../src/parsley.css\" rel=\"stylesheet\">\n    <style class=\"example\">\n  .first {\n    padding-left: 15px;\n    border-left: 2px solid #FF851B;\n  }\n  .second {\n    padding-left: 15px;\n    border-left: 2px solid #5bc0de;\n  }\n  .validate {\n    margin-top: 10px;\n  }\n  h4 {\n    margin-bottom: 10px;\n  }\n  .invalid-form-error-message {\n    margin-top: 10px;\n    padding: 5px;\n  }\n  .invalid-form-error-message.filled {\n    border-left: 2px solid red;\n  }\n</style>\n  </head>\n\n  <body class=\"examples\">\n\n    <div class=\"container\">\n\n      <div class=\"masthead\">\n        <div class=\"header\">\n          <h3 class=\"text-muted\"><a href=\"../../\">Parsley</a></h3>\n\n          <span class=\"social-buttons inline-block\">\n            <a href=\"https://twitter.com/share\" class=\"twitter-share-button\" data-url=\"http://parsleyjs.org\" data-text=\"Parsley, the ultimate javascript form validation library. #parsleyjs\" data-via=\"guillaumepotier\" data-related=\"guillaumepotier\" data-hashtags=\"parsleyjs\">Tweet</a>\n            <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>\n\n            <iframe src=\"http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=watch&count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"110\" height=\"20\"></iframe>\n\n            <iframe src=\"http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=fork&count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"110\" height=\"20\"></iframe>\n          </span>\n        </div>\n      </div>\n\n      <ul class=\"nav nav-justified\">\n        <li><a href=\"../../\">Home</a></li>\n        <li class=\"active\"><a href=\"../examples.html\">Examples</a></li>\n        <li><a href=\"../index.html\">Documentation</a></li>\n        <li><a href=\"../download.html\">Download</a></li>\n        <li><a href=\"../help.html\">Help</a></li>\n        <li><a href=\"../annotated-source/main.html\">Annotated&nbsp;source</a></li>\n        <li><a href=\"../tests.html\">Tests</a></li>\n      </ul>\n\n      <div class=\"row\">\n\n      <!-- ###################### BEGINNING OF EXAMPLE ######################-->\n\n        <div class=\"col-md-4\">\n          <h2>Parsley Events Demo</h2>\n          <small class=\"pull-left\"><a href=\"../examples.html\">&lt;&lt; Back to examples</a>\n          — <a href=\"#\" class=\"play\">Try it on CodePen</a>\n          </small>\n          <span class=\"clearfix\"></span>\n\n          <hr>\n          <div class=\"form-group example\">\n<h4>Correctly fill at least one of these blocks</h4>\n<form class=\"demo-form\" data-parsley-validate>\n  <div class=\"first\">\n    <label for=\"firstname\">Firstname:</label>\n    <input type=\"text\" class=\"form-control\" name=\"firstname\" data-parsley-length=\"[4, 20]\" data-parsley-group=\"block1\" />\n\n    <label for=\"lastname\">Lastname:</label>\n    <input type=\"text\" class=\"form-control\" name=\"lastname\" data-parsley-length=\"[4, 20]\" data-parsley-group=\"block1\" />\n  </div>\n  <hr>\n  <div class=\"second\">\n    <label for=\"fullname\">Fullname:</label>\n    <input type=\"text\" class=\"form-control\" name=\"fullname\" data-parsley-length=\"[8, 40]\" data-parsley-group=\"block2\" />\n  </div>\n\n  <div class=\"invalid-form-error-message\"></div>\n  <input type=\"submit\" class=\"btn btn-default validate\" />\n</form>\n          </div>\n        </div>\n        <div class=\"col-md-8\">\n          <div class=\"code-block\">\n            <pre><code class=\"example\">\n            </code></pre>\n          </div>\n        </div>\n      </div>\n\n      <!-- ###################### END OF EXAMPLE ######################-->\n\n      <!-- Site footer -->\n      <div class=\"footer\">\n        <p>&copy; <a href=\"https://twitter.com/guillaumepotier\" title=\"Guillaume Potier on Twitter\">Guillaume Potier</a> 2014 - <a href=\"http://wisembly.com\">@Wisembly</a></p>\n      </div>\n    </div>\n\n    <script src=\"../../bower_components/jquery/dist/jquery.min.js\"></script>\n    <script src=\"../../bower_components/bootstrap/js/affix.js\"></script>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/7.3/highlight.min.js\"></script>\n\n    <script src=\"../../dist/parsley.js\"></script>\n    <script class=\"example\">\n$(function () {\n  $('.demo-form').parsley().on('form:validate', function (formInstance) {\n    var ok = formInstance.isValid({group: 'block1', force: true}) || formInstance.isValid({group: 'block2', force: true});\n    $('.invalid-form-error-message')\n      .html(ok ? '' : 'You must correctly fill *at least one of these two blocks!')\n      .toggleClass('filled', !ok);\n    if (!ok)\n      formInstance.validationResult = false;\n  });\n});\n    </script>\n    <script src=\"../assets/example.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "doc/examples/multisteps.html",
    "content": "\n<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Parsley, the ultimate frontend javascript form validation library\">\n    <meta name=\"author\" content=\"Guillaume Potier\">\n\n    <title>Parsley - Examples | Multi steps form</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../../bower_components/bootstrap/dist/css/bootstrap.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"../assets/docs.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js\"></script>\n      <script src=\"https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js\"></script>\n    <![endif]-->\n\n    <link href=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/7.3/styles/github.min.css\" rel=\"stylesheet\">\n\n    <link href=\"../../src/parsley.css\" rel=\"stylesheet\">\n    <style class=\"example\">\n.form-section {\n  padding-left: 15px;\n  border-left: 2px solid #FF851B;\n  display: none;\n}\n.form-section.current {\n  display: inherit;\n}\n.btn-info, .btn-default {\n  margin-top: 10px;\n}\n    </style>\n  </head>\n\n  <body class=\"examples\">\n\n    <div class=\"container\">\n\n      <div class=\"masthead\">\n        <div class=\"header\">\n          <h3 class=\"text-muted\"><a href=\"../../\">Parsley</a></h3>\n\n          <span class=\"social-buttons inline-block\">\n            <a href=\"https://twitter.com/share\" class=\"twitter-share-button\" data-url=\"http://parsleyjs.org\" data-text=\"Parsley, the ultimate javascript form validation library. #parsleyjs\" data-via=\"guillaumepotier\" data-related=\"guillaumepotier\" data-hashtags=\"parsleyjs\">Tweet</a>\n            <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>\n\n            <iframe src=\"http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=watch&count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"110\" height=\"20\"></iframe>\n\n            <iframe src=\"http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=fork&count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"110\" height=\"20\"></iframe>\n          </span>\n        </div>\n      </div>\n\n      <ul class=\"nav nav-justified\">\n        <li><a href=\"../../\">Home</a></li>\n        <li class=\"active\"><a href=\"../examples.html\">Examples</a></li>\n        <li><a href=\"../index.html\">Documentation</a></li>\n        <li><a href=\"../download.html\">Download</a></li>\n        <li><a href=\"../help.html\">Help</a></li>\n        <li><a href=\"../annotated-source/main.html\">Annotated&nbsp;source</a></li>\n        <li><a href=\"../tests.html\">Tests</a></li>\n      </ul>\n\n      <div class=\"row\">\n\n      <!-- ###################### BEGINNING OF EXAMPLE ######################-->\n\n        <div class=\"col-md-4\">\n          <h2>Multi steps form demo</h2>\n          <small class=\"pull-left\"><a href=\"../examples.html\">&lt;&lt; Back to examples</a>\n          — <a href=\"#\" class=\"play\">Try it on CodePen</a>\n          </small>\n          <span class=\"clearfix\"></span>\n\n          <hr>\n          <div class=\"form-group example\">\n<form class=\"demo-form\">\n  <div class=\"form-section\">\n    <label for=\"firstname\">First Name:</label>\n    <input type=\"text\" class=\"form-control\" name=\"firstname\" required />\n\n    <label for=\"lastname\">Last Name:</label>\n    <input type=\"text\" class=\"form-control\" name=\"lastname\" required />\n  </div>\n\n  <div class=\"form-section\">\n    <label for=\"email\">Email:</label>\n    <input type=\"email\" class=\"form-control\" name=\"email\" required />\n  </div>\n\n  <div class=\"form-section\">\n    <label for=\"color\">Favorite color:</label>\n    <input type=\"text\" class=\"form-control\" name=\"color\" required />\n  </div>\n\n  <div class=\"form-navigation\">\n    <button type=\"button\" class=\"previous btn btn-info pull-left\">&lt; Previous</button>\n    <button type=\"button\" class=\"next btn btn-info pull-right\">Next &gt;</button>\n    <input type=\"submit\" class=\"btn btn-default pull-right\" />\n    <span class=\"clearfix\"></span>\n  </div>\n\n</form>\n          </div>\n        </div>\n        <div class=\"col-md-8\">\n          <div class=\"code-block\">\n<pre><code class=\"example\"></code></pre>\n          </div>\n        </div>\n      </div>\n\n      <!-- ###################### END OF EXAMPLE ######################-->\n\n      <!-- Site footer -->\n      <div class=\"footer\">\n        <p>&copy; <a href=\"https://twitter.com/guillaumepotier\" title=\"Guillaume Potier on Twitter\">Guillaume Potier</a> 2014 - <a href=\"http://wisembly.com\">@Wisembly</a></p>\n      </div>\n    </div>\n\n    <script src=\"../../bower_components/jquery/dist/jquery.min.js\"></script>\n    <script src=\"../../bower_components/bootstrap/js/affix.js\"></script>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/7.3/highlight.min.js\"></script>\n\n    <script src=\"../../dist/parsley.js\"></script>\n    <script class=\"example\">\n$(function () {\n  var $sections = $('.form-section');\n\n  function navigateTo(index) {\n    // Mark the current section with the class 'current'\n    $sections\n      .removeClass('current')\n      .eq(index)\n        .addClass('current');\n    // Show only the navigation buttons that make sense for the current section:\n    $('.form-navigation .previous').toggle(index > 0);\n    var atTheEnd = index >= $sections.length - 1;\n    $('.form-navigation .next').toggle(!atTheEnd);\n    $('.form-navigation [type=submit]').toggle(atTheEnd);\n  }\n\n  function curIndex() {\n    // Return the current index by looking at which section has the class 'current'\n    return $sections.index($sections.filter('.current'));\n  }\n\n  // Previous button is easy, just go back\n  $('.form-navigation .previous').click(function() {\n    navigateTo(curIndex() - 1);\n  });\n\n  // Next button goes forward iff current block validates\n  $('.form-navigation .next').click(function() {\n    $('.demo-form').parsley().whenValidate({\n      group: 'block-' + curIndex()\n    }).done(function() {\n      navigateTo(curIndex() + 1);\n    });\n  });\n\n  // Prepare sections by setting the `data-parsley-group` attribute to 'block-0', 'block-1', etc.\n  $sections.each(function(index, section) {\n    $(section).find(':input').attr('data-parsley-group', 'block-' + index);\n  });\n  navigateTo(0); // Start at the beginning\n});\n    </script>\n    <script src=\"../assets/example.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "doc/examples/simple.html",
    "content": "\n<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Parsley, the ultimate frontend javascript form validation library\">\n    <meta name=\"author\" content=\"Guillaume Potier\">\n\n    <title>Parsley - Examples | Simple form demo</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../../bower_components/bootstrap/dist/css/bootstrap.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"../assets/docs.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js\"></script>\n      <script src=\"https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js\"></script>\n    <![endif]-->\n\n    <link href=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/7.3/styles/github.min.css\" rel=\"stylesheet\">\n\n    <link href=\"../../src/parsley.css\" rel=\"stylesheet\">\n    <style class=\"example\">\nh4 {\n  margin-bottom: 10px;\n}\np.parsley-success {\n  color: #468847;\n  background-color: #DFF0D8;\n  border: 1px solid #D6E9C6;\n}\np.parsley-error {\n  color: #B94A48;\n  background-color: #F2DEDE;\n  border: 1px solid #EED3D7;\n}\n    </style>\n  </head>\n\n  <body class=\"examples\">\n\n    <div class=\"container\">\n\n      <div class=\"masthead\">\n        <div class=\"header\">\n          <h3 class=\"text-muted\"><a href=\"../../\">Parsley</a></h3>\n\n          <span class=\"social-buttons inline-block\">\n            <a href=\"https://twitter.com/share\" class=\"twitter-share-button\" data-url=\"http://parsleyjs.org\" data-text=\"Parsley, the ultimate javascript form validation library. #parsleyjs\" data-via=\"guillaumepotier\" data-related=\"guillaumepotier\" data-hashtags=\"parsleyjs\">Tweet</a>\n            <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>\n\n            <iframe src=\"http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=watch&count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"110\" height=\"20\"></iframe>\n\n            <iframe src=\"http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=fork&count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"110\" height=\"20\"></iframe>\n          </span>\n        </div>\n      </div>\n\n      <ul class=\"nav nav-justified\">\n        <li><a href=\"../../\">Home</a></li>\n        <li class=\"active\"><a href=\"../examples.html\">Examples</a></li>\n        <li><a href=\"../index.html\">Documentation</a></li>\n        <li><a href=\"../download.html\">Download</a></li>\n        <li><a href=\"../help.html\">Help</a></li>\n        <li><a href=\"../annotated-source/main.html\">Annotated&nbsp;source</a></li>\n        <li><a href=\"../tests.html\">Tests</a></li>\n      </ul>\n\n      <div class=\"row\">\n\n        <!-- ###################### BEGINNING OF EXAMPLE ######################-->\n\n        <div class=\"col-md-4\">\n          <h2>Simple form example *</h2>\n          <small class=\"pull-left\"><a href=\"../examples.html\">&lt;&lt; Back to examples</a>\n          — <a href=\"#\" class=\"play\">Try it on CodePen</a>\n          </small>\n          <span class=\"clearfix\"></span>\n          <hr>\n\n<div class=\"form-group example\">\n<div class=\"bs-callout bs-callout-warning hidden\">\n  <h4>Oh snap!</h4>\n  <p>This form seems to be invalid :(</p>\n</div>\n\n<div class=\"bs-callout bs-callout-info hidden\">\n  <h4>Yay!</h4>\n  <p>Everything seems to be ok :)</p>\n</div>\n\n<form id=\"demo-form\" data-parsley-validate>\n  <label for=\"fullname\">Full Name * :</label>\n  <input type=\"text\" class=\"form-control\" name=\"fullname\" required />\n\n  <label for=\"email\">Email * :</label>\n  <input type=\"email\" class=\"form-control\" name=\"email\" data-parsley-trigger=\"change\" required />\n\n  <label for=\"contactMethod\">Preferred Contact Method *:</label>\n  <p>\n    Email: <input type=\"radio\" name=\"contactMethod\" id=\"contactMethodEmail\" value=\"Email\" required />\n    Phone: <input type=\"radio\" name=\"contactMethod\" id=\"contactMethodPhone\" value=\"Phone\" />\n  </p>\n\n  <label for=\"hobbies\">Hobbies (Optional, but 2 minimum):</label>\n  <p>\n    Skiing <input type=\"checkbox\" name=\"hobbies[]\" id=\"hobby1\" value=\"ski\" data-parsley-mincheck=\"2\" /><br>\n    Running <input type=\"checkbox\" name=\"hobbies[]\" id=\"hobby2\" value=\"run\" /><br>\n    Eating <input type=\"checkbox\" name=\"hobbies[]\" id=\"hobby3\" value=\"eat\" /><br>\n    Sleeping <input type=\"checkbox\" name=\"hobbies[]\" id=\"hobby4\" value=\"sleep\" /><br>\n    Reading <input type=\"checkbox\" name=\"hobbies[]\" id=\"hobby5\" value=\"read\" /><br>\n    Coding <input type=\"checkbox\" name=\"hobbies[]\" id=\"hobby6\" value=\"code\" /><br>\n  </p>\n\n  <p>\n  <label for=\"heard\">Heard about us via *:</label>\n  <select id=\"heard\" required>\n    <option value=\"\">Choose..</option>\n    <option value=\"press\">Press</option>\n    <option value=\"net\">Internet</option>\n    <option value=\"mouth\">Word of mouth</option>\n    <option value=\"other\">Other..</option>\n  </select>\n  </p>\n\n  <p>\n  <label for=\"message\">Message (20 chars min, 100 max) :</label>\n  <textarea id=\"message\" class=\"form-control\" name=\"message\" data-parsley-trigger=\"keyup\" data-parsley-minlength=\"20\" data-parsley-maxlength=\"100\" data-parsley-minlength-message=\"Come on! You need to enter at least a 20 character comment..\" data-parsley-validation-threshold=\"10\"></textarea>\n  </p>\n\n  <br>\n  <input type=\"submit\" class=\"btn btn-default\" value=\"validate\"/>\n\n  <p><small>* Please, note that this demo form is not a perfect example of UX-awareness. The aim here is to show a quick overview of parsley-API and Parsley customizable behavior.</small></p>\n</form>\n          </div>\n        </div>\n        <div class=\"col-md-8\">\n          <div class=\"code-block\">\n<pre><code class=\"example\"></code></pre>\n          </div>\n        </div>\n      </div>\n\n\n      <!-- ###################### END OF EXAMPLE ######################-->\n\n      <!-- Site footer -->\n      <div class=\"footer\">\n        <p>&copy; <a href=\"https://twitter.com/guillaumepotier\" title=\"Guillaume Potier on Twitter\">Guillaume Potier</a> 2014 - <a href=\"http://wisembly.com\">@Wisembly</a></p>\n      </div>\n    </div>\n\n    <script src=\"../../bower_components/jquery/dist/jquery.min.js\"></script>\n    <script src=\"../../bower_components/bootstrap/js/affix.js\"></script>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/7.3/highlight.min.js\"></script>\n\n    <script src=\"../../dist/parsley.js\"></script>\n    <script class=\"example\">\n$(function () {\n  $('#demo-form').parsley().on('field:validated', function() {\n    var ok = $('.parsley-error').length === 0;\n    $('.bs-callout-info').toggleClass('hidden', !ok);\n    $('.bs-callout-warning').toggleClass('hidden', ok);\n  })\n  .on('form:submit', function() {\n    return false; // Don't submit form for this demo\n  });\n});\n    </script>\n    <script src=\"../assets/example.js\"></script>\n\n  </body>\n</html>\n"
  },
  {
    "path": "doc/examples.html",
    "content": "\n<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Parsley, the ultimate frontend javascript form validation library\">\n    <meta name=\"author\" content=\"Guillaume Potier\">\n\n    <title>Parsley - Examples and form demonstration</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../bower_components/bootstrap/dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"assets/docs.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js\"></script>\n      <script src=\"https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js\"></script>\n    <![endif]-->\n\n    <link href=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/7.3/styles/github.min.css\" rel=\"stylesheet\">\n\n    <link href=\"../src/parsley.css\" rel=\"stylesheet\">\n    <style>\n      body {\n        color: #111111;\n      }\n      .row {\n        margin-top: 10px;\n      }\n      .code-block {\n        margin-top: 20px;\n      }\n      .hidden {\n        display: none;\n      }\n      .row a h2, .row h2 {\n        color: #FF851B;\n        height: 66px;\n      }\n      .row a p {\n        color: #111;\n        text-align: justify;\n      }\n      .row .link {\n        color: #428bca;\n      }\n    </style>\n  </head>\n\n  <body>\n    <div class=\"container\">\n\n      <div class=\"masthead\">\n        <div class=\"header\">\n          <h3 class=\"text-muted\"><a href=\"../\">Parsley</a></h3>\n\n          <span class=\"social-buttons inline-block\">\n            <a href=\"https://twitter.com/share\" class=\"twitter-share-button\" data-url=\"http://parsleyjs.org\" data-text=\"Parsley, the ultimate javascript form validation library. #parsleyjs\" data-via=\"guillaumepotier\" data-related=\"guillaumepotier\" data-hashtags=\"parsleyjs\">Tweet</a>\n            <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>\n\n            <iframe src=\"http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=watch&count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"110\" height=\"20\"></iframe>\n\n            <iframe src=\"http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=fork&count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"110\" height=\"20\"></iframe>\n          </span>\n        </div>\n      </div>\n\n      <ul class=\"nav nav-justified\">\n        <li><a href=\"../\">Home</a></li>\n        <li class=\"active\"><a href=\"examples.html\">Examples</a></li>\n        <li><a href=\"index.html\">Documentation</a></li>\n        <li><a href=\"download.html\">Download</a></li>\n        <li><a href=\"help.html\">Help</a></li>\n        <li><a href=\"annotated-source/main.html\">Annotated&nbsp;source</a></li>\n        <li><a href=\"tests.html\">Tests</a></li>\n        <li><a href=\"about.html\">About</a></li>\n      </ul>\n\n      <!-- Example row of columns -->\n      <div class=\"row\">\n        <a href=\"examples/simple.html\">\n          <div class=\"col-lg-4\">\n            <h2>A simple demo form to showcase various inputs</h2>\n            <p class=\"argument\">A simple demo form that uses most of supported Parsley elements to show how to <strong>bind, configure and validate them properly.</strong> For more information, please have a look at the documentation.</p>\n            <p class=\"link\">View example &raquo;</p>\n          </div>\n        </a>\n\n        <a href=\"examples/events.html\">\n          <div class=\"col-lg-4\">\n            <h2>Using events to make complex validations</h2>\n            <p class=\"argument\">Sometimes, regular validators and regular Parsley validation process <strong>is not enough</strong> for your forms. <strong>See how you could leverage Parsley events</strong> to make incredible validations!</p>\n            <p class=\"link\">View example &raquo;</p>\n          </div>\n        </a>\n\n        <a href=\"examples/multisteps.html\">\n          <div class=\"col-lg-4\">\n            <h2>A multi steps form with Parsley validation</h2>\n            <p class=\"argument\">Sometimes, you'll need to split <strong>long and fastidious forms</strong> into multiple parts. See how you could leverage <strong>Parsley groups</strong> to easily validate such multi step forms, step by step.</p>\n            <p class=\"link\">View example &raquo;</p>\n          </div>\n        </a>\n      </div>\n\n      <div class=\"row\">\n        <a href=\"examples/customvalidator.html\">\n          <div class=\"col-lg-4\">\n            <h2>Craft your own validators demo</h2>\n            <p class=\"argument\">Sometimes, you'll need to create <strong>custom validators for your needs</strong> because default built-in ones are simply not enough. See how you could do it and make very powerful <strong>custom reusable validators</strong>.</p>\n            <p class=\"link\">View example &raquo;</p>\n          </div>\n        </a>\n\n        <a href=\"examples/custom-validator-events.html\">\n          <div class=\"col-lg-4\">\n            <h2>Validating a group on inputs</h2>\n            <p class=\"argument\">Validations dependent on more than one inputs can be difficult to achieve (and we are working on this). See how you could leverage Parsley's ability to <strong>validate <code>&lt;div&gt;</code> and other non inputs</strong> to validate groups of inputs!</p>\n            <p class=\"link\">View example &raquo;</p>\n          </div>\n        </a>\n\n         <a href=\"examples/ajax.html\">\n          <div class=\"col-lg-4\">\n            <h2>Promises and Ajax</h2>\n            <p class=\"argument\">Parsley handles <strong>promises</strong> and thus <strong>ajax requests</strong> seamlessly.</p>\n            <p class=\"link\">View example &raquo;</p>\n          </div>\n        </a>\n\n      </div>\n      <div class=\"row\">\n         <div class=\"col-lg-4\">\n            <h2>Stylish floating error labels</h2>\n            <p class=\"argument\"><a href=\"https://twitter.com/zslabs\">Zach Schnackel</a> shows us how to style inputs to make beautiful floating error labels.</p>\n            <a href=\"http://codepen.io/zslabs/pen/eNegqY\" target=\"_blank\">\n              <p class=\"link\">View example &raquo;</p>\n            </a>\n          </div>\n\n      </div>\n\n      <!-- Site footer -->\n      <div class=\"footer\">\n        <p>&copy; <a href=\"https://twitter.com/guillaumepotier\" title=\"Guillaume Potier on Twitter\">Guillaume Potier</a> 2014 - <a href=\"http://wisembly.com\">@Wisembly</a></p>\n      </div>\n    </div>\n\n    <script src=\"../bower_components/jquery/dist/jquery.min.js\"></script>\n    <script src=\"../bower_components/bootstrap/js/affix.js\"></script>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/7.3/highlight.min.js\"></script>\n\n    <script src=\"../dist/parsley.js\"></script>\n    <script>\n      var _gaq = _gaq || [];\n      _gaq.push(['_setAccount', 'UA-37229467-1']);\n      _gaq.push(['_trackPageview']);\n\n      (function() {\n        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;\n        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';\n        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);\n      })();\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "doc/help.html",
    "content": "\n<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Parsley, the ultimate frontend javascript form validation library\">\n    <meta name=\"author\" content=\"Guillaume Potier\">\n\n    <title>Parsley - Find the help you need</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../bower_components/bootstrap/dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"assets/docs.css\" rel=\"stylesheet\">\n    <link href=\"assets/help.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js\"></script>\n      <script src=\"https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js\"></script>\n    <![endif]-->\n\n    <style>\n      #element { display: none; }\n      .jumbotron { padding-bottom: 0px; margin-bottom: 0;}\n      .bs-callout { height: 145px; }\n      #stack .uwidget-actions { background-color: #5bc0de; }\n      #gh .uwidget-actions { background-color: #f0ad4e; }\n    </style>\n  </head>\n\n  <body>\n    <div class=\"container\">\n      <div class=\"masthead\">\n        <div class=\"header\">\n          <h3 class=\"text-muted\"><a href=\"../\">Parsley</a></h3>\n\n          <span class=\"social-buttons inline-block\">\n            <a href=\"https://twitter.com/share\" class=\"twitter-share-button\" data-url=\"http://parsleyjs.org\" data-text=\"Parsley, the ultimate javascript form validation library. #parsleyjs\" data-via=\"guillaumepotier\" data-related=\"guillaumepotier\" data-hashtags=\"parsleyjs\">Tweet</a>\n            <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>\n\n            <iframe src=\"http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=watch&count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"110\" height=\"20\"></iframe>\n\n            <iframe src=\"http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=fork&count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"110\" height=\"20\"></iframe>\n          </span>\n\n        </div>\n\n        <ul class=\"nav nav-justified\">\n          <li><a href=\"../\">Home</a></li>\n          <li><a href=\"examples.html\">Examples</a></li>\n          <li><a href=\"index.html\">Documentation</a></li>\n          <li><a href=\"download.html\">Download</a></li>\n          <li class=\"active\"><a href=\"help.html\">Help</a></li>\n          <li><a href=\"annotated-source/main.html\">Annotated&nbsp;source</a></li>\n          <li><a href=\"tests.html\">Tests</a></li>\n          <li><a href=\"about.html\">About</a></li>\n        </ul>\n\n        <!-- Jumbotron -->\n        <div class=\"jumbotron\">\n          <h1>Help: bugs & community</h1>\n          <small>You're not alone..</small>\n          <hr>\n        </div>\n        <div class=\"col-md-6\">\n          <div class=\"bs-callout bs-callout-info\">\n            <h4>StackOverflow: need a hand, not sure how to do something?</h4>\n            <p>\n              Parsley ships with a lot of easy to use built-in stuff, be <a href=\"index.html\">sure to read the doc!</a>. In some cases, you'll need to work more deeply with listeners, internals.. If you're stuck, have a look at <a href=\"http://stackoverflow.com/questions/tagged/parsley.js\">StackOverflow's great Parsley questions and answers</a>.\n            </p>\n          </div>\n          <div id=\"stack\" class=\"uwidget\" data-height=\"400px\" data-width=\"100%\"></div>\n        </div>\n        <div class=\"col-md-6\">\n          <div class=\"bs-callout bs-callout-warning\">\n            <h4>GitHub: found a bug or want to contribute?</h4>\n            <p>\n              If you are either pretty sure that you spotted a vicious bug, or have a great feature implementation / idea, be sure to go to <a href=\"https://github.com/guillaumepotier/Parsley.js\">GitHub</a> and open an issue or a pull request.\n            </p>\n          </div>\n          <div id=\"gh\" class=\"uwidget\" data-height=\"400px\" data-width=\"100%\"></div>\n        </div>\n        <div class=\"clearfix\"></div>\n\n        <!-- Site footer -->\n        <div class=\"footer\">\n          <p>&copy; <a href=\"https://twitter.com/guillaumepotier\" title=\"Guillaume Potier on Twitter\">Guillaume Potier</a> 2014 - <a href=\"http://wisembly.com\">@Wisembly</a></p>\n        </div>\n      </div>\n    </div>\n\n    <script src=\"../bower_components/jquery/dist/jquery.min.js\"></script>\n    <script src=\"../bower_components/uwidget/uwidget.js\"></script>\n\n    <script>\n    $(document).ready(function () {\n      $('#gh').UWidget({\n        url: 'https://api.github.com/repos/guillaumepotier/Parsley.js/issues',\n        handler: function (data) {\n          return data;\n        },\n        template: 'gh_tmpl',\n        sort: {\n          enabled: true,\n          name: 'sort',\n          values: ['created', 'updated', 'comments'],\n          labels: ['Creation date', 'Update date', 'Comments']\n        },\n        direction: {\n          enabled: true,\n          name: 'direction',\n          values: ['desc', 'asc'],\n          labels: ['Descending', 'Ascending']\n        },\n        filters: {\n          enabled: true,\n          name: 'labels',\n          values: ['bug', 'request'],\n          labels: ['Bug', ' Request']\n        }\n      });\n\n      $('#stack').UWidget({\n        url: 'https://api.stackexchange.com/2.2/search?tagged=parsley.js&site=stackoverflow',\n        handler: function (data) {\n          return data.items;\n        },\n        template: 'stack_tmpl',\n        sort: {\n          enabled: true,\n          name: 'sort',\n          values: ['creation', 'activity', 'votes', 'relevance'],\n          labels: ['Creation', 'Activity', 'Votes', 'Relevance']\n        },\n        direction: {\n          enabled: true,\n          name: 'order',\n          values: ['desc', 'asc'],\n          labels: ['Descending', 'Ascending']\n        }\n      });\n    });\n    </script>\n    <script type=\"text/html\" id=\"gh_tmpl\">\n      <li>\n        <span class=\"gh-issue-comments\">\n          <%= comments %> <%= comments > 1 ? \"comments\" : \"commment\" %>\n        </span>\n        <span class=\"gh-issue-title\">\n          <a href=\"<%= html_url %>\"><%= title %></a>\n        </span>\n      </li>\n    </script>\n    <script type=\"text/html\" id=\"stack_tmpl\">\n      <li>\n        <span class=\"stack-question-answers\">\n          <%= answer_count %> <%= answer_count > 1 ? \"answers\" : \"answer\" %>\n        </span>\n        <span class=\"stack-question-title\">\n          <a href=\"<%= link %>\"><%= title %></a>\n        </span>\n      </li>\n    </script>\n\n    <script>\n      var _gaq = _gaq || [];\n      _gaq.push(['_setAccount', 'UA-37229467-1']);\n      _gaq.push(['_trackPageview']);\n\n      (function() {\n        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;\n        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';\n        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);\n      })();\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "doc/index.html",
    "content": "\n<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Parsley, the ultimate frontend javascript form validation library\">\n    <meta name=\"author\" content=\"Guillaume Potier\">\n\n    <title>Parsley - The ultimate documentation</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../bower_components/bootstrap/dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"assets/docs.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js\"></script>\n      <script src=\"https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js\"></script>\n    <![endif]-->\n    <link href=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/7.3/styles/github.min.css\" rel=\"stylesheet\">\n    <link href=\"../src/parsley.css\" rel=\"stylesheet\">\n\n    <style>\n      #mailing-list {\n        margin-top: 25px;\n        width: 200px;\n        text-align: justify;\n      }\n      #mailing-list input {\n        margin: 5px 0 !important;\n        width: 190px !important;\n      }\n      #mailing-list label {\n        padding: 0px !important;\n      }\n    </style>\n  </head>\n\n  <body>\n    <div class=\"container\">\n      <div class=\"masthead\">\n        <div class=\"header\">\n          <h3 class=\"text-muted\"><a href=\"../\">Parsley</a></h3>\n\n          <span class=\"social-buttons inline-block\">\n            <a href=\"https://twitter.com/share\" class=\"twitter-share-button\" data-url=\"http://parsleyjs.org\" data-text=\"Parsley, the ultimate javascript form validation library. #parsleyjs\" data-via=\"guillaumepotier\" data-related=\"guillaumepotier\" data-hashtags=\"parsleyjs\">Tweet</a>\n            <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>\n\n            <iframe src=\"http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=watch&count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"110\" height=\"20\"></iframe>\n\n            <iframe src=\"http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=fork&count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"110\" height=\"20\"></iframe>\n          </span>\n\n        </div>\n\n        <ul class=\"nav nav-justified\">\n          <li><a href=\"../\">Home</a></li>\n          <li><a href=\"examples.html\">Examples</a></li>\n          <li class=\"active\"><a href=\"index.html\">Documentation</a></li>\n          <li><a href=\"download.html\">Download</a></li>\n          <li><a href=\"help.html\">Help</a></li>\n          <li><a href=\"annotated-source/main.html\">Annotated&nbsp;source</a></li>\n          <li><a href=\"tests.html\">Tests</a></li>\n          <li><a href=\"about.html\">About</a></li>\n        </ul>\n      </div>\n\n      <div class=\"col-md-9\" role=\"main\">\n        <div class=\"docs-section\">\n          <!-- ****************** OVERVIEW ****************** -->\n          <h1 id=\"overview\" class=\"page-header\">Overview</h1>\n          <h3 id=\"frontend-form-validation\">Frontend form validation</h3>\n          <p>\n            Parsley is a javascript form validation library. It helps you provide your users with feedback on their form submission before sending it to your server. It saves you bandwidth, server load and it saves time for your users.\n          </p>\n          <p>\n            Javascript form validation is not necessary, and if used, it <strong>does not replace strong backend server validation.</strong>\n          </p>\n          <p>\n            That's why Parsley is here: to let you define your general form validation, implement it on the backend side, and simply port it frontend-side, with maximum respect to user experience best practices.\n          </p>\n\n          <div class=\"bs-callout bs-callout-info\">\n            <h4>Parsley 1.x versions</h4>\n            <p>\n              Parsley's current stable and supported versions are 2.x. If you still use a 1.x version, <a href=\"http://parsleyjs.github.io/Parsley-1.x\" target=\"_blank\">here is the related doc</a>. But don't forget to <a href=\"https://github.com/guillaumepotier/Parsley.js/blob/master/UPGRADE-2.0.md\" target=\"_blank\">upgrade</a>!\n            </p>\n          </div>\n\n          <h3 id=\"data-attrs\">Data attributes</h3>\n          <p>\n            Parsley uses a specific DOM API which allows you to configure pretty much everything directly from your DOM, without writing a single javascript configuration line or custom function. Parsley's default DOM API is <code>data-parsley-</code>. That means that if in config you see a <code>foo</code> property, it can be set/modified via DOM with <code>data-parsley-foo=\"value\"</code>.\n          </p>\n\n          <h3 id=\"configuration\">Configuration</h3>\n          <p>\n            You'll see along this documentation and through <a href=\"examples.html\">examples</a> various available configuration options. You can also view <a href=\"annotated-source/defaults.html\" target=\"_blank\">here</a> all of Parsley's default configuration options.\n          </p>\n\n\n          <!-- ****************** INSTALL ****************** -->\n          <h1 id=\"installation\" class=\"page-header\">Installation</h1>\n          <h3 id=\"installation-basic\">Basic installation</h3>\n          <p>\n            Parsley relies on <strong><a href=\"http://jquery.com/\" target=\"_blank\">jQuery</a> (&gt;= 1.8)</strong>, and it will need to be included before including Parsley.\n          </p>\n          <p>\n            You will also need to include <strong><a href=\"https://github.com/es-shims/es5-shim\" target=\"_blank\">es5-shim</a></strong> if you want need to support IE8.\n          </p>\n          <p>\n            Then, you can either use <code>parsley.js</code> unminified file or <code>parsley.min.js</code> minified one. These files and <a href=\"#extras\">extras</a> are <a href=\"download.html\">available here</a>.\n          </p>\n          <p>\n            Finally, add <code>data-parsley-validate</code> to each <code>&lt;form&gt;</code> you want to be validated.\n          </p>\n          <p>That would look pretty much like this:\n<pre><code>&lt;script src=\"jquery.js\"&gt;&lt;/script&gt;\n&lt;script src=\"parsley.min.js\"&gt;&lt;/script&gt;\n\n&lt;form data-parsley-validate&gt;\n...\n&lt;/form&gt;\n</code></pre>\n          </p>\n\n          <div class=\"bs-callout bs-callout-info\">\n            <h4>Parsley CSS</h4>\n            <p>Parsley adds many classes and elements in the DOM when it validates. You are strongly encouraged to customize them in your own stylesheets, but here is the \"standard\" <a href=\"../src/parsley.css\" target=\"_blank\">Parsley css file</a> that is used here on the documentation and examples, if you want to use it to bootstrap your projects with Parsley.</p>\n          </div>\n\n          <h3 id=\"installation-javascript\">Javascript installation</h3>\n          <p>Like for <a href=\"#installation-basic\">Basic installation</a>, first include <strong>jQuery</strong> and Parsley. Then, simply use <code>$('#form').parsley(options);</code> or <code>new Parsley('#form', options);</code> (where <code>options</code> is an optional configuration object) to manually bind Parsley to your forms.</p>\n\n          <p>That would look pretty much like this:\n<pre><code>&lt;script src=\"jquery.js\"&gt;&lt;/script&gt;\n&lt;script src=\"parsley.min.js\"&gt;&lt;/script&gt;\n\n&lt;form id=\"form\"&gt;\n...\n&lt;/form&gt;\n\n&lt;script&gt;\n  $('#form').parsley();\n&lt;/script&gt;\n</code></pre>\n\n          <div class=\"bs-callout bs-callout-danger\">\n            <h4>Do not add <code>data-parsley-validate</code> to your forms</h4>\n            <p>\n              Please be aware that Parsley looks at all <code>data-parsley-validate</code> occurrences in DOM on document load and automatically binds them if valid.<br>\n              Once a form or field instance is bound by Parsley, doing <code>$('#form').parsley(options);</code> will update the existing options but not replace them.\n            </p>\n          </div>\n          </p>\n\n          <h3 id=\"installation-localization\">Localization</h3>\n          <p>\n            Parsley comes with various error messages for its built-in validators. They are shipped in English by default, but many other languages are available, thanks to the awesome international Parsley community. <a href=\"https://github.com/guillaumepotier/Parsley.js/tree/master/dist/i18n\">See the available localizations here</a>.\n          </p>\n          <p>\n            To load a different locale and its messages, include them after Parsley:\n<pre><code>&lt;script src=\"jquery.js\"&gt;&lt;/script&gt;\n&lt;script src=\"parsley.min.js\"&gt;&lt;/script&gt;\n&lt;script src=\"i18n/fr.js\"&gt;&lt;/script&gt;\n&lt;script src=\"i18n/it.js\"&gt;&lt;/script&gt;\n</code></pre>\n                The last loaded file will automatically set the messages locale for Parsley. In the example above, we load both French and Italian translations, and use Italian.\n          </p>\n\n          <h3 id=\"installation-plugins\">Plugins</h3>\n          <p>\n            Parsley strives to be highly decoupled and modular. It uses events and inheritance, and allows various plugins.\n          </p>\n          <p>Current available plugins are in <a href=\"#extras\">Extras</a> for additional validators.</p>\n\n          <!-- ****************** USAGE ****************** -->\n          <h1 id=\"usage\" class=\"page-header\">Usage</h1>\n          <h3 id=\"usage-overview\">Overview</h3>\n          <p>\n            Parsley is a decoupled library that uses different classes to do the heavy work. You'll see here the different protagonists involved and how you can configure them to fit your desired validation.\n          </p>\n          <table class=\"table table-stripped table-bordered\">\n            <thead>\n              <tr>\n                <th class=\"col-md-3\">$ API</th>\n                <th class=\"col-md-1\">Return</th>\n              </tr>\n            </thead>\n            <tbody>\n              <tr>\n                <td><code>$('#existingForm').parsley(options)</code> <version>#2.0</version></td>\n                <td><code>parsleyFormInstance</code></td>\n              </tr>\n              <tr>\n                <td><code>$('#existingInput').parsley(options)</code> <version>#2.0</version></td>\n                <td><code>parsleyFieldInstance</code></td>\n              </tr>\n              <tr>\n                <td><code>$('#notExistingDOMElement').parsley(options)</code> <version>#2.0</version></td>\n                <td><code>undefined</code></td>\n              </tr>\n              <tr>\n                <td><code>$('.multipleElements').parsley(options)</code> <version>#2.0</version></td>\n                <td><code>Array[Instances]</code></td>\n              </tr>\n            </tbody>\n          </table>\n          <div class=\"bs-callout bs-callout-warning\">\n            <h4>Look at the source code!</h4>\n            <p>\n              Of course, this documentation tries to be the most exhaustive possible and relatively easy to understand. This documentation also provides the <a href=\"annotated-source/main.html\">complete annotated source</a>. Please take 5 minutes of your time to have a quick glance at it, and at least understand the architecture (Parsley, ParsleyForm, ParsleyField, ParsleyValidator, ParsleyUI, Utils, Pub/Sub..), it will heavily ease the lecture below.\n            </p>\n          </div>\n\n          <h3 id=\"usage-configuration\">Configuration</h3>\n          <h4>Data attributes and javascript</h4>\n          <p>\n            The multiple options can be specified using data attributes and javascript:\n          </p>\n<pre><code>&lt;input id=\"first\" data-parsley-maxlength=\"42\" value=\"hello\"/&gt;\n&lt;input id=\"second\" value=\"world\"/&gt;\n[...]\n&lt;script&gt;\nvar instance = $('#first').parsley();\nconsole.log(instance.isValid()); // maxlength is 42, so field is valid\n$('#first').attr('data-parsley-maxlength', 4);\nconsole.log(instance.isValid()); // No longer valid, as maxlength is 4\n// You can access and override options in javascript too:\ninstance.options.maxlength++;\nconsole.log(instance.isValid()); // Back to being valid, as maxlength is 5\n// Alternatively, the options can be specified as:\nvar otherInstance = $('#second').parsley({\n  maxlength: 10\n});\nconsole.log(otherInstance.options); // Shows that maxlength will be 10 for this field\n</code></pre>\n          <p>\n            As shown in the previous example, Parsley will actualize the options from the data attributes whenever it needs to validate a field.\n          </p>\n          <h4>Option inheritance</h4>\n          <p>\n            Field instances inherit their options from Form instances, and both inherit from the global options. This is a handy way to configure all your form's inputs in a row by passing their config through form.\n          </p>\n<pre><code>&lt;form&gt;\n  &lt;input/&gt;\n&lt;/form&gt;\n[...]\n&lt;script&gt;\nParsley.options.maxlength = 42;\nvar formInstance = $('form').parsley();\nvar field = $('input').parsley();\nconsole.log(field.options.maxlength); // Shows that maxlength is 42\nParsley.options.maxlength = 30;\nconsole.log(field.options.maxlength); // Shows that maxlength is automagically 30\nformInstance.options.maxlength++;\nconsole.log(field.options.maxlength); // Shows that maxlength is automagically 31\n</code></pre>\n          <p>\n            The previous example shows that the inheritance of options is automagic. In case you are wondering, they are linked through <code>prototype</code> to achieve this.\n          </p>\n\n          <h4>Naming</h4>\n          <p>\n            You can change the DOM API namespace directly using the <code>namespace</code> option. Data attributes with compound names are camelcased for javascript, and their values are automatically converted to the appropriate type (boolean, integer, etc.).\n            For example:\n<pre><code>&lt;input data-my-namespace-priority-enabled=\"false\"&gt;\n[...]\n&lt;script&gt;\nvar instance = $('input').parsley({namespace: 'my-namespace-'});\nif (false === instance.options.priorityEnabled)\n  console.log(\"priorityEnabled was set to false\");\n</code></pre>\n          </p>\n\n          <h3 id=\"usage-form\">Form</h3>\n          <p>\n            When doing <code>$('#target').parsley()</code> or <code>new Parsley('#target');</code> on a <code>&lt;form id=\"target\"&gt;</code> element, it will bind the whole form and its various inputs and return a <code>ParsleyForm</code> instance.\n          </p>\n\n          <h4>Options</h4>\n          <table class=\"table table-stripped table-bordered\">\n            <thead>\n              <tr>\n                <th class=\"col-md-3\">Property</th>\n                <th class=\"col-md-1\">Default</th>\n                <th class=\"col-md-4\">Description</th>\n              </tr>\n            </thead>\n            <tbody>\n              <tr>\n                <td><code>data-parsley-namespace</code> <version>#2.0</version></td>\n                <td><code>data-parsley-</code></td>\n                <td>Namespace used by Parsley DOM API to bind options from DOM.<br><a href=\"#data-attrs\">See more</a></td>\n              </tr>\n              <tr>\n                <td><code>data-parsley-validate</code> <version>#2.0</version></td>\n                <td></td>\n                <td>Auto bind your form with Parsley validation on document load.</td>\n              </tr>\n              <tr>\n                <td><code>data-parsley-priority-enabled</code> <version>#2.0</version></td>\n                <td><code>true</code></td>\n                <td>Either validate higher priority constraints first and stop on first failure (<code>true</code>), or validate all constraints simultaneously and show all the failing ones (<code>false</code>).</td>\n              </tr>\n              <tr>\n                <td><code>data-parsley-inputs</code> <version>#2.0</version></td>\n                <td>\n                  <code>input,</code><br>\n                  <code>textarea,</code><br>\n                  <code>select</code></td>\n                <td>When looking for fields within a form, Parsley uses this selector.\n                  The fields found will then be filtered using the <code>excluded</code> option below.</td>\n              </tr>\n              <tr>\n                <td><code>data-parsley-excluded</code> <version>#2.0</version></td>\n                <td>\n                  <code>input[type=button],</code><br>\n                  <code>input[type=submit],</code><br>\n                  <code>input[type=reset],</code><br>\n                  <code>input[type=hidden]</code></td>\n                <td>Form fields that won't be validated by Parsley.  For example, if you want to add <code>disabled</code> and hidden fields to the existing list, use: <pre>data-parsley-excluded=\"input[type=button], input[type=submit], input[type=reset], input[type=hidden], [disabled], :hidden\"</pre></td>\n              </tr>\n            </tbody>\n          </table>\n\n          <h4>Methods</h4>\n          <table class=\"table table-stripped table-bordered\">\n            <thead>\n              <tr>\n                <th class=\"col-md-2\">Method</th>\n                <th class=\"col-md-1\">Returns</th>\n                <th class=\"col-md-5\">Description</th>\n              </tr>\n            </thead>\n            <tbody>\n              <tr>\n                <td><code>whenValid({group, force})</code> <version>#2.2</version></td>\n                <td><code>promise</code></td>\n                <td>Returns a jQuery promise that will be fulfilled if and only if the Form is valid. <strong>Does not affect UI nor fires <a href=\"#events\">events</a>.</strong> If <code>group</code> is given, it only validates fields that belong to this group. If <code>force</code> is given, it force validates even non-required fields (<a href=\"examples/events.html\">See example</a>)</td>\n              </tr>\n              <tr>\n                <td><code>isValid({group, force})</code> <version>#2.0</version></td>\n                <td><code>boolean or null</code></td>\n                <td>Similar to <code>whenValid</code> but returns <code>true</code> if the promise is already fulfilled, <code>false</code> if already rejected, and <code>null</code> if the validation is still pending.</td>\n              </tr>\n              <tr>\n                <td><code>whenValidate({group, force})</code> <version>#2.0</version></td>\n                <td>\n                  <code>promise</code>\n                </td>\n                <td>Validate form. Prevents submission if not valid. <strong>Fires <a href=\"#events\">events</a> and affects UI.</strong>. You can only validate a certain group of fields by specifying optional <code>group</code> string parameter. If <code>group</code> is given, it only validates fields that belong to this group. If <code>force</code> is given, it force validates even non required fields (<a href=\"examples/events.html\">See example</a>). Same result as <code>whenValid</code>.</td>\n              </tr>\n              <tr>\n                <td><code>validate({group, force})</code> <version>#2.0</version></td>\n                <td>\n                  <code>boolean or null</code>\n                </td>\n                <td>Same as <code>whenValidate</code> except it returns <code>true</code> if the promise is already fulfilled, <code>false</code> if already rejected, and <code>null</code> if the validation is still pending.</td>\n              </tr>\n              <tr>\n                <td><code>refresh()</code> <version>#2.8</version></td>\n                <td></td>\n                <td>Forces a refresh of the form and its field. Parsley always refreshes before validation, but this may be helpful for dynamic changes that need to be applied immediately (e.g. dynamically adding an input with a trigger, changing the `inputs` or `excluded` options, etc.).</td>\n              </tr>\n              <tr>\n                <td><code>reset()</code> <version>#2.0</version></td>\n                <td></td>\n                <td>Reset UI for this form and for its fields.</td>\n              </tr>\n              <tr>\n                <td><code>destroy()</code> <version>#2.0</version></td>\n                <td></td>\n                <td>Disable and destroy Parsley for this form and its fields.</td>\n              </tr>\n            </tbody>\n          </table>\n\n          <h4>UI</h4>\n          See <a href=\"#ui-for-form\">UI for Form</a> section.\n\n\n          <h3 id=\"usage-field\">Field</h3>\n          <p>\n            When doing <code>$('#target').parsley()</code> or <code>new Parsley('#target');</code> on a <code>&lt;input id=\"target\"&gt;</code> element (or <code>&lt;textarea&gt;</code>, <code>&lt;select&gt;</code>), it will bind the field and return a <code>ParsleyField</code> instance. Except for input types radio and checkbox that don't have a <code>name</code> attribute or a <code>data-parsley-multiple</code> attribute, they won't be bound (ignored) and will eventually raise a warning in the console.\n          </p>\n\n          <h4>Options</h4>\n          <table class=\"table table-stripped table-bordered\">\n            <thead>\n              <tr>\n                <th class=\"col-md-3\">Property</th>\n                <th class=\"col-md-5\">Description</th>\n              </tr>\n            </thead>\n            <tbody>\n              <tr>\n                <td><code>data-parsley-value</code> <version>#2.0</version></td>\n                <td>Set a specific field value for Parsley validation, dissociated from the real one. eg: <code>data-parsley-value=\"foo\"</code>\n                  <br>\n                The JavaScript API allows one to pass a function to be called. eg:\n                <code>\n                  $('&lt;input type=\"text\"&gt;').appendTo($('form')).<br>\n                  parsley({<br>\n                  &nbsp;&nbsp;value: function(parsley) { return 'foo'; }<br>\n                  });\n                </code></td>\n              </tr>\n              <tr>\n                <td><code>data-parsley-group</code> <version>#2.0</version></td>\n                <td>Assign a group to a field for specific group validation. eg: <code>data-parsley-group=\"signup\"</code>. This way, you could only validate a portion of a form and not all the fields. Can be multiple. eg: <code>data-parsley-group='[\"foo\", \"bar\"]'</code></td>\n              </tr>\n              <tr>\n                <td><code>data-parsley-multiple</code> <version>#2.0</version></td>\n                <td>You can add this attribute to radio / checkboxes elements like this: <code>data-parsley-multiple=\"mymultiplelink\"</code> to link them together even if they don't share the same name.</td>\n              </tr>\n              <tr>\n                <td><code>data-parsley-validate-if-empty</code> <version>#2.0</version></td>\n                <td>A field is by default not validated if it is not required and empty. By adding <code>data-parsley-validate-if-empty</code>, validation will be done even if field is empty. Useful if you need some custom validators that check something particular when a field is empty.</td>\n              </tr>\n              <tr>\n                <td><code>data-parsley-whitespace</code> <version>#2.1</version></td>\n                <td>Perform actions on whitespace in value <strong>only for Parsley validation</strong> (and not inside the input itself, data sent by your form won't be edited). Useful if your backend already does so and if extra whitespace could unnecessarily mess with your validation. <br><br>Use: <code>data-parsley-whitespace=\"trim\"</code> to trim leading and trailing whitespace characters.<br>Use: <code>data-parsley-whitespace=\"squish\"</code> to squish multiple sequential whitespace characters into a single whitespace character, and also trim leading and trailing whitespace characters.</td>\n              </tr>\n              <tr>\n                <td><code>data-parsley-ui-enabled</code> <version>#2.0</version></td>\n                <td>If set to <code>false</code>, Parsley will not affect UI for this field.</td>\n              </tr>\n              <tr>\n                <td><code>data-parsley-errors-messages-disabled</code> <version>#2.0</version></td>\n                <td>Add <code>parsley-success</code> and <code>parsley-error</code> classes on field, but no error message.</td>\n              </tr>\n              <tr>\n                <td><code>data-parsley-excluded</code> <version>#2.1</version></td>\n                <td>If set to <code>true</code>, Parsley will ignore this field when binding a form.</td>\n              </tr>\n              <tr>\n                <td><code>data-parsley-debounce</code> <version>#2.3</version></td>\n                <td>Postpones validation for a given number of milliseconds after user input has stopped arriving, eg: <code>data-parsley-debounce=\"500\"</code>. Useful for expensive validations (such as remotes) that you don't want to run on every keystroke.</td>\n              </tr>\n            </tbody>\n          </table>\n\n          <div class=\"bs-callout bs-callout-warning\">\n            <h4>Checkbox, radio and select multiple</h4>\n            <p>\n              These fields are a bit different than regular <code>input</code>, <code>textarea</code> or simple <code>select</code>. They need to have either a <code>name</code> or an <code>id</code> attribute to be correctly bound and validated by Parsley. Otherwise, they will be ignored and a warning will be put in the console.\n            </p>\n          </div>\n\n          <h4>Methods</h4>\n          <table class=\"table table-stripped table-bordered\">\n            <thead>\n              <tr>\n                <th class=\"col-md-2\">Method</th>\n                <th class=\"col-md-2\">Returns</th>\n                <th class=\"col-md-4\">Description</th>\n              </tr>\n            </thead>\n            <tbody>\n              <tr>\n                <td><code>isValid({force})</code> <version>#2.0</version></td>\n                <td>\n                  <code>true</code> if all ok<br>\n                  <code>null</code> if some validations are still pending<br>\n                  <code>[Violation, ...]]</code> if fails\n                </td>\n                <td>Returns if the field is valid or not. <strong>Does not affect UI nor fires <a href=\"#events\">events</a>.</strong> If <code>force</code> is set, it forces validation even on non-required fields (<a href=\"examples/events.html\">See example</a>)</td>\n              </tr>\n              <tr>\n                <td><code>validate({force, group})</code> <version>#2.0</version></td>\n                <td>\n                  <code>true</code> if all ok<br>\n                  <code>null</code> if some validations are still pending<br>\n                  <code>[Violation, ...]]</code> if fails\n                </td>\n                <td>Validate Field. <strong>Fires <a href=\"#events\">events</a> and affects UI.</strong> If <code>force</code> is set, force validate even non required fields (<a href=\"examples/events.html\">See example</a>)</td>\n              </tr>\n              <tr>\n                <td><code>getErrorsMessages()</code> <version>#2.0</version></td>\n                <td><code>array</code></td>\n                <td>Returns an array of field's error messages</td>\n              </tr>\n              <tr>\n                <td><code>reset()</code> <version>#2.0</version></td>\n                <td></td>\n                <td>Reset UI for this field.</td>\n              </tr>\n              <tr>\n                <td><code>destroy()</code> <version>#2.0</version></td>\n                <td></td>\n                <td>Disable and destroy Parsley for this field.</td>\n              </tr>\n            </tbody>\n          </table>\n\n          <h4>UI</h4>\n          See <a href=\"#ui-for-field\">UI for Field</a> section.\n\n          <!-- ****************** BUILT-IN VALIDATORS ****************** -->\n          <h1 id=\"validators\" class=\"page-header\">Built-in validators</h1>\n          <h3 id=\"validators-overview\">Overview</h3>\n          <p>\n            A <i>validator</i> is a method to determine if a given <i>value</i> (or sometimes sets of values) is acceptable or not, given some <i>requirement</i> parameters.\n          </p>\n          <p>\n            Parsley comes with many builtin validators and provides tools to specify your own.\n          </p>\n\n          <h3 id=\"validators-list\">Builtin validators list</h3>\n          <table class=\"table table-stripped table-bordered\">\n            <thead>\n              <tr>\n                <th class=\"col-md-2\">Name</th>\n                <th class=\"col-md-4\">API</th>\n                <th class=\"col-md-5\">Description</th>\n              </tr>\n            </thead>\n            <tbody>\n              <tr>\n                <td>\n                  <a name=\"psly-validator-required\"></a>\n                  Required <version>#2.0</version>\n                </td>\n                <td>\n                  <table class=\"table-stripped hundred\">\n                    <tr>\n                      <td><code>required</code></td>\n                      <td><span class=\"label label-info pull-right\">HTML5</span></td>\n                    </tr>\n                    <tr>\n                      <td><code>data-parsley-required</code></td>\n                      <td></td>\n                    </tr>\n                    <tr>\n                      <td><code>data-parsley-required=\"true\"</code></td>\n                      <td></td>\n                    </tr>\n                    <tr>\n                      <td><code>data-parsley-required=\"false\"</code></td>\n                      <td></td>\n                    </tr>\n                  </table>\n                </td>\n                <td>Validates that a required field has been filled with a non blank value. If <code>data-parsley-required=\"false\"</code>, validator is deactivated and the field is not required.</td>\n              </tr>\n              <tr>\n                <td>\n                  <a name=\"psly-validator-email\"></a>\n                  Email <version>#2.0</version>\n                </td>\n                <td>\n                  <table class=\"table-stripped hundred\">\n                    <tr>\n                      <td><code>type=\"email\"</code></td>\n                      <td><span class=\"label label-info pull-right\">HTML5</span></td>\n                    </tr>\n                    <tr>\n                      <td><code>data-parsley-type=\"email\"</code></td>\n                      <td></td>\n                    </tr>\n                  </table>\n                </td>\n                <td>Validates that a value is a valid email address.</td>\n              </tr>\n              <tr>\n                <td>\n                  <a name=\"psly-validator-number\"></a>\n                  Number <version>#2.0</version>\n                </td>\n                <td><code>data-parsley-type=\"number\"</code></td>\n                <td>Validates that a value is a valid number according to the given <code>step</code>, <code>min</code> and original <code>value</code>.\n                  <br>The default <code>step</code> for HTML5 is \"1\", which is so counterintuive that Parsley uses a default <code>step</code> of \"any\" for <code>data-parsley-type=\"number\"</code>.\n                  <span class=\"label label-warning\">Warning!</span> HTML5 <code>type=\"number\"</code> can be counterintuitive. The default step of '1' is near useless. Moreover, for browsers that support it, the value accessible from javascript in case of invalid input is <code>\"\"</code>, so you will never get an error (unless it is also <code>required</code>).</td>\n              </tr>\n              <tr>\n                <td>\n                  <a name=\"psly-validator-integer\"></a>\n                  Integer <version>#2.0</version>\n                </td>\n                <td>\n                  <table class=\"table-stripped hundred\">\n                    <tr>\n                      <td><code>type=\"number\"</code></td>\n                      <td><span class=\"label label-info pull-right\">HTML5</span></td>\n                    </tr>\n                    <tr>\n                      <td><code>data-parsley-type=\"integer\"</code></td>\n                      <td></td>\n                    </tr>\n                  </table>\n                </td>\n                <td>Validates that a value is a valid integer.</td>\n              </tr>\n              <tr>\n                <td>\n                  <a name=\"psly-validator-digits\"></a>\n                  Digits <version>#2.0</version>\n                </td>\n                <td><code>data-parsley-type=\"digits\"</code></td>\n                <td>Validates that a value is only digits.</td>\n              </tr>\n              <tr>\n                <td>\n                  <a name=\"psly-validator-alphanum\"></a>\n                  Alphanum <version>#2.0</version>\n                </td>\n                <td><code>data-parsley-type=\"alphanum\"</code></td>\n                <td>Validates that a value is a valid alphanumeric string.</td>\n              </tr>\n              <tr>\n                <td>\n                  <a name=\"psly-validator-url\"></a>\n                  Url <version>#2.0</version>\n                </td>\n                <td>\n                  <table class=\"table-stripped hundred\">\n                    <tr>\n                      <td><code>type=\"url\"</code></td>\n                      <td><span class=\"label label-info pull-right\">HTML5</span></td>\n                    </tr>\n                    <tr>\n                      <td><code>data-parsley-type=\"url\"</code></td>\n                      <td></td>\n                    </tr>\n                  </table>\n                </td>\n                <td>Validates that a value is a valid url.</td>\n              </tr>\n              <tr>\n                <td>\n                  <a name=\"psly-validator-minlength\"></a>\n                  Minlength <version>#2.0</version>\n                </td>\n                <td><table class=\"table-stripped hundred\">\n                    <tr>\n                      <td><code>minlength=\"6\"</code></td>\n                      <td><span class=\"label label-info pull-right\">HTML5</span></td>\n                    </tr>\n                    <tr>\n                      <td><code>data-parsley-minlength=\"6\"</code></td>\n                      <td></td>\n                    </tr>\n                  </table></td>\n                <td>Validates that the length of a string is at least as long as the given limit. See also <a href=\"#psly-validator-length\">length</a></td>\n              </tr>\n              <tr>\n                <td>\n                  <a name=\"psly-validator-maxlength\"></a>\n                  Maxlength <version>#2.0</version>\n                </td>\n                <td><table class=\"table-stripped hundred\">\n                    <tr>\n                      <td><code>maxlength=\"10\"</code></td>\n                      <td><span class=\"label label-info pull-right\">HTML5</span></td>\n                    </tr>\n                    <tr>\n                      <td><code>data-parsley-maxlength=\"10\"</code></td>\n                      <td></td>\n                    </tr>\n                  </table></td>\n                <td>Validates that the length of a string is not longer than the given limit. See also <a href=\"#psly-validator-length\">length</a></td>\n              </tr>\n              <tr>\n                <td>\n                  <a name=\"psly-validator-length\"></a>\n                  Length <version>#2.0</version>\n                </td>\n                <td><table class=\"table-stripped hundred\">\n                  <tr>\n                    <td><code>minlength=\"6\" maxlength=\"10\"</code></td>\n                    <td><span class=\"label label-info pull-right\">HTML5</span></td>\n                  </tr>\n                  <tr>\n                    <td><code>data-parsley-length=\"[6, 10]\"</code></td>\n                    <td></td>\n                  </tr>\n                </table>\n                <td>Validates that a given string length is between some minimum and maximum value. Specifying both HTML5 attributes <code>minlength</code> and <code>maxlength</code> will enable this validator, instead of both <code>data-parsley-min</code> and <code>data-parsley-max</code> validators.</td>\n              </tr>\n              <tr>\n                <td>\n                  <a name=\"psly-validator-min\"></a>\n                  Min <version>#2.0</version>\n                </td>\n                <td>\n                  <table class=\"table-stripped hundred\">\n                    <tr>\n                      <td><code>min=\"6\"</code></td>\n                      <td><span class=\"label label-info pull-right\">HTML5</span></td>\n                    </tr>\n                    <tr>\n                      <td><code>data-parsley-min=\"6\"</code></td>\n                      <td></td>\n                    </tr>\n                  </table>\n                </td>\n                <td>Validates that a given input (number or date) or date is greater than or equal to some minimum (number or date.)</td>\n              </tr>\n              <tr>\n                <td>\n                  <a name=\"psly-validator-max\"></a>\n                  Max <version>#2.0</version>\n                </td>\n                <td>\n                  <table class=\"table-stripped hundred\">\n                    <tr>\n                      <td><code>max=\"10\"</code></td>\n                      <td><span class=\"label label-info pull-right\">HTML5</span></td>\n                    </tr>\n                    <tr>\n                      <td><code>data-parsley-max=\"10\"</code></td>\n                      <td></td>\n                    </tr>\n                  </table>\n                </td>\n                <td>Validates that the given input (number or date) is less than or equal to some maximum value (number or date).</td>\n              </tr>\n              <tr>\n                <td>\n                  <a name=\"psly-validator-range\"></a>\n                  Range <version>#2.0</version>\n                </td>\n                <td>\n                  <table class=\"table-stripped hundred\">\n                    <tr>\n                      <td><code>type=\"range\"</code></td>\n                      <td><span class=\"label label-info pull-right\">HTML5</span></td>\n                    </tr>\n                    <tr>\n                      <td><code>data-parsley-range=\"[6, 10]\"</code></td>\n                      <td></td>\n                    </tr>\n                  </table>\n                </td>\n                <td>Validates that a given value (number or date) is between some minimum and maximum values (numbers or dates).</td>\n              </tr>\n              <tr>\n                <td>\n                  <a name=\"psly-validator-pattern\"></a>\n                  Pattern <version>#2.0</version>\n                </td>\n                <td>\n                  <table class=\"table-stripped hundred\">\n                    <tr>\n                      <td><code>pattern=\"\\d+\"</code></td>\n                      <td><span class=\"label label-info pull-right\">HTML5</span></td>\n                    </tr>\n                    <tr>\n                      <td><code>data-parsley-pattern=\"\\d+\"</code></td>\n                      <td></td>\n                    </tr>\n                  </table>\n                </td>\n                <td>Validates that a value matches a specific regular expression (regex).\n                  <br>Note that patterns are anchored, i.e. must match the whole string.\n                  <br>Parsley deviates from the standard for patterns looking like <code>/<i>pattern</i>/<i>{flag}</i></code>; these are interpreted as literal regexp and are not anchored.\n                </td>\n              </tr>\n              <tr>\n                <td>\n                  <a name=\"psly-validator-mincheck\"></a>\n                  MinCheck <version>#2.0</version>\n                </td>\n                <td><code>data-parsley-mincheck=\"3\"</code></td>\n                <td>Validates that a certain minimum number of checkboxes in a group are checked.</td>\n              </tr>\n              <tr>\n                <td>\n                  <a name=\"psly-validator-maxcheck\"></a>\n                  MaxCheck <version>#2.0</version>\n                </td>\n                <td><code>data-parsley-maxcheck=\"3\"</code></td>\n                <td>Validates that a certain maximum number of checkboxes in a group are checked.</td>\n              </tr>\n              <tr>\n                <td>\n                  <a name=\"psly-validator-check\"></a>\n                  Check <version>#2.0</version>\n                </td>\n                <td><code>data-parsley-check=\"[1, 3]\"</code></td>\n                <td>Validates that the number of checked checkboxes in a group is within a certain range.</td>\n              </tr>\n              <tr>\n                <td>\n                  <a name=\"psly-validator-equalto\"></a>\n                  Equalto <version>#2.0</version>\n                </td>\n                <td><code>data-parsley-equalto=\"#anotherfield\"</code></td>\n                <td>Validates that the value is identical to another field's value (useful for password confirmation check).</td>\n              </tr>\n            </tbody>\n          </table>\n\n          <p>\n            These validators are shipped in <code>parsley.js</code>. Have a look at <a href=\"#extras\">Parsley Extras</a> for more validators.\n          </p>\n\n          <!-- ****************** CUSTOM VALIDATORS ****************** -->\n          <h1 id=\"custom\" class=\"page-header\">Custom Validators</h1>\n          <h3 id=\"custom-intro\">Craft yours</h3>\n          <p>Of course, Parsley built-in validators are commonly used validators, and you'll need some more that fit your specific forms and validations. That's why Parsley lets you easily create your own validators.</p>\n          <p>\n          <p>The preferred way to register them (after <code>parsley.js</code> is loaded) looks like:</p>\n\n<pre><code>&lt;input type=\"text\" data-parsley-multiple-of=\"3\" /&gt;\n[...]\n&lt;script&gt;\nwindow.Parsley\n  .addValidator('multipleOf', {\n    requirementType: 'integer',\n    validateNumber: function(value, requirement) {\n      return 0 === value % requirement;\n    },\n    messages: {\n      en: 'This value should be a multiple of %s',\n      fr: 'Cette valeur doit être un multiple de %s'\n    }\n  });\n&lt;/script&gt;\n</code></pre>\n          </p>\n          <p>The following sections go over the details on how to define a custom validator</p>\n          <h3 id=\"custom-function\">Validating function</h3>\n          <p>There are many ways a validator can specify how to validate data:</p>\n          <table class=\"table table-stripped table-bordered\">\n            <thead>\n              <tr>\n                <th class=\"col-md-1\">Name</th>\n                <th class=\"col-md-4\">Description</th>\n              </tr>\n            </thead>\n            <tbody>\n              <tr>\n                <td><code>validateString</code></td>\n                <td>Is passed the input's value as a string.</td>\n              </tr>\n              <tr>\n                <td><code>validateNumber</code></td>\n                <td>Use this instead of <code>validateString</code> when only numeric values are acceptable. Parsley will parse the input's value and pass the number, or reject the value if it's not an acceptable number</td>\n              </tr>\n              <tr>\n                <td><code>validateDate</code></td>\n                <td>Define this to treate date values. Parsley will parse the input's value and pass the date, or reject the value if it's not an acceptable date. The format used must be that [of the standard](https://html.spec.whatwg.org/multipage/infrastructure.html#valid-date-string), e.g. \"2017-02-28\". </td>\n              </tr>\n              <tr>\n                <td><code>validateMultiple</code></td>\n                <td>Is passed an array of values, in the case of checkboxes.</td>\n              </tr>\n            </tbody>\n          </table>\n\n          <p>Your custom validator must specify at least one of these. If it can validate both single inputs and multiple (i.e. checkboxes), then you can specify <i>validateMultiple</i> and one of the other two.</p>\n\n          <p>Validating functions should return either <code>true</code> if the value is valid, or <code>false</code> otherwise. It can instead return a jQuery promise that will be resolved if the value is valid, or be rejected otherwise.</p>\n\n          <p>Validators can reject with a custom error message as a first argument if desired.</p>\n\n          <h3 id=\"custom-requirement\">Requirement parameters</h3>\n\n          <p>You can specify what kind of requirement parameter your custom validator is expecting:</p>\n          <table class=\"table table-stripped table-bordered\">\n            <thead>\n              <tr>\n                <th class=\"col-md-1\">Value of <code>requirementType</code></th>\n                <th class=\"col-md-4\">Description</th>\n              </tr>\n            </thead>\n            <tbody>\n              <tr>\n                <td><code>'string'</code></td>\n                <td>The most generic kind; requirement passed as is, with no checking.</td>\n              </tr>\n              <tr>\n                <td><code>'integer'</code></td>\n                <td>For integers only (e.g. used by <code>minlength</code>)</td>\n              </tr>\n              <tr>\n                <td><code>'number'</code></td>\n                <td>To be used when decimal numbers are acceptable</td>\n              </tr>\n              <tr>\n                <td><code>'date'</code></td>\n                <td>To be used for dates. The format used must be that [of the standard](https://html.spec.whatwg.org/multipage/infrastructure.html#valid-date-string), e.g. <code>\"2017-02-28\"</code>.</td>\n              </tr>\n              <tr>\n                <td><code>'regexp'</code></td>\n                <td>Requirement can be either a full regexp string (e.g. <code>/hel+o/i</code>) or just a simple expression (e.g. <code>hel+o</code>)</td>\n              </tr>\n              <tr>\n                <td><code>'boolean'</code></td>\n                <td>Any value other than <code>\"false\"</code> will be considered to <code>true</code>, including the empty string. This is so <code>data-parsley-required</code> and <code>data-parsley-required=true</code> be treated the same way.</td>\n              </tr>\n            </tbody>\n          </table>\n\n          <p>You can also specify an array of these kinds. For example, if a validator has <code>requirementType: ['integer', 'integer']</code>, then given the requirement string <code>\"[1, 2]\"</code> it will receive <code>1</code> and <code>2</code> as second and third arguments (the first one being the value(s) to validate).\n          </p>\n\n          <p>For cases where more complex parameters are needed, you can specify extra parameters; refer to the source and check how the <code>remote</code> validator uses that.</p>\n        </div>\n\n          <h3 id=\"custom-messages\">Error messages</h3>\n          <p>You can specify error messages, in as many locales as desired, using the <code>messages</code> option.</p>\n          <p>This is equivalent to calling <code>addMessage</code> for each locale.</p>\n\n        <!-- ****************** UI/ UX ****************** -->\n        <h1 id=\"ui\" class=\"page-header\">UI/UX</h1>\n        <h3 id=\"ui-overview\">Overview</h3>\n        <p>\n        Parsley ships a UI/UX component that is the only one responsible for classes, error messages, focus or trigger events that alter your page. It strives to be the most UX friendly. Here are the main mottos for ParsleyUI:\n        <ol>\n          <li><strong>Min char validation</strong>: Parsley by default does not proceed with field validation when less than 3 chars have been input. Do not assault your users with error messages too soon!</li>\n          <li><strong>One error at the time</strong>: constraints are prioritized in Parsley, and if several of them are not met for a field on validation, only show the most important one.</li>\n          <li><strong>Quick error removal</strong>: when a field is detected and shown as invalid, further checks are done on each keypress to try to quickly remove error messages once the field is ok.</li>\n          <li><strong>Control focusing on error</strong>: on form submission, the first error field is focused to allow the user to easily start fixing errors.</li>\n        </ol>\n        </p>\n        <p>Naturally, all of this is absolutely customizable; you'll see below how to configure your desired UX behavior.</p>\n\n        <h3 id=\"ui-classes\">Classes and templates</h3>\n        <p>Parsley adds its share of classes and elements, to ease nice UI validation result display. By default, it will add <code>parsley-success</code> and <code>parsley-error</code> classes depending on the validation result, <strong>on the input itself for a simple text, textarea and select input, and on <u>the parent</u> for radio / checkboxes inputs.</strong></p>\n\n        <div class=\"bs-callout bs-callout-info\">\n          <h4>Customize your classes</h4>\n          <p>You could change these classes' names in configuration, and the class holder element too.</p>\n        </div>\n\n        <h3 id=\"ui-for-form\">UI for form</h3>\n        <table class=\"table table-stripped table-bordered\">\n          <thead>\n            <tr>\n              <th class=\"col-md-3\">Name</th>\n              <th class=\"col-md-1\">API</th>\n              <th class=\"col-md-4\">Description</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr>\n              <td>UI Enabled <version>#2.0</version></td>\n              <td><code>data-parsley-ui-enabled=\"false\"</code></td>\n              <td>Activate or deactivate UI</td>\n            </tr>\n            <tr>\n              <td>Focus <version>#2.0</version></td>\n              <td><code>data-parsley-focus=\"first\"</code></td>\n              <td>Focus failing field on form validation. Possible values: <code>'first' | 'last' | 'none'</code></td>\n            </tr>\n          </tbody>\n        </table>\n\n        <h3 id=\"ui-for-field\">UI for field</h3>\n        <table class=\"table table-stripped table-bordered\">\n          <thead>\n            <tr>\n              <th class=\"col-md-3\">Name</th>\n              <th class=\"col-md-1\">API</th>\n              <th class=\"col-md-4\">Description</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr>\n              <td>Trigger <version>#2.0</version></td>\n              <td><code>data-parsley-trigger=\"input\"</code></td>\n              <td>Specify one or many javascript events that will trigger item validation, before any failure. To set multiple events, separate them with a space <code>data-parsley-trigger=\"focusin focusout\"</code>. Default is <code>null</code>. <a href=\"http://api.jquery.com/category/events/\" target=\"_blank\">See the various events supported by jQuery.</a></td>\n            </tr>\n            <tr>\n              <td>Trigger After Failure <version>#2.0</version></td>\n              <td><code>data-parsley-trigger-after-failure=\"focusout\"</code></td>\n              <td>Specify one or many javascript events that will trigger item validation, after the first failure. Default is <a href=\"https://developer.mozilla.org/en-US/docs/Web/Events/input\"><code>'input'</code></a>.</td>\n            </tr>\n            <tr>\n              <td>No focus <version>#2.0</version></td>\n              <td><code>data-parsley-no-focus</code></td>\n              <td>If this field fails, do not focus on it (if <code>first</code> focus strategy is on, next field would be focused, if <code>last</code> strategy is on, previous field would be focused)</td>\n            </tr>\n            <tr>\n              <td>Validation threshold <version>#2.0</version></td>\n              <td><code>data-parsley-validation-threshold=\"10\"</code></td>\n              <td>Used with trigger option above, for all <code>key</code>- events, do not validate until the field has a certain number of characters. Default is <code>3</code></td>\n            </tr>\n            <tr>\n              <td>Class handler <version>#2.0</version></td>\n              <td><code>data-parsley-class-handler=\"#element\"</code></td>\n              <td>Specify the existing DOM container where ParsleyUI should add error and success classes. It is also possible to configure it with a callback function from javascript, see <a href=\"annotated-source/defaults.html\">the annotated source</a>.</td>\n            </tr>\n            <tr>\n              <td>Errors container <version>#2.0</version></td>\n              <td><code>data-parsley-errors-container=\"#element\"</code></td>\n              <td>Specify the existing DOM container where ParsleyUI should put the errors. It is also possible to configure it with a callback function from javascript, see <a href=\"annotated-source/defaults.html\">the annotated source</a>.</td>\n            </tr>\n            <tr>\n              <td>Error message <version>#2.0</version></td>\n              <td><code>data-parsley-error-message=\"my message\"</code></td>\n              <td>Customize a unique global message for the field.</td>\n            </tr>\n            <tr>\n              <td>Validator error message <version>#2.0</version></td>\n              <td><code>data-parsley-`constraint`-message=\"my message\"</code></td>\n              <td>Customize the error message for the field constraint. eg: <code>data-parsley-required-message=\"this field is required\"</code></td>\n            </tr>\n          </tbody>\n        </table>\n\n        <h3 id=\"ui-for-javascript\">UI for javascript</h3>\n        <p>\n          Field instances have low level methods to add, update &amp; remove manage error messages. You have to manage these errors completely manually and they should be independant with other validations. Prefer using custom validations whenever possible.\n          Note that <code>getErrorsMessages</code> only return errors from validations and not manually added errors.\n        </p>\n        <table class=\"table table-stripped table-bordered\">\n          <thead>\n            <tr>\n              <th class=\"col-md-3\">Name</th>\n              <th class=\"col-md-1\">Method</th>\n              <th class=\"col-md-4\">Description</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr>\n              <td>Add error <version>#2.0</version></td>\n              <td><code>addError(name, {message: , assert: , updateClass: true});</code></td>\n              <td>Add an error message.</td>\n            </tr>\n            <tr>\n              <td>Update error <version>#2.0</version></td>\n              <td><code>updateError(name, {message: , assert: , updateClass: true});</code></td>\n              <td>Update an already added error message.</td>\n            </tr>\n            <tr>\n              <td>Remove error <version>#2.0</version></td>\n              <td><code>removeError(name, {updateClass: true});</code></td>\n              <td>Remove an already present error message.</td>\n            </tr>\n          </tbody>\n        </table>\n\n        <!-- ****************** Events ****************** -->\n        <h1 id=\"events\" class=\"page-header\">Events</h1>\n        <h3 id=\"events-overview\">Overview</h3>\n        <p>Parsley triggers events that allows ParsleyUI to work. Further more, it could allow you to do some powerful magic if you listen properly to the right events!</p>\n        <p>For performance reasons, Parsley does not use jQuery events, but the API to listen to events is very similar:\n<pre><code>$('#some-input').parsley().on('field:success', function() {\n  // In here, `this` is the parlsey instance of #some-input\n});\n</code></pre>\n        </p>\n        <p>Similarly to jQuery events, parsley events will bubble up. For example, if a field is about to be validated, the event <code>'field:validate'</code> will be triggerred first on the parsley field instance, then on the parsley form instance (if the field is bound in a form) and finally on the top level <code>window.Parsley</code>\n<pre><code>window.Parsley.on('field:error', function() {\n  // This global callback will be called for any field that fails validation.\n  console.log('Validation failed for: ', this.$element);\n});\n</code></pre>\n        </p>.\n        <h3 id=\"events-list\">Events List</h3>\n        <table class=\"table table-stripped table-bordered\">\n          <thead>\n            <tr>\n              <th class=\"col-md-2\">Name</th>\n              <th class=\"col-md-1\">Instance</th>\n              <th class=\"col-md-1\">Fired by</th>\n              <th class=\"col-md-4\">Description</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr>\n              <td><code>form:init</code> <version>#2.1</version></td>\n              <td><code>ParsleyForm</code></td>\n              <td><code>new Parsley()</code></td>\n              <td>Triggered when a Form is bound for the first time.</td>\n            </tr>\n            <tr>\n              <td><code>form:validate</code> <version>#2.1</version></td>\n              <td><code>ParsleyForm</code></td>\n              <td><code>.validate()</code></td>\n              <td>Triggered when a form validation is triggered, <strong>before</strong> its validation.</td>\n            </tr>\n            <tr>\n              <td><code>form:success</code> <version>#2.1</version></td>\n              <td><code>ParsleyForm</code></td>\n              <td><code>.validate()</code></td>\n              <td>Triggered when a form validation is triggered, <strong>after</strong> its validation succeeds.</td>\n            </tr>\n            <tr>\n              <td><code>form:error</code> <version>#2.1</version></td>\n              <td><code>ParsleyForm</code></td>\n              <td><code>.validate()</code></td>\n              <td>Triggered when a form validation is triggered, <strong>after</strong> its validation fails.</td>\n            </tr>\n            <tr>\n              <td><code>form:validated</code> <version>#2.1</version></td>\n              <td><code>ParsleyForm</code></td>\n              <td><code>.validate()</code></td>\n              <td>Triggered when a form validation is triggered, <strong>after</strong> its validation finishes (with success or with errors).</td>\n            </tr>\n            <tr>\n              <td><code>form:submit</code> <version>#2.2</version></td>\n              <td><code>ParsleyForm</code></td>\n              <td><code>submit()</code></td>\n              <td>Triggered when after a form validation succeeds and before the form is actually submitted.<br>\n                Return `false` to interrupt submission.</td>\n            </tr>\n            <tr>\n              <td><code>field:init</code> <version>#2.1</version></td>\n              <td><code>ParsleyField</code></td>\n              <td><code>new Parsley()</code></td>\n              <td>Triggered when a Field is bound for the first time.</td>\n            </tr>\n            <tr>\n              <td><code>field:validate</code> <version>#2.1</version></td>\n              <td><code>ParsleyField</code></td>\n              <td><code>.validate()</code></td>\n              <td>Triggered when a field validation is triggered, <strong>before</strong> its validation.</td>\n            </tr>\n            <tr>\n              <td><code>field:success</code> <version>#2.1</version></td>\n              <td><code>ParsleyField</code></td>\n              <td><code>.validate()</code></td>\n              <td>Triggered when a field validation succeeds.</td>\n            </tr>\n            <tr>\n              <td><code>field:error</code> <version>#2.1</version></td>\n              <td><code>ParsleyField</code></td>\n              <td><code>.validate()</code></td>\n              <td>Triggered when a field validation fails.</td>\n            </tr>\n            <tr>\n              <td><code>field:validated</code> <version>#2.1</version></td>\n              <td><code>ParsleyField</code></td>\n              <td><code>.validate()</code></td>\n              <td>Triggered after a field is validated (with success or with errors).</td>\n            </tr>\n          </tbody>\n        </table>\n\n        <!-- ****************** Remote ****************** -->\n        <h1 id=\"remote\" class=\"page-header\">Parsley Remote</h1>\n        <p>\n          Parsley <a href=\"annotated-source/remote.html\" target=\"_blank\">remote</a> is an easy to use <strong>ajax asynchronous validator</strong>.\n        </p>\n\n        <h3 id=\"remote-options\">Options</h3>\n        <table class=\"table table-stripped table-bordered\">\n          <thead>\n            <tr>\n              <th class=\"col-md-3\">Name</th>\n              <th class=\"col-md-1\">API</th>\n              <th class=\"col-md-4\">Description</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr>\n              <td>Remote validator</td>\n              <td><code>data-parsley-remote</code> <version>#2.0</version></td>\n              <td>Define the url that will be called to validate the entered content. e.g. <code>data-parsley-remote=\"http://url.ext\"</code>.\n                <br>If the url contains the string <code>\"{value}\"</code>, the value will replace it in the URL (typical of RESTful APIs),\n                otherwise the value will be passed as a data parameter, with the key being the input's name or ID.</td>\n            </tr>\n            <tr>\n              <td>Reverse</td>\n              <td><code>data-parsley-remote-reverse</code> <version>#2.0</version></td>\n              <td>By default, all 2xx ajax returs are considered valid, all others failure. Sometimes (when a call is needed to see if an email, a pseudo is available for example) a 404 API answer could be the right answer. Using <code>data-parsley-remote-reverse=\"true\"</code> will consider 200 response is an error, and 404 one is correct.</td>\n            </tr>\n            <tr>\n              <td>Options</td>\n              <td><code>data-parsley-remote-options</code> <version>#2.0</version></td>\n              <td>You could pass a json object to the <code>$.ajax()</code> method used by remote validator. eg: <pre>data-parsley-remote-options='{ \"type\": \"POST\", \"dataType\": \"jsonp\", \"data\": { \"token\": \"value\" } }'</pre>\n              <span class=\"label label-warning\">Warning:</span> you must format your JSON string wrapping all the keys/values with <code>\"</code> like above otherwise it won't be correctly parsed by <code>$.parseJSON()</code> used behind the scenes by remote validator (<a href=\"https://api.jquery.com/jQuery.parseJSON/\" target=\"_blank\">See jQuery doc</a>)</td>\n            </tr>\n            <tr>\n              <td>Validator</td>\n              <td><code>data-parsley-remote-validator</code> <version>#2.0</version></td>\n              <td><p>Use a specific remote validator. By default, there are 2 built-in remote validators: <code>default</code> and <code>reverse</code>. Default one is used by default and Reverse one used when <code>data-parsley-remote-reverse</code> is set to true. (this is an alias, you could use <code>data-parsley-remote-validator=\"reverse\"</code>).</p>\n                  <p>Inside the function, <code>this</code> keyword refers to the <code>ParsleyField</code> instance attached to the form element. You have access to the plugin as well as the element if you need to perform other actions before returning the validation result.</p>\n                  <p>To learn how to craft your custom remote validators, go <a href=\"#remote-custom\">here</a>.</p></td>\n            </tr>\n          </tbody>\n        </table>\n\n        <h3 id=\"remote-events\">Events</h3>\n        <table class=\"table table-stripped table-bordered\">\n          <thead>\n            <tr>\n              <th class=\"col-md-2\">Name</th>\n              <th class=\"col-md-1\">Instance</th>\n              <th class=\"col-md-1\">Fired by</th>\n              <th class=\"col-md-4\">Description</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr>\n              <td><code>field:ajaxoptions</code> <version>#2.2</version></td>\n              <td><code>ParsleyField</code></td>\n              <td><code>whenIsValid</code> &amp; al.</td>\n              <td>Triggered just before an ajax request is sent, so one can tweak the options passed to <code>$.ajax</code>. Options are passed as a second parameter.</td>\n            </tr>\n          </tbody>\n        </table>\n\n        <h3 id=\"remote-methods\">Methods</h3>\n        <table class=\"table table-stripped table-bordered\">\n          <thead>\n            <tr>\n              <th class=\"col-md-1\">Method</th>\n              <th class=\"col-md-4\">Description</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr>\n              <td><code>Parsley.addAsyncValidator(name, fn)</code> <version>#2.0</version></td>\n              <td>Specify custom validator for Ajax results.</td>\n            </tr>\n          </tbody>\n        </table>\n\n        <h3 id=\"remote-custom\">Custom remote validators</h3>\n        <p>If you need some custom processing of Ajax responses, configure your custom remote as follows:\n<pre><code>&lt;input name=\"q\" type=\"text\" data-parsley-remote data-parsley-remote-validator='mycustom' value=\"foo\" /&gt;\n[...]\n&lt;script&gt;\nwindow.Parsley.addAsyncValidator('mycustom', function (xhr) {\n    console.log(this.$element); // jQuery Object[ input[name=\"q\"] ]\n\n    return 404 === xhr.status;\n  }, 'http://mycustomapiurl.ext');\n&lt;/script&gt;\n</code></pre>\n\n        </p>\n\n        <h3 id=\"remote-validation\">Combining Remote Validations with Groups</h3>\n        <p>If you need to trigger validate outside of form submission, such as with <code>data-parsley-group=\"group-name\"</code>, you'll need to make use of the promises provided in <code>whenValidate({group, force})</code>. The <code>validate({group, force})</code> method that returns a <code>boolean</code> or <code>null</code> will always return <code>null</code> due to remote validation always returning open promises.\n<pre><code>&lt;script type=\"text/javascript\">\n$(\"form\").parsley().whenValidate({\n  group: 2\n}).done(function() {\n  // trigger step change\n});\n&lt;/script&gt;\n</code></pre>\n\n        </p>\n\n        <!-- ****************** Extras ****************** -->\n        <h1 id=\"extras\" class=\"page-header\">Parsley Extras</h1>\n        <p>\n          You'll find in the <code>src/extra/</code> directory in Parsley .zip or Github projects many more or less useful validators crafted by the community. A doc here is coming.\n        </p>\n        <h3 id=\"extras-validators-list\">Validators list</h3>\n        <table class=\"table table-stripped table-bordered\">\n          <thead>\n           <tr>\n             <th class=\"col-md-2\">Name</th>\n             <th class=\"col-md-4\">API</th>\n             <th class=\"col-md-5\">Description</th>\n           </tr>\n         </thead>\n         <tbody>\n           <tr>\n             <td>\n               <a name=\"psly-validator-gt\"></a>\n               Greater than <version>#2.0</version>\n             </td>\n             <td>\n               <table class=\"table-stripped hundred\">\n                 <tr>\n                   <td><code>data-parsley-gt=\"#anotherfield\"</code></td>\n                   <td></td>\n                 </tr>\n                 <tr>\n                   <td><code>data-parsley-gt=\"6\"</code></td>\n                   <td></td>\n                 </tr>\n               </table>\n             </td>\n             <td>Validates that the value is greater than another field's value or some strict minimum number.</td>\n           </tr>\n           <tr>\n             <td>\n               <a name=\"psly-validator-gte\"></a>\n               Greater than or equal to <version>#2.0</version>\n             </td>\n             <td>\n               <table class=\"table-stripped hundred\">\n                 <tr>\n                   <td><code>data-parsley-gte=\"#anotherfield\"</code></td>\n                   <td></td>\n                 </tr>\n                 <tr>\n                   <td><code>data-parsley-gte=\"6\"</code></td>\n                   <td></td>\n                 </tr>\n               </table>\n             </td>\n             <td>Validates that the value is greater than or equal to another field's value or some minimum number.</td>\n           </tr>\n           <tr>\n             <td>\n               <a name=\"psly-validator-lt\"></a>\n               Less than <version>#2.0</version>\n             </td>\n             <td>\n               <table class=\"table-stripped hundred\">\n                 <tr>\n                   <td><code>data-parsley-lt=\"#anotherfield\"</code></td>\n                   <td></td>\n                 </tr>\n                 <tr>\n                   <td><code>data-parsley-lt=\"6\"</code></td>\n                   <td></td>\n                 </tr>\n               </table>\n             </td>\n             <td>Validates that the value is less than another field's value or some strict maximum number.</td>\n           </tr>\n           <tr>\n             <td>\n               <a name=\"psly-validator-lte\"></a>\n               Less than or equal to <version>#2.0</version>\n             </td>\n             <td>\n               <table class=\"table-stripped hundred\">\n                 <tr>\n                   <td><code>data-parsley-lte=\"#anotherfield\"</code></td>\n                   <td></td>\n                 </tr>\n                 <tr>\n                   <td><code>data-parsley-lte=\"6\"</code></td>\n                   <td></td>\n                 </tr>\n               </table>\n             </td>\n             <td>Validates that the value is less than or equal to another field's value or some maximum number.</td>\n           </tr>\n           <tr>\n             <td>\n               <a name=\"psly-validator-minwords\"></a>\n               Minwords <version>#2.0</version>\n             </td>\n             <td>\n               <table class=\"table-stripped hundred\">\n                 <tr>\n                   <td><code>data-parsley-minwords=\"200\"</code></td>\n                   <td></td>\n                 </tr>\n               </table>\n             </td>\n             <td>Validates that the value have at least a certain amount of words</td>\n           </tr>\n           <tr>\n             <td>\n               <a name=\"psly-validator-maxwords\"></a>\n               Maxwords <version>#2.0</version>\n             </td>\n             <td>\n               <table class=\"table-stripped hundred\">\n                 <tr>\n                   <td><code>data-parsley-maxwords=\"200\"</code></td>\n                   <td></td>\n                 </tr>\n               </table>\n             </td>\n             <td>Validates that the value have a maximum of a certain amount of words</td>\n           </tr>\n           <tr>\n             <td>\n               <a name=\"psly-validator-words\"></a>\n               Words <version>#2.0</version>\n             </td>\n             <td>\n               <table class=\"table-stripped hundred\">\n                 <tr>\n                   <td><code>data-parsley-words=\"[200, 600]\"</code></td>\n                   <td></td>\n                 </tr>\n               </table>\n             </td>\n             <td>Validates that the value is within a certain range of words</td>\n           </tr>\n         </tbody>\n        </table>\n      </div>\n\n      <div class=\"col-md-3\">\n        <div class=\"sidebar hidden-print affix-top\" role=\"complementary\">\n          <ul class=\"nav sidenav\">\n              <li class=\"active\">\n                <a href=\"#overview\">Overview</a>\n                <ul class=\"nav\">\n                  <li><a href=\"#frontend-form-validation\">Frontend form validation</a></li>\n                  <li><a href=\"#data-attrs\">Data attributes</a></li>\n                  <li><a href=\"#configuration\">Configuration</a></li>\n                </ul>\n              </li>\n              <li>\n                <a href=\"#installation\">Installation</a>\n                <ul class=\"nav\">\n                  <li><a href=\"#installation-basic\">Basic installation</a></li>\n                  <li><a href=\"#installation-javascript\">Javascript installation</a></li>\n                  <li><a href=\"#installation-localization\">Localization</a></li>\n                  <li><a href=\"#installation-plugins\">Plugins</a></li>\n                </ul>\n              </li>\n              <li>\n                <a href=\"#usage\">Usage</a>\n                <ul class=\"nav\">\n                  <li><a href=\"#usage-overview\">Overview</a></li>\n                  <li><a href=\"#usage-configuration\">Configuration</a></li>\n                  <li><a href=\"#usage-form\">Form</a></li>\n                  <li><a href=\"#usage-field\">Field</a></li>\n                </ul>\n              </li>\n              <li>\n                <a href=\"#validators\">Built-in validators</a>\n                <ul class=\"nav\">\n                  <li><a href=\"#validators-overview\">Overview</a></li>\n                  <li><a href=\"#validators-list\">Built-in validators list</a></li>\n                </ul>\n              </li>\n              <li>\n                <a href=\"#custom\">Custom validators</a>\n                <ul class=\"nav\">\n                  <li><a href=\"#custom-intro\">Craft yours!</a></li>\n                  <li><a href=\"#custom-function\">Validating functions</a></li>\n                  <li><a href=\"#custom-requirement\">Requirement parameters</a></li>\n                  <li><a href=\"#custom-messages\">Error messages</a></li>\n                </ul>\n              </li>\n              <li>\n                <a href=\"#ui\">UI/UX</a>\n                <ul class=\"nav\">\n                  <li><a href=\"#ui-overview\">Overview</a></li>\n                  <li><a href=\"#ui-classes\">Class & templates</a></li>\n                  <li><a href=\"#ui-for-form\">UI for Form</a></li>\n                  <li><a href=\"#ui-for-field\">UI for Field</a></li>\n                  <li><a href=\"#ui-for-javascript\">UI for javascript</a></li>\n                </ul>\n              </li>\n              <li>\n                <a href=\"#events\">Events</a>\n                <ul class=\"nav\">\n                  <li><a href=\"#events-overview\">Overview</a></li>\n                  <li><a href=\"#events-list\">List</a></li>\n                </ul>\n              </li>\n              <li>\n                <a href=\"#remote\">Parsley Remote</a>\n                <ul class=\"nav\">\n                  <li><a href=\"#remote-options\">Options</a></li>\n                  <li><a href=\"#remote-events\">Events</a></li>\n                  <li><a href=\"#remote-methods\">Methods</a></li>\n                  <li><a href=\"#remote-custom\">Custom remote validators</a></li>\n                </ul>\n              </li>\n              <li>\n                <a href=\"#extras\">Parsley Extras</a>\n                <ul class=\"nav\">\n                  <li><a href=\"#extras-validators-list\">Validators list</a></li>\n                </ul>\n              </li>\n          </ul>\n          <a class=\"back-to-top\" href=\"#top\">\n              Back to top\n          </a>\n\n          <div id=\"mailing-list\">\n            <!-- Begin MailChimp Signup Form -->\n            <link href=\"//cdn-images.mailchimp.com/embedcode/slim-081711.css\" rel=\"stylesheet\">\n            <style>\n              #mc_embed_signup{background:#fff; clear:left; font:14px Helvetica,Arial,sans-serif; }\n              /* Add your own MailChimp form style overrides in your site stylesheet or in this style block.\n                 We recommend moving this block and the preceding CSS link to the HEAD of your HTML file. */\n            </style>\n            <div id=\"mc_embed_signup\">\n            <form action=\"http://parsleyjs.us3.list-manage.com/subscribe/post?u=a39bf787b85f4d1b576367606&amp;id=d7374bb2d8\" method=\"post\" id=\"mc-embedded-subscribe-form\" name=\"mc-embedded-subscribe-form\" class=\"validate\" target=\"_blank\" data-parsley-validate>\n              <label for=\"mce-EMAIL\">Subscribe to Parsley mailing list</label>\n              <small>Receive a mail each 2.x new release, and sometimes an email asking for your feedback (twice a year max!)</small>\n              <input type=\"email\" data-parsley-error-message=\"<strong>What did you expect? That on Parsley's own documentation, there wouldn't be validation here? ;)</strong>\" value=\"\" name=\"EMAIL\" class=\"email\" id=\"mce-EMAIL\" placeholder=\"email address\" required>\n                <!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups-->\n                <div style=\"position: absolute; left: -5000px;\"><input type=\"text\" name=\"b_a39bf787b85f4d1b576367606_d7374bb2d8\" value=\"\"></div>\n              <div class=\"clear\"><input type=\"submit\" value=\"Subscribe\" name=\"subscribe\" id=\"mc-embedded-subscribe\" class=\"button\"></div>\n            </form>\n            </div>\n            <!--End mc_embed_signup-->\n          </div>\n\n        </div>\n      </div>\n      <div class=\"clearfix\"></div>\n\n      <!-- Site footer -->\n      <div class=\"footer\">\n        <p>&copy; <a href=\"https://twitter.com/guillaumepotier\" title=\"Guillaume Potier on Twitter\">Guillaume Potier</a> 2014 - <a href=\"http://wisembly.com\">@Wisembly</a></p>\n      </div>\n    </div>\n\n    <script src=\"../bower_components/jquery/dist/jquery.min.js\"></script>\n    <script src=\"../bower_components/bootstrap/js/affix.js\"></script>\n    <script src=\"../bower_components/bootstrap/js/scrollspy.js\"></script>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/7.3/highlight.min.js\"></script>\n    <script src=\"assets/docs.js\"></script>\n    <script src=\"../dist/parsley.min.js\"></script>\n\n    <script>\n      try {\n        hljs.initHighlightingOnLoad();\n      } catch ( err ) {}\n\n      var _gaq = _gaq || [];\n      _gaq.push(['_setAccount', 'UA-37229467-1']);\n      _gaq.push(['_trackPageview']);\n\n      (function() {\n        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;\n        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';\n        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);\n      })();\n    </script>\n\n  </body>\n</html>\n"
  },
  {
    "path": "doc/tests.html",
    "content": "\n<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Parsley, the ultimate frontend javascript form validation library\">\n    <meta name=\"author\" content=\"Guillaume Potier\">\n\n    <title>Parsley - Test suite</title>\n\n    <!-- Mochat tests css -->\n    <link rel=\"stylesheet\" href=\"../bower_components/mocha/mocha.css\">\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../bower_components/bootstrap/dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"assets/docs.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js\"></script>\n      <script src=\"https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js\"></script>\n    <![endif]-->\n\n    <script src=\"../bower_components/mocha/mocha.js\"></script>\n    <script src=\"../bower_components/expect.js/index.js\"></script>\n    <script src=\"../bower_components/sinonjs/sinon.js\"></script>\n    <script src=\"../bower_components/jquery/dist/jquery.js\"></script>\n\n    <script src=\"assets/spec-build.js\"></script>\n\n    <style>#element { display: none; }</style>\n  </head>\n\n  <body>\n    <div class=\"container\">\n      <div class=\"masthead\">\n        <div class=\"header\">\n          <h3 class=\"text-muted\"><a href=\"../\">Parsley</a></h3>\n\n          <span class=\"social-buttons inline-block\">\n            <a href=\"https://twitter.com/share\" class=\"twitter-share-button\" data-url=\"http://parsleyjs.org\" data-text=\"Parsley, the ultimate javascript form validation library. #parsleyjs\" data-via=\"guillaumepotier\" data-related=\"guillaumepotier\" data-hashtags=\"parsleyjs\">Tweet</a>\n            <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>\n\n            <iframe src=\"http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=watch&count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"110\" height=\"20\"></iframe>\n\n            <iframe src=\"http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=fork&count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"110\" height=\"20\"></iframe>\n          </span>\n\n        </div>\n\n        <ul class=\"nav nav-justified\">\n          <li><a href=\"../index.html\">Home</a></li>\n          <li><a href=\"examples.html\">Examples</a></li>\n          <li><a href=\"index.html\">Documentation</a></li>\n          <li><a href=\"download.html\">Download</a></li>\n          <li><a href=\"help.html\">Help</a></li>\n          <li><a href=\"annotated-source/main.html\">Annotated&nbsp;source</a></li>\n          <li class=\"active\"><a href=\"tests.html\">Tests</a></li>\n          <li><a href=\"about.html\">About</a></li>\n        </ul>\n\n\n        <div id=\"info\"></div>\n        <div id=\"mocha\"></div>\n\n        <!-- Site footer -->\n        <div class=\"footer\">\n          <p>&copy; <a href=\"https://twitter.com/guillaumepotier\" title=\"Guillaume Potier on Twitter\">Guillaume Potier</a> 2014 - <a href=\"http://wisembly.com\">@Wisembly</a></p>\n        </div>\n      </div>\n    </div>\n\n    <script>\n      var _gaq = _gaq || [];\n      _gaq.push(['_setAccount', 'UA-37229467-1']);\n      _gaq.push(['_trackPageview']);\n\n      (function() {\n        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;\n        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';\n        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);\n      })();\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "gulpfile.babel.js",
    "content": "import {src, dest, series, parallel}  from 'gulp';\nimport loadPlugins from 'gulp-load-plugins';\nimport del  from 'del';\nimport glob  from 'glob';\nimport path  from 'path';\nimport docco  from 'docco';\nimport {spawn} from 'child_process';\nimport manifest  from './package.json';\nimport mocha from './tools/mocha_options.js';\nimport {rollup} from 'rollup';\nimport {rollupOptions} from './tools/rollup_options.js';\nimport defaultRollupOptions from './rollup.config.js';\n\n// Load all of our Gulp plugins\nconst $ = loadPlugins();\n\n// Gather the library data from `package.json`\nconst config = manifest.babelBoilerplateOptions;\nconst mainFile = manifest.main;\nconst destinationFolder = path.dirname(mainFile);\nconst exportFileName = path.basename(mainFile, path.extname(mainFile));\n\n// Lint a set of files\nfunction lint(files) {\n  return src(files)\n    .pipe($.eslint())\n    .pipe($.eslint.format())\n    .pipe($.eslint.failOnError());\n}\n\nasync function buildRollup(...rules) {\n  rules.forEach(async opt => {\n    const bundle = await rollup(opt);\n    await bundle.write(opt.output);\n  });\n}\n\n// Build the annotated documentation\nexport function buildDoc(done) {\n  var dest = 'doc/annotated-source/';\n  var sources = glob.sync('src/parsley/*.js');\n  var doccoOpts = {\n    layout: 'parallel',\n    output: dest,\n    args: sources\n  };\n\n  // This pattern usually isn't recommended but this would need a lot more refactoring otherwise\n  series(\n    () => del(dest + '*'),\n    (cb) = docco.document(doccoOpts, cb),\n    () => src(dest + '*.html', { base: \"./\" })\n      .pipe($.replace('<div id=\"jump_page\">', '<div id=\"jump_page\"><a class=\"source\" href=\"../index.html\">&lt;&lt;&lt; back to documentation</a>'))\n      .pipe($.replace('</body>', '<script>var _gaq=_gaq||[];_gaq.push([\"_setAccount\",\"UA-37229467-1\"]);_gaq.push([\"_trackPageview\"]);(function(){var e=document.createElement(\"script\");e.type=\"text/javascript\";e.async=true;e.src=(\"https:\"==document.location.protocol?\"https://ssl\":\"http://www\")+\".google-analytics.com/ga.js\";var t=document.getElementsByTagName(\"script\")[0];t.parentNode.insertBefore(e,t)})();</script></body>'))\n      .pipe(dest('.'))\n  )(done)\n}\nbuildDoc.displayName = 'build-doc';\n\nfunction copyI18n() {\n  return src(['src/i18n/*.js'])\n    .pipe($.replace(\"import Parsley from '../parsley';\", \"// Load this after Parsley\"))  // Quick hack\n    .pipe($.replace(\"import Parsley from '../parsley/main';\", \"\"))  // en uses special import\n    .pipe(dest('dist/i18n/'))\n}\n\nexport function writeVersion() {\n  return src(['index.html', 'doc/download.html', 'README.md'], { base: \"./\" })\n    .pipe($.replace(/class=\"parsley-version\">[^<]*</, `class=\"parsley-version\">v${manifest.version}<`))\n    .pipe($.replace(/releases\\/tag\\/[^\"]*/, `releases/tag/${manifest.version}`))\n    .pipe($.replace(/## Version\\n\\n\\S+\\n\\n/, `## Version\\n\\n${manifest.version}\\n\\n`))\n    .pipe(dest('.'))\n}\nwriteVersion.displayName = 'write-version';\n\n// Build the annotated documentation\nexport function buildDocTest() {\n  return build(rollupOptions({\n    input: 'test/setup/browser.js',\n    file: './doc/assets/spec-build.js',\n  }));\n}\nbuildDocTest.displayName = 'build-doc-test';\n\nfunction runTests() {\n  return src(['test/setup/node.js', 'test/unit/index.js'], {read: false})\n    .pipe($.mocha({reporter: 'dot', globals: mocha.globals, require: ['@babel/register']}));\n}\nrunTests.displayName = 'test';\n\n// Build for our spec runner `test/runner.html`\nexport function testBrowser() {\n  buildRollup(rollupOptions({\n    input: 'test/setup/browser.js',\n    file: './tmp/__spec-build.js',\n  }));\n}\ntestBrowser.displayName = 'test-browser';\n\nexport function gitClean(done) {\n  $.git.status({args : '--porcelain'}, (err, stdout) => {\n    if (err) throw err;\n    if (/^ ?M/.test(stdout)) throw 'You have uncommitted changes!'\n    done();\n  });\n}\ngitClean.displayName = 'release-git-clean';\n\nexport function npmPublish() {\n  return spawn('npm', ['publish'], { stdio: 'inherit' });\n}\nnpmPublish.displayName = 'release-npm-publish';\n\nexport function gitPush() {\n  return $.git.push('origin', 'master', {args: '--follow-tags'});\n}\ngitPush.displayName = 'release-git-push';\n\nexport function gitPushPages() {\n  return $.git.push('origin', 'master:gh-pages');\n}\ngitPushPages.displayName = 'release-git-push-pages';\n\nexport function gitTag() {\n  return $.git.tag(manifest.version, '', {quiet: false});\n}\ngitTag.displayName = 'release-git-tag';\n\nexport const release = series(gitClean, gitTag, gitPush, gitPushPages, npmPublish);\n\n// Remove the built files\nexport const clean = () => del(destinationFolder);\n\n// Remove our temporary files\nexport const cleanTmp = () => del('tmp');\ncleanTmp.displayName = 'clean-tmp';\n\n// Lint our source code\nexport const lintSrc = () => lint('src/**/*.js');\nlintSrc.displayName = 'lint-src';\n\n// Lint our test code\nexport const lintTest = () => lint('test/**/*.js');\nlintTest.displayName = 'lint-test';\n\n// Build the i18n translations\nexport const buildI18n = series(clean, copyI18n);\nbuildI18n.displayName = 'build-i18n';\n\n// Build two versions of the library\nexport const buildSrc = series(\n  parallel(lintSrc, clean, buildI18n),\n  () => buildRollup(...defaultRollupOptions)\n);\nbuildSrc.displayName = 'build-src';\n\nexport const build = series(\n  parallel(buildSrc, buildI18n, buildDoc, buildDocTest),\n  writeVersion\n);\n\n// Lint and run our tests\nexport const test = series(parallel(lintSrc, lintTest), runTests);\n\n// An alias of test\nexport default test;\n"
  },
  {
    "path": "index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"Parsley, the ultimate frontend javascript form validation library\">\n    <meta name=\"author\" content=\"Guillaume Potier\">\n\n    <title>Parsley - The ultimate JavaScript form validation library</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"bower_components/bootstrap/dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"doc/assets/docs.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js\"></script>\n      <script src=\"https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js\"></script>\n    <![endif]-->\n    <style>\n      body {\n        padding: 0px;\n      }\n      .jumbotron h1 strong {\n        color: #FF851B;\n      }\n      .jumbotron h1 em {\n        font-style: normal;\n        font-weight: bolder;\n      }\n      .jumbotron p em {\n        font-weight: bolder;\n      }\n      .jumbotron {\n        padding-top: 30px;\n        padding-bottom: 10px;\n      }\n      .btn-go, .btn-go:hover {\n        color: white;\n        font-weight: bold;\n        text-shadow: #2ECC00 1px 2px 2px;\n        background: #2ECC40;\n      }\n      .btn-go:hover {\n        background: #FF851B;\n        text-shadow: #FF851B 1px 2px 2px;\n      }\n      /* Link styles (used on .masthead-links as well) */\n      .jumbotron a {\n        -webkit-transition: all .2s ease-in-out;\n           -moz-transition: all .2s ease-in-out;\n                transition: all .2s ease-in-out;\n      }\n      .row h2 {\n        color: #FF851B;\n      }\n      .row p {\n        text-align: justify;\n      }\n      .argument {\n        min-height: 90px;\n      }\n      .argument.shorter {\n        min-height: 70px;\n      }\n      .version {\n        font-size: 0.6em;\n        color: #949494;\n      }\n      #parsley2 {\n        color: white;\n        font-weight: bolder;\n        background: orange;\n        position:fixed;\n        top:0;\n        width: 100%;\n        padding: 10px;\n      }\n      #parsley2 a {\n        color: white !important;\n        text-decoration: underline;\n      }\n      .container-narrow {\n        margin-top: 100px;\n      }\n    </style>\n  </head>\n\n  <body>\n    <div class=\"container\">\n      <div class=\"masthead\">\n        <div class=\"header\">\n          <h3 class=\"text-muted\"><a href=\"#\">Parsley</a></h3>\n\n          <span class=\"social-buttons inline-block\">\n            <a href=\"https://twitter.com/share\" class=\"twitter-share-button\" data-url=\"http://parsleyjs.org\" data-text=\"Parsley, the ultimate JavaScript form validation library. #parsleyjs\" data-via=\"guillaumepotier\" data-related=\"guillaumepotier\" data-hashtags=\"parsleyjs\">Tweet</a>\n            <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>\n\n            <iframe src=\"http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=watch&count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"110\" height=\"20\"></iframe>\n\n            <iframe src=\"http://ghbtns.com/github-btn.html?user=guillaumepotier&repo=Parsley.js&type=fork&count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"110\" height=\"20\"></iframe>\n          </span>\n\n        </div>\n\n        <ul class=\"nav nav-justified\">\n          <li class=\"active\"><a href=\"#\">Home</a></li>\n          <li><a href=\"doc/examples.html\">Examples</a></li>\n          <li><a href=\"doc/index.html\">Documentation</a></li>\n          <li><a href=\"doc/download.html\">Download</a></li>\n          <li><a href=\"doc/help.html\">Help</a></li>\n          <li><a href=\"doc/annotated-source/main.html\">Annotated&nbsp;source</a></li>\n          <li><a href=\"doc/tests.html\">Tests</a></li>\n          <li><a href=\"doc/about.html\">About</a></li>\n        </ul>\n      </div>\n\n      <!-- Jumbotron -->\n      <div class=\"jumbotron\">\n        <h1><em>Parsley</em>, the <strong>ultimate</strong> JavaScript <strong>form validation</strong> library</h1>\n        <p class=\"lead\">Validating forms frontend have never been so <em>powerful</em> and <em>easy</em>.</p>\n        <p><a class=\"btn btn-lg btn-go\" href=\"doc/index.html\" role=\"button\">Get started today</a></p>\n        <p class=\"version\"><i class=\"icon glyphicon glyphicon-tag\"></i>&nbsp;<span class=\"parsley-version\">v2.9.2</span></p>\n      </div>\n\n      <!-- Example row of columns -->\n      <div class=\"row\">\n\n        <div class=\"col-lg-4\">\n          <h2>Intuitive DOM API</h2>\n          <p class=\"argument\">Like no other form validation library, simply <strong>write in English your requirements inside your form HTML tags</strong>, Parsley will do the rest! <strong>No need to write even a single JavaScript line for simple form validation.</strong></p>\n          <p><a href=\"doc/examples.html\">View example &raquo;</a></p>\n       </div>\n        <div class=\"col-lg-4\">\n          <h2>Dynamic form validation</h2>\n          <p class=\"argument\">Parsley is now smarter, <strong>it automatically detects your forms' modifications</strong> and adapts its validation accordingly. Simply add, remove or edit fields, Parsley validation will follow!</p>\n          <p><a href=\"doc/examples.html\">View example &raquo;</a></p>\n        </div>\n        <div class=\"col-lg-4\">\n          <h2>Tons of built-in validators</h2>\n          <p class=\"argument\">Parsley is <strong>shipped with more than a dozen useful validators</strong>. If not enough, use the <strong>awesome Parsley extra Ajax validator</strong> or tons of other extended validators provided by the community. </p>\n          <p><a href=\"doc/index.html#validators\">View details &raquo;</a></p>\n        </div>\n      </div>\n\n      <!-- Example row of columns -->\n      <div class=\"row\">\n        <div class=\"col-lg-4\">\n          <h2>UX focused</h2>\n          <p class=\"argument shorter\">Parsley strongly focuses on <abbr title=\"user interface\">#UI</abbr> and <abbr title=\"user experience\">#UX</abbr>.<strong> Override almost every Parsley default behavior</strong> to fit your <strong>exact needs</strong>.</p>\n          <p><a href=\"doc/index.html#ui\">View documentation &raquo;</a></p>\n        </div>\n        <div class=\"col-lg-4\">\n          <h2>Super reliable</h2>\n          <p class=\"argument shorter\">Still <em>ships almost bug free</em>. Parsley is <a href=\"https://travis-ci.org/guillaumepotier/Parsley.js\"><strong>strongly tested</strong></a>, and <strong>aims to work on every browser (including IE8).</strong></p>\n          <p><a href=\"doc/tests.html\">View tests &raquo;</a></p>\n        </div>\n        <div class=\"col-lg-4\">\n          <h2>Free</h2>\n          <p class=\"argument shorter\">Parsley is <strong>Open Source, MIT licensed</strong>, and developed to help everyone. It will <strong>stay that way.</strong> <a href=\"https://github.com/guillaumepotier/Parsley.js\">Join us on Github!</a></p>\n          <p><a href=\"https://raw.githubusercontent.com/guillaumepotier/Parsley.js/master/LICENSE\">View license &raquo;</a></p>\n        </div>\n\n      </div>\n\n      <!-- Site footer -->\n      <div class=\"footer\">\n        <p>&copy; <a href=\"https://twitter.com/guillaumepotier\" title=\"Guillaume Potier on Twitter\">Guillaume Potier</a> &amp; <a href=\"https://twitter.com/malafortune\" title=\"Marc-André Lafortune on Twitter\">Marc-André Lafortune</a> 2017 - <a href=\"http://wisembly.com\">@Wisembly</a></p>\n      </div>\n\n    </div> <!-- /container -->\n\n    <script>\n      var _gaq = _gaq || [];\n      _gaq.push(['_setAccount', 'UA-37229467-1']);\n      _gaq.push(['_trackPageview']);\n\n      (function() {\n        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;\n        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';\n        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);\n      })();\n\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"parsleyjs\",\n  \"version\": \"2.9.2\",\n  \"homepage\": \"http://parsleyjs.org\",\n  \"license\": \"MIT\",\n  \"description\": \"Validate your forms, frontend, without writing a single line of javascript!\",\n  \"main\": \"dist/parsley.js\",\n  \"scripts\": {\n    \"test\": \"gulp\",\n    \"test-browser\": \"gulp test-browser\",\n    \"build\": \"gulp build\",\n    \"coverage\": \"gulp coverage\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/guillaumepotier/Parsley.js.git\"\n  },\n  \"keywords\": [\n    \"parsley\",\n    \"form\",\n    \"validation\",\n    \"html5\",\n    \"polyfill\",\n    \"es6\"\n  ],\n  \"author\": {\n    \"name\": \"Guillaume Potier\",\n    \"email\": \"guillaume@wisembly.com\",\n    \"url\": \"http://guillaumepotier.com/\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/guillaumepotier/Parsley.js/issues\"\n  },\n  \"dependencies\": {\n    \"jquery\": \">=1.8.0\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.0.0\",\n    \"@babel/plugin-transform-object-assign\": \"^7.0.0\",\n    \"@babel/polyfill\": \"^7.0.0\",\n    \"@babel/preset-env\": \"^7.0.0\",\n    \"@babel/register\": \"^7.0.0\",\n    \"del\": \"^5.1.0\",\n    \"docco\": \"~0.6.3\",\n    \"expect.js\": \"*\",\n    \"glob\": \"^5.0.14\",\n    \"gulp\": \"~4.0.0\",\n    \"gulp-cli\": \"^2.0.0\",\n    \"gulp-eslint\": \"*\",\n    \"gulp-git\": \"*\",\n    \"gulp-load-plugins\": \"^0.10.0\",\n    \"gulp-mocha\": \"*\",\n    \"gulp-replace\": \"*\",\n    \"inputevent\": \"*\",\n    \"jsdom\": \"^9.2\",\n    \"mocha\": \"*\",\n    \"moment\": \"*\",\n    \"rollup\": \"*\",\n    \"rollup-plugin-babel\": \"*\",\n    \"rollup-plugin-replace\": \"*\",\n    \"rollup-plugin-uglify\": \"*\",\n    \"sinon\": \"^1.12.2\"\n  },\n  \"jspm\": {\n    \"main\": \"dist/parsley.js\",\n    \"dependencies\": {\n      \"jquery\": \"npm:jquery\"\n    }\n  }\n}\n"
  },
  {
    "path": "rollup.config.js",
    "content": "import {rollupOptions} from './tools/rollup_options.js';\nimport {uglify} from 'rollup-plugin-uglify';\n\nexport default [\n  rollupOptions({}),\n  rollupOptions({suffix: '.min', extraPlugins: [uglify()]}),\n];\n"
  },
  {
    "path": "src/.babelrc",
    "content": "{\n  \"plugins\": [\"@babel/plugin-transform-object-assign\"],\n  \"presets\": [\"@babel/preset-env\"]\n}\n"
  },
  {
    "path": "src/extra/plugin/bind.js",
    "content": "// This plugin replace Parsley default form behavior that auto bind its fields children\n// With this plugin you must register in constructor your form's fields and their constraints\n// You have this way a total javascript control over your form validation, and nothing needed in DOM\n\nimport jQuery from 'jquery'; // Remove this line in ES3\n\n(function ($) {\n\n  window.ParsleyConfig = $.extend(true, window.ParsleyConfig, {autoBind: false});\n  window.ParsleyExtend = window.ParsleyExtend || {};\n\n  window.ParsleyExtend = Object.assign(window.ParsleyExtend, {\n    // { '#selector' : { constraintName1: value, constraintName2: value2 }, #selector2: { constraintName: value } }\n    // { '#selector' : { constraintName1: { requirements: value, priority: value }, constraintName2: value2 } }\n    _bindFields: function () {\n      window.Parsley.Utils.warnOnce(\"Parsley's extra/bind is deprecated. Please see https://github.com/guillaumepotier/Parsley.js/issues/1180\");\n      if ('Form' !== this.__class__)\n        throw new Error('`_bindFields` must be called on a form instance');\n\n      if ('undefined' === typeof this.options.fields)\n        throw new Error('bind.js plugin needs to have Parsley instantiated with fields');\n\n      var field;\n      this.fields = [];\n\n      for (var selector in this.options.fields) {\n        if (0 === $(selector).length)\n          continue;\n\n        field = $(selector).parsley();\n\n        for (var name in this.options.fields[selector]) {\n          if ('object' === typeof this.options.fields[selector][name] && !(this.options.fields[selector][name] instanceof Array))\n            field.addConstraint(name.toLowerCase(), this.options.fields[selector][name].requirements, this.options.fields[selector][name].priority || 32);\n          else\n            field.addConstraint(name.toLowerCase(), this.options.fields[selector][name]);\n        }\n      }\n\n      this.fields.push(field);\n\n      return this;\n    },\n\n    // Do nothing\n    _bindConstraints: function () {\n      return this;\n    }\n  });\n\n})(jQuery);\n"
  },
  {
    "path": "src/extra/validator/comparison.js",
    "content": "// Load this after Parsley for additional comparison validators\n// Note: comparing with a reference isn't well supported and not recommended.\nimport jQuery from 'jquery'; // Remove this line in ES3\n\n// gt, gte, lt, lte, notequalto extra validators\nvar parseRequirement = function (requirement) {\n  if (isNaN(+requirement))\n    return parseFloat(jQuery(requirement).val());\n  else\n    return +requirement;\n};\n\n// Greater than validator\nwindow.Parsley.addValidator('gt', {\n  validateString: function (value, requirement) {\n    return parseFloat(value) > parseRequirement(requirement);\n  },\n  priority: 32\n});\n\n// Greater than or equal to validator\nwindow.Parsley.addValidator('gte', {\n  validateString: function (value, requirement) {\n    return parseFloat(value) >= parseRequirement(requirement);\n  },\n  priority: 32\n});\n\n// Less than validator\nwindow.Parsley.addValidator('lt', {\n  validateString: function (value, requirement) {\n    return parseFloat(value) < parseRequirement(requirement);\n  },\n  priority: 32\n});\n\n// Less than or equal to validator\nwindow.Parsley.addValidator('lte', {\n  validateString: function (value, requirement) {\n    return parseFloat(value) <= parseRequirement(requirement);\n  },\n  priority: 32\n});\n"
  },
  {
    "path": "src/extra/validator/date.js",
    "content": "window.Parsley.addValidator('date', {\n    validateString: function(value, format) {\n        if (! value) {\n            return true;\n        }\n\n        var date = moment(value, format, true);\n        return date.isValid();\n    },\n    priority: 255,\n});\n\nwindow.Parsley.addValidator('datebeforenow', {\n    validateString: function(value, format) {\n        if (! value) {\n            return true;\n        }\n\n        var date = moment(value, format, true);\n\n        if (! date.isValid()) {\n            return false;\n        }\n\n        return date.isBefore(moment());\n    },\n    priority: 256,\n});\n\nwindow.Parsley.addValidator('dateafternow', {\n    validateString: function(value, format) {\n        if (! value) {\n            return true;\n        }\n\n        var date = moment(value, format, true);\n\n        if (! date.isValid()) {\n            return false;\n        }\n\n        return date.isAfter(moment());\n    },\n    priority: 256,\n});\n"
  },
  {
    "path": "src/extra/validator/dateiso.js",
    "content": "// Load this after Parsley for additional comparison validators\n\nwindow.Parsley.addValidator('dateiso', {\n  validateString: function (value) {\n    return /^(\\d{4})\\D?(0[1-9]|1[0-2])\\D?([12]\\d|0[1-9]|3[01])$/.test(value);\n  },\n  priority: 256\n});\n"
  },
  {
    "path": "src/extra/validator/luhn.js",
    "content": "// luhn extra validators\nwindow.ParsleyConfig = window.ParsleyConfig || {};\nwindow.ParsleyConfig.validators = window.ParsleyConfig.validators || {};\n\nwindow.ParsleyConfig.validators.luhn = {\n  fn: function (value) {\n    value = value.replace(/[ -]/g, '');\n    var digit;\n    var n;\n    var _j;\n    var _len1;\n    var _ref2;\n    var sum = 0;\n    _ref2 = value.split('').reverse();\n    for (n = _j = 0, _len1 = _ref2.length; _j < _len1; n = ++_j) {\n      digit = _ref2[n];\n      digit = +digit;\n      if (n % 2) {\n        digit *= 2;\n        if (digit < 10) {\n          sum += digit;\n        } else {\n          sum += digit - 9;\n        }\n      } else {\n        sum += digit;\n      }\n    }\n    return sum % 10 === 0;\n  },\n  priority: 32\n};\n"
  },
  {
    "path": "src/extra/validator/notequalto.js",
    "content": "(function () {\n// notequalto extra validators\nwindow.ParsleyConfig = window.ParsleyConfig || {};\nwindow.ParsleyConfig.validators = window.ParsleyConfig.validators || {};\n\n// Greater than validator\nwindow.ParsleyConfig.validators.notequalto = {\n  fn: function (value, requirement) {\n    return value !== ($(requirement).length ? $(requirement).val() : requirement);\n  },\n  priority: 256\n};\n})();\n"
  },
  {
    "path": "src/extra/validator/words.js",
    "content": "(function () {\n// minwords, maxwords, words extra validators\nvar countWords = function (string) {\n  return string\n      .replace( /(^\\s*)|(\\s*$)/gi, \"\" )\n      .replace( /\\s+/gi, \" \" )\n      .split(' ').length;\n};\n\nwindow.Parsley.addValidator(\n  'minwords',\n  function (value, nbWords) {\n    return countWords(value) >= nbWords;\n  }, 32)\n  .addMessage('en', 'minwords', 'This value needs more words');\n\nwindow.Parsley.addValidator(\n  'maxwords',\n  function (value, nbWords) {\n    return countWords(value) <= nbWords;\n  }, 32)\n  .addMessage('en', 'maxwords', 'This value needs fewer words');\n\nwindow.Parsley.addValidator(\n  'words',\n  function (value, arrayRange) {\n    var length = countWords(value);\n    return length >= arrayRange[0] && length <= arrayRange[1];\n  }, 32)\n  .addMessage('en', 'words', 'This value has the incorrect number of words');\n})();\n"
  },
  {
    "path": "src/header.js",
    "content": "/*!\n* Parsley.js\n* Version VERSION - built NOW\n* http://parsleyjs.org\n* Guillaume Potier - <guillaume@wisembly.com>\n* Marc-Andre Lafortune - <petroselinum@marc-andre.ca>\n* MIT Licensed\n*/\n\n// The source code below is generated by babel as\n// Parsley is written in ECMAScript 6\n//\n"
  },
  {
    "path": "src/i18n/al.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley/main';\n\nParsley.addMessages('al', {\n  defaultMessage: \"Kjo vlerë është invalide.\",\n  type: {\n    email:        \"Kjo vlerë duhet të ketë formë valide të një email adrese.\",\n    url:          \"Kjo vlerë duhet të ketë formë valide të një URL-je.\",\n    number:       \"Kjo vlerë duhet të jetë numërike.\",\n    integer:      \"Kjo vlerë duhet të jetë numër i plotë.\",\n    digits:       \"Kjo vlerë duhet të jetë shifër.\",\n    alphanum:     \"Kjo vlerë duhet të jetë alfanumerike.\"\n  },\n  notblank:       \"Kjo vlerë nuk duhet të jetë e zbrazët.\",\n  required:       \"Kjo vlerë kërkohet domosdosmërisht.\",\n  pattern:        \"Kjo vlerë është invalide.\",\n  min:            \"Kjo vlerë duhet të jetë më e madhe ose e barabartë me %s.\",\n  max:            \"Kjo vlerë duhet të jetë më e vogël ose e barabartë me %s.\",\n  range:          \"Kjo vlerë duhet të jetë në mes të %s dhe %s.\",\n  minlength:      \"Kjo vlerë është shum e shkurtë. Ajo duhet të ketë %s apo më shum shkronja.\",\n  maxlength:      \"Kjo vlerë është shum e gjatë. Ajo duhet të ketë %s apo më pak shkronja\",\n  length:         \"Gjatësia e kësaj vlere është invalide. Ajo duhet të jetë në mes të %s dhe %s shkronjash.\",\n  mincheck:       \"Ju duhet të zgjedhni së paku %s zgjedhje.\",\n  maxcheck:       \"Ju duhet të zgjedhni %s ose më pak zgjedhje.\",\n  check:          \"Ju duhet të zgjedhni në mes të %s dhe %s zgjedhjeve.\",\n  equalto:        \"Kjo vlerë duhet të jetë e njejtë.\"\n});\n\nParsley.setLocale('al');\n"
  },
  {
    "path": "src/i18n/ar.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('ar', {\n  defaultMessage: \"تأكد من صحة القيمة المدخل\",\n  type: {\n    email:        \"تأكد من إدخال بريد الكتروني صحيح\",\n    url:          \"تأكد من إدخال رابط صحيح\",\n    number:       \"تأكد من إدخال رقم\",\n    integer:      \"تأكد من إدخال عدد صحيح بدون كسور\",\n    digits:       \"تأكد من إدخال رقم\",\n    alphanum:     \"تأكد من إدخال حروف وأرقام فقط\"\n  },\n  notblank:       \"تأكد من تعبئة الحقل\",\n  required:       \"هذا الحقل مطلوب\",\n  pattern:        \"القيمة المدخلة غير صحيحة\",\n  min:            \"القيمة المدخلة يجب أن تكون أكبر من %s.\",\n  max:            \"القيمة المدخلة يجب أن تكون أصغر من %s.\",\n  range:          \"القيمة المدخلة يجب أن تكون بين %s و %s.\",\n  minlength:      \"القيمة المدخلة قصيرة جداً . تأكد من إدخال %s حرف أو أكثر\",\n  maxlength:      \"القيمة المدخلة طويلة . تأكد من إدخال %s حرف أو أقل\",\n  length:         \"القيمة المدخلة غير صحيحة. تأكد من إدخال بين  %s و %s خانة\",\n  mincheck:       \"يجب اختيار %s خيار على الأقل.\",\n  maxcheck:       \"يجب اختيار%s خيار أو أقل\",\n  check:          \"يجب اختيار بين %s و %s خيار.\",\n  equalto:        \"تأكد من تطابق القيمتين المدخلة.\"\n});\n\nParsley.setLocale('ar');\n"
  },
  {
    "path": "src/i18n/bg.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('bg', {\n  defaultMessage: \"Невалидна стойност.\",\n  type: {\n    email:        \"Невалиден имейл адрес.\",\n    url:          \"Невалиден URL адрес.\",\n    number:       \"Невалиден номер.\",\n    integer:      \"Невалиден номер.\",\n    digits:       \"Невалидни цифри.\",\n    alphanum:     \"Стойността трябва да садържа само букви или цифри.\"\n  },\n  notblank:       \"Полето е задължително.\",\n  required:       \"Полето е задължително.\",\n  pattern:        \"Невалидна стойност.\",\n  min:            \"Стойността трябва да бъде по-голяма или равна на %s.\",\n  max:            \"Стойността трябва да бъде по-малка или равна на %s.\",\n  range:          \"Стойността трябва да бъде между %s и %s.\",\n  minlength:      \"Стойността е прекалено кратка. Мин. дължина: %s символа.\",\n  maxlength:      \"Стойността е прекалено дълга. Макс. дължина: %s символа.\",\n  length:         \"Дължината на стойността трябва да бъде между %s и %s символа.\",\n  mincheck:       \"Трябва да изберете поне %s стойности.\",\n  maxcheck:       \"Трябва да изберете най-много %s стойности.\",\n  check:          \"Трябва да изберете между %s и %s стойности.\",\n  equalto:        \"Стойността трябва да съвпада.\"\n});\n\nParsley.setLocale('bg');\n"
  },
  {
    "path": "src/i18n/ca.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('ca', {\n  defaultMessage: \"Aquest valor sembla ser invàlid.\",\n  type: {\n    email:        \"Aquest valor ha de ser una adreça de correu electrònic vàlida.\",\n    url:          \"Aquest valor ha de ser una URL vàlida.\",\n    number:       \"Aquest valor ha de ser un nombre vàlid.\",\n    integer:      \"Aquest valor ha de ser un nombre enter vàlid.\",\n    digits:       \"Aquest valor només pot contenir dígits.\",\n    alphanum:     \"Aquest valor ha de ser alfanumèric.\"\n  },\n  notblank:       \"Aquest valor no pot ser buit.\",\n  required:       \"Aquest valor és obligatori.\",\n  pattern:        \"Aquest valor és incorrecte.\",\n  min:            \"Aquest valor no pot ser menor que %s.\",\n  max:            \"Aquest valor no pot ser major que %s.\",\n  range:          \"Aquest valor ha d'estar entre %s i %s.\",\n  minlength:      \"Aquest valor és massa curt. La longitud mínima és de %s caràcters.\",\n  maxlength:      \"Aquest valor és massa llarg. La longitud màxima és de %s caràcters.\",\n  length:         \"La longitud d'aquest valor ha de ser d'entre %s i %s caràcters.\",\n  mincheck:       \"Has de marcar un mínim de %s opcions.\",\n  maxcheck:       \"Has de marcar un màxim de %s opcions.\",\n  check:          \"Has de marcar entre %s i %s opcions.\",\n  equalto:        \"Aquest valor ha de ser el mateix.\"\n});\n\nParsley.setLocale('ca');\n"
  },
  {
    "path": "src/i18n/cs.extra.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('cs', {\n  dateiso:  \"Tato položka musí být datum ve formátu RRRR-MM-DD.\",\n  minwords: \"Tato položka musí mít délku nejméně %s slov.\",\n  maxwords: \"Tato položka musí mít délku nejvíce %s slov.\",\n  words:    \"Tato položka musí být od %s do %s slov dlouhá.\",\n  gt:       \"Tato hodnota musí být větší.\",\n  gte:      \"Tato hodnota musí být větší nebo rovna.\",\n  lt:       \"Tato hodnota musí být menší.\",\n  lte:      \"Tato hodnota musí být menší nebo rovna.\"\n});\n"
  },
  {
    "path": "src/i18n/cs.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('cs', {\n  defaultMessage: \"Tato položka je neplatná.\",\n  type: {\n    email:        \"Tato položka musí být e-mailová adresa.\",\n    url:          \"Tato položka musí být platná URL adresa.\",\n    number:       \"Tato položka musí být číslo.\",\n    integer:      \"Tato položka musí být celé číslo.\",\n    digits:       \"Tato položka musí být kladné celé číslo.\",\n    alphanum:     \"Tato položka musí být alfanumerická.\"\n  },\n  notblank:       \"Tato položka nesmí být prázdná.\",\n  required:       \"Tato položka je povinná.\",\n  pattern:        \"Tato položka je neplatná.\",\n  min:            \"Tato položka musí být větší nebo rovna %s.\",\n  max:            \"Tato položka musí být menší nebo rovna %s.\",\n  range:          \"Tato položka musí být v rozsahu od %s do %s.\",\n  minlength:      \"Tato položka musí mít nejméně %s znaků.\",\n  maxlength:      \"Tato položka musí mít nejvíce %s znaků.\",\n  length:         \"Tato položka musí mít délku od %s do %s znaků.\",\n  mincheck:       \"Je nutné vybrat alespoň %s možností.\",\n  maxcheck:       \"Je nutné vybrat nejvýše %s možností.\",\n  check:          \"Je nutné vybrat od %s do %s možností.\",\n  equalto:        \"Tato položka musí být stejná.\"\n});\n\nParsley.setLocale('cs');\n"
  },
  {
    "path": "src/i18n/da.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('da', {\n  defaultMessage: \"Indtast venligst en korrekt værdi.\",\n  type: {\n    email:        \"Indtast venligst en korrekt emailadresse.\",\n    url:          \"Indtast venligst en korrekt internetadresse.\",\n    number:       \"Indtast venligst et tal.\",\n    integer:      \"Indtast venligst et heltal.\",\n    digits:       \"Dette felt må kun bestå af tal.\",\n    alphanum:     \"Dette felt skal indeholde både tal og bogstaver.\"\n  },\n  notblank:       \"Dette felt må ikke være tomt.\",\n  required:       \"Dette felt er påkrævet.\",\n  pattern:        \"Ugyldig indtastning.\",\n  min:            \"Dette felt skal indeholde et tal som er større end eller lig med %s.\",\n  max:            \"Dette felt skal indeholde et tal som er mindre end eller lig med %s.\",\n  range:          \"Dette felt skal indeholde et tal mellem %s og %s.\",\n  minlength:      \"Indtast venligst mindst %s tegn.\",\n  maxlength:      \"Dette felt kan højst indeholde %s tegn.\",\n  length:         \"Længden af denne værdi er ikke korrekt. Værdien skal være mellem %s og %s tegn lang.\",\n  mincheck:       \"Vælg mindst %s muligheder.\",\n  maxcheck:       \"Vælg op til %s muligheder.\",\n  check:          \"Vælg mellem %s og %s muligheder.\",\n  equalto:        \"De to felter er ikke ens.\"\n});\n\nParsley.setLocale('da');\n"
  },
  {
    "path": "src/i18n/de.extra.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('de', {\n  dateiso:  \"Die Eingabe muss ein gültiges Datum sein (YYYY-MM-DD).\",\n  minwords: \"Die Eingabe ist zu kurz. Sie muss aus %s oder mehr Wörtern bestehen.\",\n  maxwords: \"Die Eingabe ist zu lang. Sie muss aus %s oder weniger Wörtern bestehen.\",\n  words:    \"Die Länge der Eingabe ist ungültig. Sie muss zwischen %s und %s Wörter enthalten.\",\n  gt:       \"Die Eingabe muss größer sein.\",\n  gte:      \"Die Eingabe muss größer oder gleich sein.\",\n  lt:       \"Die Eingabe muss kleiner sein.\",\n  lte:      \"Die Eingabe muss kleiner oder gleich sein.\"\n});\n"
  },
  {
    "path": "src/i18n/de.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('de', {\n  defaultMessage: \"Die Eingabe scheint nicht korrekt zu sein.\",\n  type: {\n    email:        \"Die Eingabe muss eine gültige E-Mail-Adresse sein.\",\n    url:          \"Die Eingabe muss eine gültige URL sein.\",\n    number:       \"Die Eingabe muss eine Zahl sein.\",\n    integer:      \"Die Eingabe muss eine Zahl sein.\",\n    digits:       \"Die Eingabe darf nur Ziffern enthalten.\",\n    alphanum:     \"Die Eingabe muss alphanumerisch sein.\"\n  },\n  notblank:       \"Die Eingabe darf nicht leer sein.\",\n  required:       \"Dies ist ein Pflichtfeld.\",\n  pattern:        \"Die Eingabe scheint ungültig zu sein.\",\n  min:            \"Die Eingabe muss größer oder gleich %s sein.\",\n  max:            \"Die Eingabe muss kleiner oder gleich %s sein.\",\n  range:          \"Die Eingabe muss zwischen %s und %s liegen.\",\n  minlength:      \"Die Eingabe ist zu kurz. Es müssen mindestens %s Zeichen eingegeben werden.\",\n  maxlength:      \"Die Eingabe ist zu lang. Es dürfen höchstens %s Zeichen eingegeben werden.\",\n  length:         \"Die Länge der Eingabe ist ungültig. Es müssen zwischen %s und %s Zeichen eingegeben werden.\",\n  mincheck:       \"Wählen Sie mindestens %s Angaben aus.\",\n  maxcheck:       \"Wählen Sie maximal %s Angaben aus.\",\n  check:          \"Wählen Sie zwischen %s und %s Angaben.\",\n  equalto:        \"Dieses Feld muss dem anderen entsprechen.\"\n});\n\nParsley.setLocale('de');\n"
  },
  {
    "path": "src/i18n/el.extra.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('el', {\n  dateiso:  \"Η τιμή πρέπει να είναι μια έγκυρη ημερομηνία (YYYY-MM-DD).\",\n  minwords: \"Το κείμενο είναι πολύ μικρό. Πρέπει να έχει %s ή και περισσότερες λέξεις.\",\n  maxwords: \"Το κείμενο είναι πολύ μεγάλο. Πρέπει να έχει %s ή και λιγότερες λέξεις.\",\n  words:    \"Το μήκος του κειμένου είναι μη έγκυρο. Πρέπει να είναι μεταξύ %s και %s λεξεων.\",\n  gt:       \"Η τιμή πρέπει να είναι μεγαλύτερη.\",\n  gte:      \"Η τιμή πρέπει να είναι μεγαλύτερη ή ίση.\",\n  lt:       \"Η τιμή πρέπει να είναι μικρότερη.\",\n  lte:      \"Η τιμή πρέπει να είναι μικρότερη ή ίση.\",\n  notequalto: \"Η τιμή πρέπει να είναι διαφορετική.\"\n});\n"
  },
  {
    "path": "src/i18n/el.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('el', {\n  defaultMessage: \"Η τιμή φαίνεται να είναι μη έγκυρη.\",\n  type: {\n    email:        \"Η τιμή πρέπει να είναι ένα έγκυρο email.\",\n    url:          \"Η τιμή πρέπει να είναι ένα έγκυρο url.\",\n    number:       \"Η τιμή πρέπει να είναι ένας έγκυρος αριθμός.\",\n    integer:      \"Η τιμή πρέπει να είναι ένας έγκυρος ακέραιος.\",\n    digits:       \"Η τιμή πρέπει να είναι ψηφία.\",\n    alphanum:     \"Η τιμή πρέπει να είναι αλφαριθμητικό.\"\n  },\n  notblank:       \"Η τιμή δεν πρέπει να είναι κενή.\",\n  required:       \"Απαιτούμενο πεδίο\",\n  pattern:        \"Η τιμή φαίνεται να είναι μη έγκυρη.\",\n  min:            \"Η τιμή πρέπει να είναι μεγαλύτερη ή ίση με %s.\",\n  max:            \"Η τιμή πρέπει να είναι μικρότερη ή ίση με %s.\",\n  range:          \"Η τιμή πρέπει να είναι μεταξύ %s και %s.\",\n  minlength:      \"Το κείμενο είναι πολύ μικρό. Πρέπει να είναι %s ή και περισσότεροι χαρακτήρες.\",\n  maxlength:      \"Η κείμενο είναι πολύ μεγάλο. Πρέπει να είναι %s ή και λιγότεροι χαρακτήρες.\",\n  length:         \"Το μήκος του κειμένου είναι μη έγκυρο. Πρέπει να είναι μεταξύ %s και %s χαρακτήρων.\",\n  mincheck:       \"Πρέπει να επιλέξετε τουλάχιστον %s επιλογές.\",\n  maxcheck:       \"Πρέπει να επιλέξετε %s ή λιγότερες επιλογές.\",\n  check:          \"Πρέπει να επιλέξετε μεταξύ %s και %s επίλογων.\",\n  equalto:        \"Η τιμή πρέπει να είναι η ίδια.\"\n});\n\nParsley.setLocale('el');\n"
  },
  {
    "path": "src/i18n/en.extra.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('en', {\n  dateiso:  \"This value should be a valid date (YYYY-MM-DD).\",\n  date: \"It must be a valid date with format %s\",\n  datebeforenow: \"Date must be valid with format %s and be before now\",\n  dateafternow: \"Date must be valid with format %s and be after now\",\n  minwords: \"This value is too short. It should have %s words or more.\",\n  maxwords: \"This value is too long. It should have %s words or fewer.\",\n  words:    \"This value length is invalid. It should be between %s and %s words long.\",\n  gt:       \"This value should be greater than %s.\",\n  gte:      \"This value should be greater or equal to %s.\",\n  lt:       \"This value should be less than %s.\",\n  lte:      \"This value should be less or equal to %s.\",\n  notequalto: \"This value should be different from %s.\"\n});\n"
  },
  {
    "path": "src/i18n/en.js",
    "content": "// This is included with the Parsley library itself,\n// thus there is no use in adding it to your project.\nimport Parsley from '../parsley/main';\n\nParsley.addMessages('en', {\n  defaultMessage: \"This value seems to be invalid.\",\n  type: {\n    email:        \"This value should be a valid email.\",\n    url:          \"This value should be a valid url.\",\n    number:       \"This value should be a valid number.\",\n    integer:      \"This value should be a valid integer.\",\n    digits:       \"This value should be digits.\",\n    alphanum:     \"This value should be alphanumeric.\"\n  },\n  notblank:       \"This value should not be blank.\",\n  required:       \"This value is required.\",\n  pattern:        \"This value seems to be invalid.\",\n  min:            \"This value should be greater than or equal to %s.\",\n  max:            \"This value should be lower than or equal to %s.\",\n  range:          \"This value should be between %s and %s.\",\n  minlength:      \"This value is too short. It should have %s characters or more.\",\n  maxlength:      \"This value is too long. It should have %s characters or fewer.\",\n  length:         \"This value length is invalid. It should be between %s and %s characters long.\",\n  mincheck:       \"You must select at least %s choices.\",\n  maxcheck:       \"You must select %s choices or fewer.\",\n  check:          \"You must select between %s and %s choices.\",\n  equalto:        \"This value should be the same.\",\n  euvatin:        \"It's not a valid VAT Identification Number.\",\n});\n\nParsley.setLocale('en');\n"
  },
  {
    "path": "src/i18n/es.js",
    "content": "// ParsleyConfig definition if not already set\n// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('es', {\n  defaultMessage: \"Este valor parece ser inválido.\",\n  type: {\n    email:        \"Este valor debe ser un correo válido.\",\n    url:          \"Este valor debe ser una URL válida.\",\n    number:       \"Este valor debe ser un número válido.\",\n    integer:      \"Este valor debe ser un número válido.\",\n    digits:       \"Este valor debe ser un dígito válido.\",\n    alphanum:     \"Este valor debe ser alfanumérico.\"\n  },\n  notblank:       \"Este valor no debe estar en blanco.\",\n  required:       \"Este valor es requerido.\",\n  pattern:        \"Este valor es incorrecto.\",\n  min:            \"Este valor no debe ser menor que %s.\",\n  max:            \"Este valor no debe ser mayor que %s.\",\n  range:          \"Este valor debe estar entre %s y %s.\",\n  minlength:      \"Este valor es muy corto. La longitud mínima es de %s caracteres.\",\n  maxlength:      \"Este valor es muy largo. La longitud máxima es de %s caracteres.\",\n  length:         \"La longitud de este valor debe estar entre %s y %s caracteres.\",\n  mincheck:       \"Debe seleccionar al menos %s opciones.\",\n  maxcheck:       \"Debe seleccionar %s opciones o menos.\",\n  check:          \"Debe seleccionar entre %s y %s opciones.\",\n  equalto:        \"Este valor debe ser idéntico.\"\n});\n\nParsley.setLocale('es');\n"
  },
  {
    "path": "src/i18n/et.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('et', {\n  defaultMessage: \"See väärtus ei sobi.\",\n  type: {\n    email: \"See väärtus peab olema kehtiv email.\",\n    url: \"See väärtus peab olema kehtiv link.\",\n    number: \"See väärtus peab olema number.\",\n    integer: \"See väärtus peab olema täisarv.\",\n    digits: \"See väärtus peab olema number.\",\n    alphanum: \"See väärtus peab olema täht või number.\"\n  },\n  notblank: \"See väärtus ei tohi olla tühi.\",\n  required: \"See väärtus on nõutud.\",\n  pattern: \"See väärtus ei sobi.\",\n  min: \"See väärtus peab olema suurem või võrdne %s.\",\n  max: \"See väärtus peab olema väiksem või võrdne %s.\",\n  range: \"See väärtus peab olema %s ja %s vahel.\",\n  minlength: \"See väärtus on liiga lühike. Peab olema vähemalt %s tähte.\",\n  maxlength: \"See väärtus ei tohi olla rohkem kui %s tähte.\",\n  length: \"See väärtuse pikkus ei sobi. Peab olema vahemikus %s - %s.\",\n  mincheck: \"Pead valima vähemalt %s valikut.\",\n  maxcheck: \"Maksimaalselt %s valikut.\",\n  check: \"Valik peab olema vahemikus %s ja %s .\",\n  equalto: \"See väärtus peab olema sama.\"\n});\n\nParsley.setLocale('et');\n"
  },
  {
    "path": "src/i18n/eu.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('eu', {\n  defaultMessage: \"Balio hau baliogabekoa dirudi.\",\n  type: {\n    email:        \"Balio honek posta balioduna izan behar da.\",\n    url:          \"Balio honek URL balioduna izan behar da.\",\n    number:       \"Balio honek zenbaki balioduna izan behar da.\",\n    integer:      \"Balio honek zenbaki balioduna izan behar da.\",\n    digits:       \"Balio honek digitu balioduna izan behar da.\",\n    alphanum:     \"Balio honek alfanumerikoa izan behar da.\"\n  },\n  notblank:       \"Balio honek ezin da hutsik egon.\",\n  required:       \"Balio hau nahitaezkoa da.\",\n  pattern:        \"Balio hau ez da zuzena.\",\n  min:            \"Balio honek %s baino baxuagoa ezin da izan.\",\n  max:            \"Balio honek %s baino altuagoa ezin da izan.\",\n  range:          \"Balio honek %s eta %s artean egon behar da.\",\n  minlength:      \"Balio hau oso motza da. Gutxienezko luzera %s karakteretakoa da.\",\n  maxlength:      \"Balio hau oso luzea da. Gehienezko luzera %s karakteretakoa da.\",\n  length:         \"Balio honen luzera %s eta %s karaketere artean egon behar da.\",\n  mincheck:       \"%s aukera hautatu behar dituzu gutxienez.\",\n  maxcheck:       \"%s aukera edo gutxiago hautatu behar dituzu.\",\n  check:          \"%s eta %s aukeren artean hautatu behar duzu.\",\n  equalto:        \"Balio honek berbera izan behar da.\"\n});\n\nParsley.setLocale('eu');\n"
  },
  {
    "path": "src/i18n/fa.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('fa', {\n  defaultMessage: \"این مقدار صحیح نمی باشد\",\n  type: {\n    email:        \"این مقدار باید یک ایمیل معتبر باشد\",\n    url:          \"این مقدار باید یک آدرس معتبر باشد\",\n    number:       \"این مقدار باید یک عدد معتبر باشد\",\n    integer:      \"این مقدار باید یک عدد صحیح معتبر باشد\",\n    digits:       \"این مقدار باید یک عدد باشد\",\n    alphanum:     \"این مقدار باید حروف الفبا باشد\"\n  },\n  notblank:       \"این مقدار نباید خالی باشد\",\n  required:       \"این مقدار باید وارد شود\",\n  pattern:        \"این مقدار به نظر می رسد نامعتبر است\",\n  min:            \"این مقدیر باید بزرگتر با مساوی %s باشد\",\n  max:            \"این مقدار باید کمتر و یا مساوی %s باشد\",\n  range:          \"این مقدار باید بین %s و %s باشد\",\n  minlength:      \"این مقدار بیش از حد کوتاه است. باید %s کاراکتر یا بیشتر باشد.\",\n  maxlength:      \"این مقدار بیش از حد طولانی است. باید %s کاراکتر یا کمتر باشد.\",\n  length:         \"این مقدار نامعتبر است و باید بین %s و %s باشد\",\n  mincheck:       \"شما حداقل باید %s گزینه را انتخاب کنید.\",\n  maxcheck:       \"شما حداکثر می‌توانید %s انتخاب داشته باشید.\",\n  check:          \"باید بین %s و %s مورد انتخاب کنید\",\n  equalto:        \"این مقدار باید یکسان باشد\"\n});\n\nParsley.setLocale('fa');\n"
  },
  {
    "path": "src/i18n/fi.extra.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('fi', {\n  dateiso: \"Sy&ouml;t&auml; oikea p&auml;iv&auml;m&auml;&auml;r&auml; (YYYY-MM-DD).\"\n});\n"
  },
  {
    "path": "src/i18n/fi.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('fi', {\n  defaultMessage: \"Sy&ouml;tetty arvo on virheellinen.\",\n  type: {\n    email:        \"S&auml;hk&ouml;postiosoite on virheellinen.\",\n    url:          \"Url-osoite on virheellinen.\",\n    number:       \"Sy&ouml;t&auml; numero.\",\n    integer:      \"Sy&ouml;t&auml; kokonaisluku.\",\n    digits:       \"Sy&ouml;t&auml; ainoastaan numeroita.\",\n    alphanum:     \"Sy&ouml;t&auml; ainoastaan kirjaimia tai numeroita.\"\n  },\n  notblank:       \"T&auml;m&auml; kentt&auml;&auml; ei voi j&auml;tt&auml;&auml; tyhj&auml;ksi.\",\n  required:       \"T&auml;m&auml; kentt&auml; on pakollinen.\",\n  pattern:        \"Sy&ouml;tetty arvo on virheellinen.\",\n  min:            \"Sy&ouml;t&auml; arvo joka on yht&auml; suuri tai suurempi kuin %s.\",\n  max:            \"Sy&ouml;t&auml; arvo joka on pienempi tai yht&auml; suuri kuin %s.\",\n  range:          \"Sy&ouml;t&auml; arvo v&auml;lilt&auml;: %s-%s.\",\n  minlength:      \"Sy&ouml;tetyn arvon t&auml;ytyy olla v&auml;hint&auml;&auml;n %s merkki&auml; pitk&auml;.\",\n  maxlength:      \"Sy&ouml;tetty arvo saa olla enint&auml;&auml;n %s merkki&auml; pitk&auml;.\",\n  length:         \"Sy&ouml;tetyn arvon t&auml;ytyy olla v&auml;hint&auml;&auml;n %s ja enint&auml;&auml;n %s merkki&auml; pitk&auml;.\",\n  mincheck:       \"Valitse v&auml;hint&auml;&auml;n %s vaihtoehtoa.\",\n  maxcheck:       \"Valitse enint&auml;&auml;n %s vaihtoehtoa.\",\n  check:          \"Valitse %s-%s vaihtoehtoa.\",\n  equalto:        \"Salasanat eiv&auml;t t&auml;sm&auml;&auml;.\"\n});\n\nParsley.setLocale('fi');\n"
  },
  {
    "path": "src/i18n/fr.extra.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('fr', {\n  dateiso:    \"Cette valeur n'est pas une date valide (YYYY-MM-DD).\",\n  minwords:   \"Cette valeur est trop courte. Elle doit contenir au moins %s mots.\",\n  maxwords:   \"Cette valeur est trop longue. Elle doit contenir tout au plus %s mots.\",\n  words:      \"Cette valeur est invalide. Elle doit contenir entre %s et %s mots.\",\n  gt:         \"Cette valeur doit être plus grande.\",\n  gte:        \"Cette valeur doit être plus grande ou égale.\",\n  lt:         \"Cette valeur doit être plus petite.\",\n  lte:        \"Cette valeur doit être plus petite ou égale.\",\n  notequalto: \"Cette valeur doit être différente.\"\n});\n"
  },
  {
    "path": "src/i18n/fr.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('fr', {\n  defaultMessage: \"Cette valeur semble non valide.\",\n  type: {\n    email:        \"Cette valeur n'est pas une adresse email valide.\",\n    url:          \"Cette valeur n'est pas une URL valide.\",\n    number:       \"Cette valeur doit être un nombre.\",\n    integer:      \"Cette valeur doit être un entier.\",\n    digits:       \"Cette valeur doit être numérique.\",\n    alphanum:     \"Cette valeur doit être alphanumérique.\"\n  },\n  notblank:       \"Cette valeur ne peut pas être vide.\",\n  required:       \"Ce champ est requis.\",\n  pattern:        \"Cette valeur semble non valide.\",\n  min:            \"Cette valeur ne doit pas être inférieure à %s.\",\n  max:            \"Cette valeur ne doit pas excéder %s.\",\n  range:          \"Cette valeur doit être comprise entre %s et %s.\",\n  minlength:      \"Cette chaîne est trop courte. Elle doit avoir au minimum %s caractères.\",\n  maxlength:      \"Cette chaîne est trop longue. Elle doit avoir au maximum %s caractères.\",\n  length:         \"Cette valeur doit contenir entre %s et %s caractères.\",\n  mincheck:       \"Vous devez sélectionner au moins %s choix.\",\n  maxcheck:       \"Vous devez sélectionner %s choix maximum.\",\n  check:          \"Vous devez sélectionner entre %s et %s choix.\",\n  equalto:        \"Cette valeur devrait être identique.\"\n});\n\nParsley.setLocale('fr');\n"
  },
  {
    "path": "src/i18n/he.extra.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('he', {\n  dateiso: \"ערך זה צריך להיות תאריך בפורמט (YYYY-MM-DD).\"\n});\n"
  },
  {
    "path": "src/i18n/he.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('he', {\n  defaultMessage: \"נראה כי ערך זה אינו תקף.\",\n  type: {\n    email:        \"ערך זה צריך להיות כתובת אימייל.\",\n    url:          \"ערך זה צריך להיות URL תקף.\",\n    number:       \"ערך זה צריך להיות מספר.\",\n    integer:      \"ערך זה צריך להיות מספר שלם.\",\n    digits:       \"ערך זה צריך להיות ספרתי.\",\n    alphanum:     \"ערך זה צריך להיות אלפאנומרי.\"\n  },\n  notblank:       \"ערך זה אינו יכול להשאר ריק.\",\n  required:       \"ערך זה דרוש.\",\n  pattern:        \"נראה כי ערך זה אינו תקף.\",\n  min:            \"ערך זה צריך להיות לכל הפחות %s.\",\n  max:            \"ערך זה צריך להיות לכל היותר %s.\",\n  range:          \"ערך זה צריך להיות בין %s ל-%s.\",\n  minlength:      \"ערך זה קצר מידי. הוא צריך להיות לכל הפחות %s תווים.\",\n  maxlength:      \"ערך זה ארוך מידי. הוא צריך להיות לכל היותר %s תווים.\",\n  length:         \"ערך זה אינו באורך תקף. האורך צריך להיות בין %s ל-%s תווים.\",\n  mincheck:       \"אנא בחר לפחות %s אפשרויות.\",\n  maxcheck:       \"אנא בחר לכל היותר %s אפשרויות.\",\n  check:          \"אנא בחר בין %s ל-%s אפשרויות.\",\n  equalto:        \"ערך זה צריך להיות זהה.\"\n});\n\nParsley.setLocale('he');\n"
  },
  {
    "path": "src/i18n/hr.extra.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('hr', {\n  dateiso:  \"Ovo polje treba sadržavati ispravno unešen datum (GGGG-MM-DD).\",\n  minwords: \"Unos je prekratak. Treba sadržavati %s ili više riječi.\",\n  maxwords: \"Unos je predugačak. Treba sadržavati %s ili manje riječi.\",\n  words:    \"Neispravna duljina unosa. Treba sadržavati između %s i %s riječi.\",\n  gt:       \"Ova vrijednost treba biti veća.\",\n  gte:      \"Ova vrijednost treba biti veća ili jednaka.\",\n  lt:       \"Ova vrijednost treba biti manja.\",\n  lte:      \"Ova vrijednost treba biti manja ili jednaka.\",\n  notequalto: \"Ova vrijednost treba biti drugačija.\"\n});\n"
  },
  {
    "path": "src/i18n/hr.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('hr', {\n  defaultMessage: \"Neispravan unos.\",\n  type: {\n    email: \"Ovo polje treba sadržavati ispravnu email adresu.\",\n    url: \"Ovo polje treba sadržavati ispravni url.\",\n    number: \"Ovo polje treba sadržavati ispravno upisan broj.\",\n    integer: \"Ovo polje treba sadržavati ispravno upisan cijeli broj.\",\n    digits: \"Ovo polje treba sadržavati znamenke.\",\n    alphanum: \"Ovo polje treba sadržavati brojke ili slova.\"\n  },\n  notblank: \"Ovo polje ne smije biti prazno.\",\n  required: \"Ovo polje je obavezno.\",\n  pattern: \"Neispravan unos.\",\n  min: \"Vrijednost treba biti jednaka ili veća od %s.\",\n  max: \"Vrijednost treba biti jednaka ili manja od %s.\",\n  range: \"Vrijednost treba biti između %s i %s.\",\n  minlength: \"Unos je prekratak. Treba sadržavati %s ili više znakova.\",\n  maxlength: \"Unos je predugačak. Treba sadržavati %s ili manje znakova.\",\n  length: \"Neispravna duljina unosa. Treba sadržavati između %s i %s znakova.\",\n  mincheck: \"Treba odabrati najmanje %s izbora.\",\n  maxcheck: \"Treba odabrati %s ili manje izbora.\",\n  check: \"Treba odabrati između %s i %s izbora.\",\n  equalto: \"Ova vrijednost treba biti ista.\"\n});\n\nParsley.setLocale('hr');\n"
  },
  {
    "path": "src/i18n/hu.extra.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('hu', {\n  dateiso:  \"A mező értéke csak érvényes dátum lehet (YYYY-MM-DD).\",\n  minwords: \"Minimum %s szó megadása szükséges.\",\n  maxwords: \"Maximum %s szó megadása engedélyezett.\",\n  words:    \"Minimum %s, maximum %s szó megadása szükséges.\",\n  gt:       \"A mező értéke nagyobb kell legyen.\",\n  gte:      \"A mező értéke nagyobb vagy egyenlő kell legyen.\",\n  lt:       \"A mező értéke kevesebb kell legyen.\",\n  lte:      \"A mező értéke kevesebb vagy egyenlő kell legyen.\",\n  notequalto: \"Az érték különböző kell legyen.\"\n});\n"
  },
  {
    "path": "src/i18n/hu.js",
    "content": "// This is included with the Parsley library itself,\n// thus there is no use in adding it to your project.\nimport Parsley from '../parsley/main';\n\nParsley.addMessages('hu', {\n  defaultMessage: \"Érvénytelen mező.\",\n  type: {\n    email:        \"Érvénytelen email cím.\",\n    url:          \"Érvénytelen URL cím.\",\n    number:       \"Érvénytelen szám.\",\n    integer:      \"Érvénytelen egész szám.\",\n    digits:       \"Érvénytelen szám.\",\n    alphanum:     \"Érvénytelen alfanumerikus érték.\"\n  },\n  notblank:       \"Ez a mező nem maradhat üresen.\",\n  required:       \"A mező kitöltése kötelező.\",\n  pattern:        \"Érvénytelen érték.\",\n  min:            \"A mező értéke nagyobb vagy egyenlő kell legyen mint %s.\",\n  max:            \"A mező értéke kisebb vagy egyenlő kell legyen mint %s.\",\n  range:          \"A mező értéke %s és %s közé kell essen.\",\n  minlength:      \"Legalább %s karakter megadása szükséges.\",\n  maxlength:      \"Legfeljebb %s karakter megadása engedélyezett.\",\n  length:         \"Nem megfelelő karakterszám. Minimum %s, maximum %s karakter adható meg.\",\n  mincheck:       \"Legalább %s értéket kell kiválasztani.\",\n  maxcheck:       \"Maximum %s értéket lehet kiválasztani.\",\n  check:          \"Legalább %s, legfeljebb %s értéket kell kiválasztani.\",\n  equalto:        \"A mező értéke nem egyező.\"\n});\n\nParsley.setLocale('hu');\n"
  },
  {
    "path": "src/i18n/id.extra.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('id', {\n  dateiso: \"Harus tanggal yang valid (YYYY-MM-DD).\"\n});\n"
  },
  {
    "path": "src/i18n/id.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('id', {\n  defaultMessage: \"tidak valid\",\n  type: {\n    email:        \"email tidak valid\",\n    url:          \"url tidak valid\",\n    number:       \"nomor tidak valid\",\n    integer:      \"integer tidak valid\",\n    digits:       \"harus berupa digit\",\n    alphanum:     \"harus berupa alphanumeric\"\n  },\n  notblank:       \"tidak boleh kosong\",\n  required:       \"tidak boleh kosong\",\n  pattern:        \"tidak valid\",\n  min:            \"harus lebih besar atau sama dengan %s.\",\n  max:            \"harus lebih kecil atau sama dengan %s.\",\n  range:          \"harus dalam rentang %s dan %s.\",\n  minlength:      \"terlalu pendek, minimal %s karakter atau lebih.\",\n  maxlength:      \"terlalu panjang, maksimal %s karakter atau kurang.\",\n  length:         \"panjang karakter harus dalam rentang %s dan %s\",\n  mincheck:       \"pilih minimal %s pilihan\",\n  maxcheck:       \"pilih maksimal %s pilihan\",\n  check:          \"pilih antar %s dan %s pilihan\",\n  equalto:        \"harus sama\"\n});\n\nParsley.setLocale('id');\n"
  },
  {
    "path": "src/i18n/is.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('is', {\n  defaultMessage: \"Þessi reitur virðist vera ógildur.\",\n  type: {\n    email:        \"Þessi reitur ætti að vera gilt netfang.\",\n    url:          \"Þessi reitur ætti að vera gild vefslóð.\",\n    number:       \"Þessi reitur ætti að vera gild tala.\",\n    integer:      \"Þessi reitur ætti að vera gild heiltala.\",\n    digits:       \"Þessi reitur má aðeins innihalda tölur.\",\n    alphanum:     \"Þessi reitur má aðeins innihalda tölur og bókstafi\"\n  },\n  notblank:       \"Þessi reitur ætti ekki að vera tómur.\",\n  required:       \"Þennan reit þarf að fylla út.\",\n  pattern:        \"Þessi reitur virðist vera ógildur.\",\n  min:            \"Þessi reitur ætti að vera minnst %s stafir.\",\n  max:            \"Þessi reitur ætti að vera mest %s stafir.\",\n  range:          \"Þessi reitur ætti að vera á milli %s og %s stafir.\",\n  minlength:      \"Þessi reitur ætti að vera %s stafir eða meira.\",\n  maxlength:      \"Þessi reitur ætti að vera %s stafir eða færri.\",\n  length:         \"Þessi reitur ætti að vera á milli %s og %s stafa langur.\",\n  mincheck:       \"Þú þarft að velja að minnsta kosti %s valkosti.\",\n  maxcheck:       \"Þú þarft að velja %s valkosti eða færri.\",\n  check:          \"Þú þarft að velja á milli %s og %s valkosti.\",\n  equalto:        \"Þessir reitir ættu að vera eins.\"\n});\n\nParsley.setLocale('is');\n"
  },
  {
    "path": "src/i18n/it.extra.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('it', {\n  dateiso: \"Inserire una data valida (AAAA-MM-GG).\",\n  date: \"Deve essere una data valida nel formato %s\",\n  datebeforenow: \"La data deve essere valida nel formato %s e precedere la data attuale\",\n  dateafternow: \"La data deve essere valida nel formato %s e posteriore alla data attuale\",\n  minwords:   \"Questo valore deve avere almeno %s parole.\",\n  maxwords:   \"Questo valore deve avere meno di %s parole.\",\n  words:      \"Questo valore deve avere tra %s e %s parole.\",\n  gt:         \"Questo valore deve essere maggiore di %s.\",\n  gte:        \"Questo valore deve essere maggiore o uguale a %s.\",\n  lt:         \"Questo valore deve essere minore di %s.\",\n  lte:        \"Questo valore deve essere minore o uguale a %s.\",\n  notequalto: \"Questo valore deve essere differente da %s.\"\n});\n"
  },
  {
    "path": "src/i18n/it.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('it', {\n  defaultMessage: \"Questo valore sembra essere non valido.\",\n  type: {\n    email:        \"Questo valore deve essere un indirizzo email valido.\",\n    url:          \"Questo valore deve essere un URL valido.\",\n    number:       \"Questo valore deve essere un numero valido.\",\n    integer:      \"Questo valore deve essere un numero valido.\",\n    digits:       \"Questo valore deve essere di tipo numerico.\",\n    alphanum:     \"Questo valore deve essere di tipo alfanumerico.\"\n  },\n  notblank:       \"Questo valore non deve essere vuoto.\",\n  required:       \"Questo valore è richiesto.\",\n  pattern:        \"Questo valore non è corretto.\",\n  min:            \"Questo valore deve essere maggiore di %s.\",\n  max:            \"Questo valore deve essere minore di %s.\",\n  range:          \"Questo valore deve essere compreso tra %s e %s.\",\n  minlength:      \"Questo valore è troppo corto. La lunghezza minima è di %s caratteri.\",\n  maxlength:      \"Questo valore è troppo lungo. La lunghezza massima è di %s caratteri.\",\n  length:         \"La lunghezza di questo valore deve essere compresa fra %s e %s caratteri.\",\n  mincheck:       \"Devi scegliere almeno %s opzioni.\",\n  maxcheck:       \"Devi scegliere al più %s opzioni.\",\n  check:          \"Devi scegliere tra %s e %s opzioni.\",\n  equalto:        \"Questo valore deve essere identico.\",\n  euvatin:        \"Non è un codice IVA valido\",\n});\n\nParsley.setLocale('it');\n"
  },
  {
    "path": "src/i18n/ja.extra.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('ja', {\n  dateiso:  \"有効な日付を入力してください。 (YYYY-MM-DD).\",\n  minwords: \"語句が短すぎます。 %s 語以上で入力してください。\",\n  maxwords: \"語句が長すぎます。 %s 語以内で入力してください。\",\n  words:    \"語句の長さが正しくありません。 %s 語から %s 語の間で入力してください。\",\n  gt:       \"より大きい値を入力してください。\",\n  gte:      \"より大きいか、同じ値を入力してください。\",\n  lt:       \"より小さい値を入力してください。\",\n  lte:      \"より小さいか、同じ値を入力してください。\",\n  notequalto: \"異なる値を入力してください。\"\n});\n"
  },
  {
    "path": "src/i18n/ja.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('ja', {\n  defaultMessage: \"無効な値です。\",\n  type: {\n    email:        \"有効なメールアドレスを入力してください。\",\n    url:          \"有効なURLを入力してください。\",\n    number:       \"数値を入力してください。\",\n    integer:      \"整数を入力してください。\",\n    digits:       \"数字を入力してください。\",\n    alphanum:     \"英数字を入力してください。\"\n  },\n  notblank:       \"この値を入力してください\",\n  required:       \"この値は必須です。\",\n  pattern:        \"この値は無効です。\",\n  min:            \"%s 以上の値にしてください。\",\n  max:            \"%s 以下の値にしてください。\",\n  range:          \"%s から %s の値にしてください。\",\n  minlength:      \"%s 文字以上で入力してください。\",\n  maxlength:      \"%s 文字以下で入力してください。\",\n  length:         \"%s から %s 文字の間で入力してください。\",\n  mincheck:       \"%s 個以上選択してください。\",\n  maxcheck:       \"%s 個以下選択してください。\",\n  check:          \"%s から %s 個選択してください。\",\n  equalto:        \"値が違います。\"\n});\n\nParsley.setLocale('ja');\n"
  },
  {
    "path": "src/i18n/ko.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('ko', {\n  defaultMessage: \"입력하신 내용이 올바르지 않습니다.\",\n  type: {\n    email:        \"이메일을 입력해야 합니다.\",\n    url:          \"URL을 입력해야 합니다.\",\n    number:       \"숫자를 입력해야 합니다.\",\n    integer:      \"정수를 입력해야 합니다.\",\n    digits:       \"입력하신 내용은 숫자의 조합이여야 합니다.\",\n    alphanum:     \"입력하신 내용은 알파벳과 숫자의 조합이어야 합니다.\"\n  },\n  notblank:       \"공백은 입력하실 수 없습니다.\",\n  required:       \"필수 입력사항입니다.\",\n  pattern:        \"입력하신 내용이 올바르지 않습니다.\",\n  min:            \"입력하신 내용이 %s보다 크거나 같아야 합니다. \",\n  max:            \"입력하신 내용이 %s보다 작거나 같아야 합니다.\",\n  range:          \"입력하신 내용이 %s보다 크고 %s 보다 작아야 합니다.\",\n  minlength:      \"%s 이상의 글자수를 입력하십시오. \",\n  maxlength:      \"%s 이하의 글자수를 입력하십시오. \",\n  length:         \"입력하신 내용의 글자수가 %s보다 크고 %s보다 작아야 합니다.\",\n  mincheck:       \"최소한 %s개를 선택하여 주십시오. \",\n  maxcheck:       \"%s개 또는 그보다 적게 선택하여 주십시오.\",\n  check:          \"선택하신 내용이 %s보다 크거나 %s보다 작아야 합니다.\",\n  equalto:        \"같은 값을 입력하여 주십시오.\"\n});\n\nParsley.setLocale('ko');\n"
  },
  {
    "path": "src/i18n/lt.extra.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('lt', {\n  dateiso:  \"Šis įrašas turi būti teisingo formato data (YYYY-MM-DD).\",\n  minwords: \"Šis įrašas turi turėti ne mažiau kaip %s žodžių.\",\n  maxwords: \"Šis įrašas turi turėti ne daugiau kaip %s žodžių.\",\n  words:    \"Šis įrašas turi turėti nuo %s iki %s žodžių.\",\n  gt:       \"Ši vertė turi būti didesnė.\",\n  gte:      \"Ši vertė turi būti didesnė arba lygi.\",\n  lt:       \"Ši vertė turi būti mažesnė.\",\n  lte:      \"Ši vertė turi būti mažesnė arba lygi.\",\n  notequalto: \"Ši vertė turi būti skirtinga.\"\n});\n"
  },
  {
    "path": "src/i18n/lt.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('lt', {\n  defaultMessage: \"Šis įrašas neteisingas.\",\n  type: {\n    email:        \"Šis įrašas nėra teisingas el. paštas.\",\n    url:          \"Šis įrašas nėra teisingas url.\",\n    number:       \"Šis įrašas nėra skaičius.\",\n    integer:      \"Šis įrašas nėra sveikasis skaičius.\",\n    digits:       \"Šis įrašas turi būti skaičius.\",\n    alphanum:     \"Šis įrašas turi būti iš skaičių ir raidžių.\"\n  },\n  notblank:       \"Šis įrašas negali būti tuščias.\",\n  required:       \"Šis įrašas yra privalomas\",\n  pattern:        \"Šis įrašas neteisingas.\",\n  min:            \"Ši vertė turi būti didesnė arba lygi %s.\",\n  max:            \"Ši vertė turi būti mažesnė arba lygi %s.\",\n  range:          \"Ši vertė turi būti tarp %s ir %s.\",\n  minlength:      \"Šis įrašas per trumpas. Jis turi turėti %s simbolius arba daugiau.\",\n  maxlength:      \"Šis įrašas per ilgas. Jis turi turėti %s simbolius arba mažiau.\",\n  length:         \"Šio įrašo ilgis neteisingas. Jis turėtų būti tarp %s ir %s simbolių.\",\n  mincheck:       \"Jūs turite pasirinkti bent %s pasirinkimus.\",\n  maxcheck:       \"Jūs turite pasirinkti ne daugiau %s pasirinkimų.\",\n  check:          \"Jūs turite pasirinkti tarp %s ir %s pasirinkimų.\",\n  equalto:        \"Ši reikšmė turėtų būti vienoda.\"\n});\n\nParsley.setLocale('lt');\n"
  },
  {
    "path": "src/i18n/lv.extra.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('lv', {\n  dateiso:  \"Šai vērtībai jābūt korekti noformētam datumam (YYYY-MM-DD).\",\n  minwords: \"Šī vērtība ir par īsu. Tai jābūt vismaz %s vārdus garai.\",\n  maxwords: \"Šī vērtība ir par garu. Tai jābūt %s vārdus garai vai īsākai.\",\n  words:    \"Šīs vērtības garums ir nederīgs. Tai jābūt no %s līdz %s vārdus garai.\",\n  gt:       \"Šai vērtībai jābūt lielākai.\",\n  gte:      \"Šai vērtībai jābūt lielākai vai vienādai.\",\n  lt:       \"Šai vērtībai jābūt mazākai.\",\n  lte:      \"Šai vērtībai jābūt mazākai vai vienādai.\",\n  notequalto: \"Šai vērtībai jābūt atšķirīgai.\"\n});\n"
  },
  {
    "path": "src/i18n/lv.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('lv', {\n  defaultMessage: \"Šis ieraksts veikts nekorekti.\",\n  type: {\n    email:        \"Šeit jāieraksta derīgs e-pasts.\",\n    url:          \"Šeit jāieraksta korekts url.\",\n    number:       \"Šeit jāieraksta derīgs skaitlis.\",\n    integer:      \"Šeit jāieraksta vesels skaitlis.\",\n    digits:       \"Šeit jāieraksta cipari.\",\n    alphanum:     \"Šeit derīgi tikai alfabēta burti vai cipari.\"\n  },\n  notblank:       \"Šis ieraksts nedrīkst būt tukšs.\",\n  required:       \"Šis ieraksts ir obligāti jāaizpilda.\",\n  pattern:        \"Šis ieraksts aizpildīts nekorekti.\",\n  min:            \"Šai vērtībai jābūt lielākai vai vienādai ar %s.\",\n  max:            \"Šai vērtībai jābūt mazākai vai vienādai ar %s.\",\n  range:          \"Šai vērtībai jābūt starp %s un %s.\",\n  minlength:      \"Vērtībai jābūt vismaz %s simbolu garai.\",\n  maxlength:      \"Vērtībai jābūt %s simbolus garai vai īsākai.\",\n  length:         \"Šīs vērtības garums ir neatbilstošs. Tai jābūt %s līdz %s simbolus garai.\",\n  mincheck:       \"Jāizvēlas vismaz %s varianti.\",\n  maxcheck:       \"Jāizvēlas %s varianti vai mazāk.\",\n  check:          \"Jāizvēlas no %s līdz %s variantiem.\",\n  equalto:        \"Šai vērtībai jāsakrīt.\"\n});\n\nParsley.setLocale('lv');\n"
  },
  {
    "path": "src/i18n/mk.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('mk', {\n  defaultMessage: \"Оваа вредност се чини дека е неважечка.\",\n  type: {\n    email:        \"Оваа вредност треба да е важечка е-пошта.\",\n    url:          \"Оваа вредност треба да е важечки урл.\",\n    number:       \"Оваа вредност треба да е важечки број.\",\n    integer:      \"Оваа вредност треба да е важечки цел број.\",\n    digits:       \"Оваа вредност треба да е цифри.\",\n    alphanum:     \"Оваа вредност треба да е алфанумеричка\"\n  },\n  notblank:       \"Оваа вредност не треба да е празна.\",\n  required:       \"Оваа вредност е потребна.\",\n  pattern:        \"Оваа вредност се чини дека е неважечка.\",\n  min:            \"Оваа вредност треба да е поголема од или еднаква на %s.\",\n  max:            \"Оваа вредност треба да е помала од или еднаква на %s.\",\n  range:          \"Оваа вредност треба да е помеѓу %s и %s.\",\n  minlength:      \"Оваа вредност е прекратка. Треба да има %s знаци или повеќе.\",\n  maxlength:      \"Оваа вредност е предолга. Треба да има %s знаци или помалку.\",\n  length:         \"Должината на оваа вредност е неважечка. Треба да биде долга помеѓу %s и %s знаци.\",\n  mincheck:       \"Мора да изберете најмалку %s опции.\",\n  maxcheck:       \"Мора да изберете %s опции или помалку.\",\n  check:          \"Мора да изберете помеѓу %s и %s опции.\",\n  equalto:        \"Оваа вредност треба да биде иста.\"\n});\n\nParsley.setLocale('mk');\n"
  },
  {
    "path": "src/i18n/ms.extra.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('ms', {\n  dateiso:  \"Nilai hendaklah berbentuk tarikh yang sah (YYYY-MM-DD).\",\n  minwords: \"Ayat terlalu pendek. Ianya perlu sekurang-kurangnya %s patah perkataan.\",\n  maxwords: \"Ayat terlalu panjang. Ianya tidak boleh melebihi %s patah perkataan.\",\n  words:    \"Panjang ayat tidak sah. Jumlah perkataan adalah diantara %s hingga %s patah perkataan.\",\n  gt:       \"Nilai lebih besar diperlukan.\",\n  gte:      \"Nilai hendaklah lebih besar atau sama.\",\n  lt:       \"Nilai lebih kecil diperlukan.\",\n  lte:      \"Nilai hendaklah lebih kecil atau sama.\"\n});\n"
  },
  {
    "path": "src/i18n/ms.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('ms', {\n  defaultMessage: \"Nilai tidak sah.\",\n  type: {\n    email:        \"Nilai mestilah dalam format emel yang sah.\",\n    url:          \"Nilai mestilah dalam bentuk url yang sah.\",\n    number:       \"Hanya nombor dibenarkan.\",\n    integer:      \"Hanya integer dibenarkan.\",\n    digits:       \"Hanya angka dibenarkan.\",\n    alphanum:     \"Hanya alfanumerik dibenarkan.\"\n  },\n  notblank:       \"Nilai ini tidak boleh kosong.\",\n  required:       \"Nilai ini wajib diisi.\",\n  pattern:        \"Bentuk nilai ini tidak sah.\",\n  min:            \"Nilai perlu lebih besar atau sama dengan %s.\",\n  max:            \"Nilai perlu lebih kecil atau sama dengan %s.\",\n  range:          \"Nilai perlu berada antara %s hingga %s.\",\n  minlength:      \"Nilai terlalu pendek. Ianya perlu sekurang-kurangnya %s huruf.\",\n  maxlength:      \"Nilai terlalu panjang. Ianya tidak boleh melebihi %s huruf.\",\n  length:         \"Panjang nilai tidak sah. Panjangnya perlu diantara %s hingga %s huruf.\",\n  mincheck:       \"Anda mesti memilih sekurang-kurangnya %s pilihan.\",\n  maxcheck:       \"Anda tidak boleh memilih lebih daripada %s pilihan.\",\n  check:          \"Anda mesti memilih diantara %s hingga %s pilihan.\",\n  equalto:        \"Nilai dimasukkan hendaklah sama.\"\n});\n\nParsley.setLocale('ms');\n"
  },
  {
    "path": "src/i18n/nl.extra.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('nl', {\n  dateiso:  \"Deze waarde moet een datum in het volgende formaat zijn: (YYYY-MM-DD).\",\n  minwords: \"Deze waarde moet minstens %s woorden bevatten.\",\n  maxwords: \"Deze waarde mag maximaal %s woorden bevatten.\",\n  words:    \"Deze waarde moet tussen de %s en %s woorden bevatten.\",\n  gt:       \"Deze waarde moet groter dan %s zijn.\",\n  lt:       \"Deze waarde moet kleiner dan %s zijn.\"\n});\n"
  },
  {
    "path": "src/i18n/nl.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('nl', {\n  defaultMessage: \"Deze waarde lijkt onjuist.\",\n  type: {\n    email:        \"Dit lijkt geen geldig e-mail adres te zijn.\",\n    url:          \"Dit lijkt geen geldige URL te zijn.\",\n    number:       \"Deze waarde moet een nummer zijn.\",\n    integer:      \"Deze waarde moet een nummer zijn.\",\n    digits:       \"Deze waarde moet numeriek zijn.\",\n    alphanum:     \"Deze waarde moet alfanumeriek zijn.\"\n  },\n  notblank:       \"Deze waarde mag niet leeg zijn.\",\n  required:       \"Dit veld is verplicht.\",\n  pattern:        \"Deze waarde lijkt onjuist te zijn.\",\n  min:            \"Deze waarde mag niet lager zijn dan %s.\",\n  max:            \"Deze waarde mag niet groter zijn dan %s.\",\n  range:          \"Deze waarde moet tussen %s en %s liggen.\",\n  minlength:      \"Deze tekst is te kort. Deze moet uit minimaal %s karakters bestaan.\",\n  maxlength:      \"Deze waarde is te lang. Deze mag maximaal %s karakters lang zijn.\",\n  length:         \"Deze waarde moet tussen %s en %s karakters lang zijn.\",\n  equalto:        \"Deze waardes moeten identiek zijn.\"\n});\n\nParsley.setLocale('nl');\n"
  },
  {
    "path": "src/i18n/no.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('no', {\n  defaultMessage: \"Verdien er ugyldig.\",\n  type: {\n    email:        \"Verdien må være en gyldig e-postadresse.\",\n    url:          \"Verdien må være en gyldig url.\",\n    number:       \"Verdien må være et gyldig tall.\",\n    integer:      \"Verdien må være et gyldig heltall.\",\n    digits:       \"Verdien må være et siffer.\",\n    alphanum:     \"Verdien må være alfanumerisk\"\n  },\n  notblank:       \"Verdien kan ikke være blank.\",\n  required:       \"Verdien er obligatorisk.\",\n  pattern:        \"Verdien er ugyldig.\",\n  min:            \"Verdien må være større eller lik %s.\",\n  max:            \"Verdien må være mindre eller lik %s.\",\n  range:          \"Verdien må være mellom %s and %s.\",\n  minlength:      \"Verdien er for kort. Den må bestå av minst %s tegn.\",\n  maxlength:      \"Verdien er for lang. Den kan bestå av maksimalt %s tegn.\",\n  length:         \"Verdien har ugyldig lengde. Den må være mellom %s og %s tegn lang.\",\n  mincheck:       \"Du må velge minst %s alternativer.\",\n  maxcheck:       \"Du må velge %s eller færre alternativer.\",\n  check:          \"Du må velge mellom %s og %s alternativer.\",\n  equalto:        \"Verdien må være lik.\"\n});\n\nParsley.setLocale('no');\n"
  },
  {
    "path": "src/i18n/pl.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('pl', {\n  defaultMessage: \"Wartość wygląda na nieprawidłową\",\n  type: {\n    email:        \"Wpisz poprawny adres e-mail.\",\n    url:          \"Wpisz poprawny adres URL.\",\n    number:       \"Wpisz poprawną liczbę.\",\n    integer:      \"Dozwolone są jedynie liczby całkowite.\",\n    digits:       \"Dozwolone są jedynie cyfry.\",\n    alphanum:     \"Dozwolone są jedynie znaki alfanumeryczne.\"\n  },\n  notblank:       \"Pole nie może być puste.\",\n  required:       \"Pole jest wymagane.\",\n  pattern:        \"Pole zawiera nieprawidłową wartość.\",\n  min:            \"Wartość nie może być mniejsza od %s.\",\n  max:            \"Wartość nie może być większa od %s.\",\n  range:          \"Wartość powinna zawierać się pomiędzy %s a %s.\",\n  minlength:      \"Minimalna ilość znaków wynosi %s.\",\n  maxlength:      \"Maksymalna ilość znaków wynosi %s.\",\n  length:         \"Ilość znaków wynosi od %s do %s.\",\n  mincheck:       \"Wybierz minimalnie %s opcji.\",\n  maxcheck:       \"Wybierz maksymalnie %s opcji.\",\n  check:          \"Wybierz od %s do %s opcji.\",\n  equalto:        \"Wartości nie są identyczne.\"\n});\n\nParsley.setLocale('pl');\n"
  },
  {
    "path": "src/i18n/pt-br.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('pt-br', {\n  defaultMessage: \"Este valor parece ser inválido.\",\n  type: {\n    email:        \"Este campo deve ser um email válido.\",\n    url:          \"Este campo deve ser um URL válida.\",\n    number:       \"Este campo deve ser um número válido.\",\n    integer:      \"Este campo deve ser um inteiro válido.\",\n    digits:       \"Este campo deve conter apenas dígitos.\",\n    alphanum:     \"Este campo deve ser alfa numérico.\"\n  },\n  notblank:       \"Este campo não pode ficar vazio.\",\n  required:       \"Este campo é obrigatório.\",\n  pattern:        \"Este campo parece estar inválido.\",\n  min:            \"Este campo deve ser maior ou igual a %s.\",\n  max:            \"Este campo deve ser menor ou igual a %s.\",\n  range:          \"Este campo deve estar entre %s e %s.\",\n  minlength:      \"Este campo é pequeno demais. Ele deveria ter %s caracteres ou mais.\",\n  maxlength:      \"Este campo é grande demais. Ele deveria ter %s caracteres ou menos.\",\n  length:         \"O tamanho deste campo é inválido. Ele deveria ter entre %s e %s caracteres.\",\n  mincheck:       \"Você deve escolher pelo menos %s opções.\",\n  maxcheck:       \"Você deve escolher %s opções ou mais\",\n  check:          \"Você deve escolher entre %s e %s opções.\",\n  equalto:        \"Este valor deveria ser igual.\"\n});\n\nParsley.setLocale('pt-br');\n"
  },
  {
    "path": "src/i18n/pt-pt.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('pt-pt', {\n  defaultMessage: \"Este valor parece ser inválido.\",\n  type: {\n    email:        \"Este campo deve ser um email válido.\",\n    url:          \"Este campo deve ser um URL válido.\",\n    number:       \"Este campo deve ser um número válido.\",\n    integer:      \"Este campo deve ser um número inteiro válido.\",\n    digits:       \"Este campo deve conter apenas dígitos.\",\n    alphanum:     \"Este campo deve ser alfanumérico.\"\n  },\n  notblank:       \"Este campo não pode ficar vazio.\",\n  required:       \"Este campo é obrigatório.\",\n  pattern:        \"Este campo parece estar inválido.\",\n  min:            \"Este valor deve ser maior ou igual a %s.\",\n  max:            \"Este valor deve ser menor ou igual a %s.\",\n  range:          \"Este valor deve estar entre %s e %s.\",\n  minlength:      \"Este campo é pequeno demais. Deve ter %s caracteres ou mais.\",\n  maxlength:      \"Este campo é grande demais. Deve ter %s caracteres ou menos.\",\n  length:         \"O tamanho deste campo é inválido. Ele deveria ter entre %s e %s caracteres.\",\n  mincheck:       \"Escolha pelo menos %s opções.\",\n  maxcheck:       \"Escolha %s opções ou mais\",\n  check:          \"Escolha entre %s e %s opções.\",\n  equalto:        \"Este valor deveria ser igual.\"\n});\n\nParsley.setLocale('pt-pt');\n"
  },
  {
    "path": "src/i18n/ro.extra.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('ro', {\n  dateiso:    \"Trebuie să fie o dată corectă (YYYY-MM-DD).\",\n  minwords:   \"Textul e prea scurt. Trebuie să aibă cel puțin %s cuvinte.\",\n  maxwords:   \"Textul e prea lung. Trebuie să aibă cel mult %s cuvinte.\",\n  words:      \"Textul trebuie să aibă cel puțin %s și cel mult %s caractere.\",\n  gt:         \"Valoarea ar trebui să fie mai mare.\",\n  gte:        \"Valoarea ar trebui să fie mai mare sau egală.\",\n  lt:         \"Valoarea ar trebui să fie mai mică.\",\n  lte:        \"Valoarea ar trebui să fie mai mică sau egală.\",\n  notequalto: \"Valoarea ar trebui să fie diferită.\"\n});\n"
  },
  {
    "path": "src/i18n/ro.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('ro', {\n  defaultMessage: \"Acest câmp nu este completat corect.\",\n  type: {\n    email:        \"Trebuie să scrii un email valid.\",\n    url:          \"Trebuie să scrii un URL valid.\",\n    number:       \"Trebuie să scrii un număr valid.\",\n    integer:      \"Trebuie să scrii un număr întreg valid.\",\n    digits:       \"Trebuie să conțină doar cifre.\",\n    alphanum:     \"Trebuie să conțină doar cifre sau litere.\"\n  },\n  notblank:       \"Acest câmp nu poate fi lăsat gol.\",\n  required:       \"Acest câmp trebuie să fie completat.\",\n  pattern:        \"Acest câmp nu este completat corect.\",\n  min:            \"Trebuie să fie mai mare sau egal cu %s.\",\n  max:            \"Trebuie să fie mai mic sau egal cu %s.\",\n  range:          \"Valoarea trebuie să fie între %s și %s.\",\n  minlength:      \"Trebuie să scrii cel puțin %s caractere.\",\n  maxlength:      \"Trebuie să scrii cel mult %s caractere.\",\n  length:         \"Trebuie să scrii între %s și %s caractere.\",\n  mincheck:       \"Trebuie să alegi cel puțin %s opțiuni.\",\n  maxcheck:       \"Poți alege maxim %s opțiuni.\",\n  check:          \"Trebuie să alegi între %s sau %s.\",\n  equalto:        \"Trebuie să fie la fel.\"\n});\n\nParsley.setLocale('ro');\n"
  },
  {
    "path": "src/i18n/ru.extra.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('ru', {\n  dateiso:  \"Это значение должно быть корректной датой (ГГГГ-ММ-ДД).\",\n  minwords: \"Это значение должно содержать не менее %s слов.\",\n  maxwords: \"Это значение должно содержать не более %s слов.\",\n  words:    \"Это значение должно содержать от %s до %s слов.\",\n  gt:       \"Это значение должно быть больше.\",\n  gte:      \"Это значение должно быть больше или равно.\",\n  lt:       \"Это значение должно быть меньше.\",\n  lte:      \"Это значение должно быть меньше или равно.\",\n  notequalto: \"Это значение должно отличаться.\"\n});\n"
  },
  {
    "path": "src/i18n/ru.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('ru', {\n  defaultMessage: \"Некорректное значение.\",\n  type: {\n    email:        \"Введите адрес электронной почты.\",\n    url:          \"Введите URL адрес.\",\n    number:       \"Введите число.\",\n    integer:      \"Введите целое число.\",\n    digits:       \"Введите только цифры.\",\n    alphanum:     \"Введите буквенно-цифровое значение.\"\n  },\n  notblank:       \"Это поле должно быть заполнено.\",\n  required:       \"Обязательное поле.\",\n  pattern:        \"Это значение некорректно.\",\n  min:            \"Это значение должно быть не менее чем %s.\",\n  max:            \"Это значение должно быть не более чем %s.\",\n  range:          \"Это значение должно быть от %s до %s.\",\n  minlength:      \"Это значение должно содержать не менее %s символов.\",\n  maxlength:      \"Это значение должно содержать не более %s символов.\",\n  length:         \"Это значение должно содержать от %s до %s символов.\",\n  mincheck:       \"Выберите не менее %s значений.\",\n  maxcheck:       \"Выберите не более %s значений.\",\n  check:          \"Выберите от %s до %s значений.\",\n  equalto:        \"Это значение должно совпадать.\"\n});\n\nParsley.setLocale('ru');\n"
  },
  {
    "path": "src/i18n/sk.extra.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('sk', {\n  dateiso:  \"Prosím zadajte dátum vo formáte RRRR-MM-DD.\",\n  minwords: \"Prosím zadajte hodnotu dlhú %s slov a viacej.\",\n  maxwords: \"Prosím zadajte hodnotu kratšiu ako %s slov.\",\n  words:    \"Prosím zadajte hodnotu medzi %s a %s slov.\",\n  gt:       \"Táto hodnota musí byť väčšia.\",\n  gte:      \"Táto hodnota musí byť väčšia alebo rovná.\",\n  lt:       \"Táto hodnota musí byť menšia.\",\n  lte:      \"Táto hodnota musí byť menšia alebo rovná.\"\n});\n"
  },
  {
    "path": "src/i18n/sk.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('sk', {\n  defaultMessage: \"Prosím zadajte správnu hodnotu.\",\n  type: {\n    email:        \"Prosím zadajte správnu emailovú adresu.\",\n    url:          \"Prosím zadajte platnú URL adresu.\",\n    number:       \"Toto pole môže obsahovať len čísla.\",\n    integer:      \"Toto pole môže obsahovať len celé čísla.\",\n    digits:       \"Toto pole môže obsahovať len kladné celé čísla.\",\n    alphanum:     \"Toto pole môže obsahovať len alfanumerické znaky.\"\n  },\n  notblank:       \"Toto pole nesmie byť prázdne.\",\n  required:       \"Toto pole je povinné.\",\n  pattern:        \"Toto pole je neplatné.\",\n  min:            \"Prosím zadajte hodnotu väčšiu alebo rovnú %s.\",\n  max:            \"Prosím zadajte hodnotu menšiu alebo rovnú %s.\",\n  range:          \"Prosím zadajte hodnotu v rozmedzí %s a %s\",\n  minlength:      \"Prosím zadajte hodnotu dlhšiu ako %s znakov.\",\n  maxlength:      \"Prosím zadajte hodnotu kratšiu ako %s znakov.\",\n  length:         \"Prosím zadajte hodnotu medzi %s a %s znakov.\",\n  mincheck:       \"Je nutné vybrať minimálne %s možností.\",\n  maxcheck:       \"Je nutné vybrať maximálne %s možností.\",\n  check:          \"Je nutné vybrať od %s do %s možností.\",\n  equalto:        \"Prosím zadajte rovnakú hodnotu.\"\n});\n\nParsley.setLocale('sk');\n"
  },
  {
    "path": "src/i18n/sl.extra.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('sl', {\n  dateiso:  \"Vnesite datum v ISO obliki (YYYY-MM-DD).\",\n  minwords: \"Vpis je prekratek. Vpisati morate najmnaj %s besed.\",\n  maxwords: \"Vpis je predolg. Vpišete lahko največ %s besed.\",\n  words:    \"Dolžina vpisa je napačna. Dolžina je lahko samo med %s in %s besed.\",\n  gt:       \"Vpisani podatek mora biti večji.\",\n  gte:      \"Vpisani podatek mora biti enak ali večji.\",\n  lt:       \"Vpisani podatek mora biti manjši.\",\n  lte:      \"Vpisani podatek mora biti enak ali manjši.\",\n  notequalto: \"Vpisana vrednost mora biti drugačna.\"\n});\n"
  },
  {
    "path": "src/i18n/sl.js",
    "content": "// This is included with the Parsley library itself,\n// thus there is no use in adding it to your project.\nimport Parsley from '../parsley/main';\n\nParsley.addMessages('sl', {\n  defaultMessage: \"Podatek ne ustreza vpisnim kriterijem.\",\n  type: {\n    email:        \"Vpišite pravilen email.\",\n    url:          \"Vpišite pravilen url naslov.\",\n    number:       \"Vpišite številko.\",\n    integer:      \"Vpišite celo število brez decimalnih mest.\",\n    digits:       \"Vpišite samo cifre.\",\n    alphanum:     \"Vpišite samo alfanumerične znake (cifre in črke).\"\n  },\n  notblank:       \"To polje ne sme biti prazno.\",\n  required:       \"To polje je obvezno.\",\n  pattern:        \"Podatek ne ustreza vpisnim kriterijem.\",\n  min:            \"Vrednost mora biti višja ali enaka kot %s.\",\n  max:            \"Vrednost mora biti nižja ali enaka kot  %s.\",\n  range:          \"Vrednost mora biti med %s in %s.\",\n  minlength:      \"Vpis je prekratek. Mora imeti najmanj %s znakov.\",\n  maxlength:      \"Vpis je predolg. Lahko ima največ %s znakov.\",\n  length:         \"Število vpisanih znakov je napačno. Število znakov je lahko samo med %s in %s.\",\n  mincheck:       \"Izbrati morate vsaj %s možnosti.\",\n  maxcheck:       \"Izberete lahko največ %s možnosti.\",\n  check:          \"Število izbranih možnosti je lahko samo med %s in %s.\",\n  equalto:        \"Vnos mora biti enak.\"\n});\n\nParsley.setLocale('sl');\n"
  },
  {
    "path": "src/i18n/sq.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('sq', {\n  defaultMessage: \"Kjo vlere eshte e pasakte.\",\n  type: {\n    email:        \"Duhet te jete nje email i vlefshem.\",\n    url:          \"Duhet te jete nje URL e vlefshme.\",\n    number:       \"Duhet te jete numer.\",\n    integer:      \"Kjo vlere duhet te jete integer.\",\n    digits:       \"Kjo vlere duhet te permbaje digit.\",\n    alphanum:     \"Kjo vlere duhet te permbaje vetel alphanumeric.\"\n  },\n  notblank:       \"Nuk mund te lihet bosh.\",\n  required:       \"Eshte e detyrueshme.\",\n  pattern:        \"Kjo vlere eshte e pasakte.\",\n  min:            \"Duhet te jete me e madhe ose baraz me %s.\",\n  max:            \"Duhet te jete me e vogel ose baraz me %s.\",\n  range:          \"Duhet te jete midis %s dhe %s.\",\n  minlength:      \"Kjo vlere eshte shume e shkurter. Ajo duhet te permbaje min %s karaktere.\",\n  maxlength:      \"Kjo vlere eshte shume e gjate. Ajo duhet te permbaje max %s karaktere.\",\n  length:         \"Gjatesia e kesaj vlere eshte e pasakte. Ajo duhet te jete midis %s dhe %s karakteresh.\",\n  mincheck:       \"Ju duhet te zgjidhni te pakten %s vlere.\",\n  maxcheck:       \"Ju duhet te zgjidhni max %s vlera.\",\n  check:          \"Ju mund te zgjidhni midis %s dhe %s vlerash.\",\n  equalto:        \"Kjo vlere duhet te jete e njejte.\"\n});\n\nParsley.setLocale('sq');\n"
  },
  {
    "path": "src/i18n/sr.extra.js",
    "content": "// Extra validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('sr', {\n  dateiso:  \"Unesite validan datum u formatu YYYY-MM-DD.\",\n  minwords: \"Potrebno je da unesete %s ili više reči.\",\n  maxwords: \"Moguće je uneti maksimalno %s reči.\",\n  words:    \"Potrebno je da unesete između %s i %s reči.\",\n  gt:       \"Ova vrednost mora da bude veća.\",\n  gte:      \"Ova vrednost mora da bude veća ili jednaka.\",\n  lt:       \"Ova vrednost mora da bude manja.\",\n  lte:      \"Ova vrednost mora da bude manja ili jednaka.\",\n  notequalto: \"Sadržaj ovog polja mora biti različit.\"\n});\n"
  },
  {
    "path": "src/i18n/sr.js",
    "content": "// Validation errors messages for Parsley\n// Load this after Parsley\n\nParsley.addMessages('sr', {\n  defaultMessage: \"Uneta vrednost nije validna.\",\n  type: {\n    email:        \"Unesite pravilnu email adresu.\",\n    url:          \"Unesite pravilnu url adresu.\",\n    number:       \"Unesite numeričku vrednost.\",\n    integer:      \"Unesite ceo broj bez decimala.\",\n    digits:       \"Unesite samo brojeve.\",\n    alphanum:     \"Unesite samo alfanumeričke znake (slova i brojeve).\"\n  },\n  notblank:       \"Ovo polje ne sme biti prazno.\",\n  required:       \"Ovo polje je obavezno.\",\n  pattern:        \"Uneta vrednost nije validna.\",\n  min:            \"Vrednost mora biti veća ili jednaka %s.\",\n  max:            \"Vrednost mora biti manja ili jednaka %s.\",\n  range:          \"Vrednost mora biti između %s i %s.\",\n  minlength:      \"Unos je prekratak. Mora imati najmanje %s znakova.\",\n  maxlength:      \"Unos je predug. Može imati najviše %s znakova.\",\n  length:         \"Dužina unosa je pogrešna. Broj znakova mora biti između %s i %s.\",\n  mincheck:       \"Morate izabrati minimalno %s opcija.\",\n  maxcheck:       \"Možete izabrati najviše %s opcija.\",\n  check:          \"Broj izabranih opcija mora biti između %s i %s.\",\n  equalto:        \"Unos mora biti jednak.\"\n});\n\nParsley.setLocale('sr');\n"
  },
  {
    "path": "src/i18n/sv.extra.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('sv', {\n  dateiso: \"Ange ett giltigt datum (ÅÅÅÅ-MM-DD).\"\n});\n"
  },
  {
    "path": "src/i18n/sv.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('sv', {\n  defaultMessage: \"Ogiltigt värde.\",\n  type: {\n    email:        \"Ange en giltig e-postadress.\",\n    url:          \"Ange en giltig URL.\",\n    number:       \"Ange ett giltigt nummer.\",\n    integer:      \"Ange ett heltal.\",\n    digits:       \"Ange endast siffror.\",\n    alphanum:     \"Ange endast bokstäver och siffror.\"\n  },\n  notblank:       \"Värdet får inte vara tomt.\",\n  required:       \"Måste fyllas i.\",\n  pattern:        \"Värdet är ej giltigt.\",\n  min:            \"Värdet måste vara större än eller lika med %s.\",\n  max:            \"Värdet måste vara mindre än eller lika med %s.\",\n  range:          \"Värdet måste vara mellan %s och %s.\",\n  minlength:      \"Värdet måste vara minst %s tecken.\",\n  maxlength:      \"Värdet får maximalt innehålla %s tecken.\",\n  length:         \"Värdet måste vara mellan %s och %s tecken.\",\n  mincheck:       \"Minst %s val måste göras.\",\n  maxcheck:       \"Maximalt %s val får göras.\",\n  check:          \"Mellan %s och %s val måste göras.\",\n  equalto:        \"Värdena måste vara lika.\"\n});\n\nParsley.setLocale('sv');\n"
  },
  {
    "path": "src/i18n/ta.js",
    "content": "// Validation errors messages for Parsley TAMIL language Translated by pitchaimuthu2050 AT GAMAIL DOT COM\n// This translation is part of the Project https://thanithamizhakarathikalanjiyam.github.io/\n// Load this after Parsley\n\nParsley.addMessages('ta', {\n  defaultMessage: \"இந்த மதிப்பு தவறானது எனத் தெரிகிறது.\",\n  type: {\n    email:        \"இந்த மதிப்பு சரியான மின்னஞ்சலாக இருக்க வேண்டும்.\",\n    url:          \"இந்த மதிப்பு சரியான URL ஆக இருக்க வேண்டும்.\",\n    number:       \"இந்த மதிப்பு சரியான எண்ணாக இருக்க வேண்டும்.\",\n    integer:      \"இந்த மதிப்பு சரியான முழு எண்ணாக இருக்க வேண்டும்.\",\n    digits:       \"இந்த மதிப்பு இலக்கங்களாக இருக்க வேண்டும்.\",\n    alphanum:     \"இந்த மதிப்பு எண்ணெழுதாக இருக்க வேண்டும்.\"\n  },\n  notblank:       \"இந்த மதிப்பு காலியாக இருக்கக்கூடாது.\",\n  required:       \"இந்த மதிப்பு தேவை.\",\n  pattern:        \"இந்த மதிப்பு தவறானது என்று தெரிகிறது.\",\n  min:            \"இந்த மதிப்பு அதிகமாகவோ அல்லது சமமாகவோ இருக்க வேண்டும் %s.\",\n  max:            \"இந்த மதிப்பு குறைவாகவோ அல்லது சமமாகவோ இருக்க வேண்டும் %s.\",\n  range:          \"இந்த மதிப்பு %s முதல் %s வரை இருக்க வேண்டும்.\",\n  minlength:      \"இந்த மதிப்பு மிகக் குறைவு. இது %s எழுத்துக்கள் அல்லது அதற்கு மேற்பட்டதாக இருக்க வேண்டும்.\",\n  maxlength:      \"இந்த மதிப்பு மிக நீளமானது. இது %s எழுத்துக்கள் அல்லது குறைவாக இருக்க வேண்டும்.\",\n  length:         \"இந்த மதிப்பு நீளம் தவறானது. இது %s மற்றும் %s எழுத்துக்களுக்கு இடையில் இருக்க வேண்டும்.\",\n  mincheck:       \"நீங்கள் குறைந்தது %s தேர்வுகளை தேர்ந்தெடுக்க வேண்டும்.\",\n  maxcheck:       \"நீங்கள் %s தேர்வுகள் அல்லது குறைவாக தேர்ந்தெடுக்க வேண்டும்.\",\n  check:          \"நீங்கள் %s மற்றும் %s தேர்வுகளுக்கு இடையே தேர்ந்தெடுக்க வேண்டும்.\",\n  equalto:        \"இந்த மதிப்பு ஒரே மாதிரியாக இருக்க வேண்டும்.\",\n  euvatin:        \"இது சரியான VAT அடையாள எண் அல்ல.\",\n});\n\nParsley.setLocale('ta');\n"
  },
  {
    "path": "src/i18n/th.extra.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('th', {\n  dateiso:  \"วันที่ต้องมีรูปแบบเป็น YYYY-MM-DD\",\n  date:     \"วันที่ไม่ถูกต้องตามรูปแบบ %s\",\n  datebeforenow: \"วันที่ต้องมีรูปแบบเป็น %s และเป็นวันที่ก่อนวันปัจจุบัน\",\n  dateafternow: \"วันที่ต้องมีรูปแบบเป็น %s และเป็นวันที่หลังวันปัจจุบัน\",\n  minwords: \"กรุณากรอกอย่างน้อย %s คำ\",\n  maxwords: \"กรอกได้ไม่เกิน %s คำ\",\n  words:    \"จำนวนคำต้องอยู่ระหว่าง %s ถึง %s คำ\",\n  gt:       \"กรุณากรอกค่าที่มากกว่า %s\",\n  gte:      \"กรุณากรอกค่าที่มากกว่าหรือเท่ากับ %s\",\n  lt:       \"กรุณากรอกค่าที่น้อยกว่า %s\",\n  lte:      \"กรุณากรอกค่าที่น้อยกว่าหรือเท่ากับ %s\",\n  notequalto: \"ค่าที่กรอกต้องเหมือนกับ %s\"\n});\n"
  },
  {
    "path": "src/i18n/th.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('th', {\n  defaultMessage: \"ค่านี้ดูเหมือนว่าจะไม่ถูกต้อง\",\n  type: {\n    email:        \"กรุณากรอกอีเมลให้ถูกต้อง\",\n    url:          \"กรุณากรอก url ให้ถูกต้อง\",\n    number:       \"กรุณากรอกตัวเลข\",\n    integer:      \"กรุณากรอกจำนวนเต็ม\",\n    digits:       \"กรุณากรอกเลขทศนิยม\",\n    alphanum:     \"กรุณากรอกตัวอักษรและตัวเลข\"\n  },\n  notblank:       \"ห้ามเป็นค่าว่าง\",\n  required:       \"จำเป็นต้องกรอก\",\n  pattern:        \"รูปแบบไม่ถูกต้อง\",\n  min:            \"ต้องมากกว่าหรือเท่ากับ %s\",\n  max:            \"ต้องน้อยกว่าหรือเท่ากับ %s\",\n  range:          \"ต้องอยู่ระหว่าง %s และ %s\",\n  minlength:      \"กรุณากรอกอย่างน้อย %s ตัวอักษร\",\n  maxlength:      \"กรอกได้ไม่เกิน %s ตัวอักษร\",\n  length:         \"ความยาวตัวอักษรต้องอยู่ระหว่าง %s ถึง %s ตัวอักษร\",\n  mincheck:       \"กรุณาเลือกอย่างน้อย %s ตัวเลือก\",\n  maxcheck:       \"เลือกได้ไม่เกิน %s ตัวเลือก\",\n  check:          \"กรุณาเลือกระหว่าง %s และ %s ตัวเลือก\",\n  equalto:        \"ค่าที่กรอกไม่เหมือนกัน\",\n  euvatin:        \"หมายเลขประจำตัวผู้เสียภาษีไม่ถูกต้อง\",\n});\n\nParsley.setLocale('th');\n"
  },
  {
    "path": "src/i18n/tk.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('tk', {\n  defaultMessage: \"Bu maglumat nädogry.\",\n  type: {\n    email:        \"Dogry e-poçta adresi ýazmaly.\",\n    url:          \"Dogry web sahypa salgysy ýazmaly.\",\n    number:       \"Dogry san ýazmaly.\",\n    integer:      \"Dogry bitin san ýazmaly.\",\n    digits:       \"San ýazmaly.\",\n    alphanum:     \"San ýa-da harp ýazmaly.\"\n  },\n  notblank:       \"Bu ýeri boş goýmaly däl.\",\n  required:       \"Bu ýeri doldurmak hökmany.\",\n  pattern:        \"Bu maglumat nädogry.\",\n  min:            \"Iň azyndan %s ýa-da ondan uly bolmaly.\",\n  max:            \"Iň köp %s ýa-da ondan kiçi bolmaly.\",\n  range:          \"Bu ýer %s we %s aralygynda san bolmaly.\",\n  minlength:      \"Bu ýeriň uzynlygy iň azyndan %s harp ýa-da ondan köp bolmaly.\",\n  maxlength:      \"Bu ýeriň uzynlygy iň köp %s harp ýa-da ondan az bolmaly.\",\n  length:         \"Bu ýeriň uzynlygy %s we %s harp aralygynda bolmaly.\",\n  mincheck:       \"Iň azyndan %s sanysyny saýlamaly.\",\n  maxcheck:       \"Iň köp %s sanysyny saýlamaly.\",\n  check:          \"Iň az %s, iň köp %s sanysyny saýlamaly.\",\n  equalto:        \"Bu maglumat deň bolmaly.\"\n});\n\nParsley.setLocale('tk');\n"
  },
  {
    "path": "src/i18n/tr.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('tr', {\n  defaultMessage: \"Girdiğiniz değer geçerli değil.\",\n  type: {\n    email:        \"Geçerli bir e-mail adresi yazmanız gerekiyor.\",\n    url:          \"Geçerli bir bağlantı adresi yazmanız gerekiyor.\",\n    number:       \"Geçerli bir sayı yazmanız gerekiyor.\",\n    integer:      \"Geçerli bir tamsayı yazmanız gerekiyor.\",\n    digits:       \"Geçerli bir rakam yazmanız gerekiyor.\",\n    alphanum:     \"Geçerli bir alfanümerik değer yazmanız gerekiyor.\"\n  },\n  notblank:       \"Bu alan boş bırakılamaz.\",\n  required:       \"Bu alan boş bırakılamaz.\",\n  pattern:        \"Girdiğiniz değer geçerli değil.\",\n  min:            \"Bu alan %s değerinden büyük ya da bu değere eşit olmalı.\",\n  max:            \"Bu alan %s değerinden küçük ya da bu değere eşit olmalı.\",\n  range:          \"Bu alan %s ve %s değerleri arasında olmalı.\",\n  minlength:      \"Bu alanın uzunluğu %s karakter veya daha fazla olmalı.\",\n  maxlength:      \"Bu alanın uzunluğu %s karakter veya daha az olmalı.\",\n  length:         \"Bu alanın uzunluğu %s ve %s karakter arasında olmalı.\",\n  mincheck:       \"En az %s adet seçim yapmalısınız.\",\n  maxcheck:       \"En fazla %s seçim yapabilirsiniz.\",\n  check:          \"Bu alan için en az %s, en fazla %s seçim yapmalısınız.\",\n  equalto:        \"Bu alanın değeri aynı olmalı.\"\n});\n\nParsley.setLocale('tr');\n"
  },
  {
    "path": "src/i18n/ua.extra.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('ua', {\n  dateiso:  \"Це значення повинно бути коректною датою (РРРР-ММ-ДД).\",\n  minwords: \"Це значення повинно містити не менше %s слів.\",\n  maxwords: \"Це значення повинно містити не більше %s слів.\",\n  words:    \"Це значення повинно містити від %s до %s слів.\",\n  gt:       \"Це значення повинно бути більше.\",\n  gte:      \"Це значення повинно бути більше або дорівнює.\",\n  lt:       \"Це значення повинно бути менше.\",\n  lte:      \"Це значення повинно бути менше або дорівнює.\",\n  notequalto: \"Це значення повинно відрізнятися.\"\n});\n"
  },
  {
    "path": "src/i18n/ua.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('ua', {\n  defaultMessage: \"Некоректне значення.\",\n  type: {\n    email:        \"Введіть адресу електронної пошти.\",\n    url:          \"Введіть URL адресу.\",\n    number:       \"Введіть число.\",\n    integer:      \"Введіть ціле число.\",\n    digits:       \"Введіть тільки цифри.\",\n    alphanum:     \"Введіть буквено-цифрове значення.\"\n  },\n  notblank:       \"Це поле має бути заповненим.\",\n  required:       \"Обов'язкове поле.\",\n  pattern:        \"Це значення некоректне.\",\n  min:            \"Це значення повинно бути не менше ніж %s.\",\n  max:            \"Це значення повинно бути не більше ніж %s.\",\n  range:          \"Це значення повинно бути від %s до %s.\",\n  minlength:      \"Це значення повинно містити не менше %s символів.\",\n  maxlength:      \"Це значення повинно містити не більше %s символів.\",\n  length:         \"Це значення повинно містити від %s до %s символів.\",\n  mincheck:       \"Виберіть не менше %s значень.\",\n  maxcheck:       \"Виберіть не більше %s значень.\",\n  check:          \"Виберіть від %s до %s значень.\",\n  equalto:        \"Це значення повинно співпадати.\"\n});\n\nParsley.setLocale('ua');\n"
  },
  {
    "path": "src/i18n/uk.extra.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('uk', {\n  dateiso:  \"Це значення має бути коректною датою (РРРР-ММ-ДД).\",\n  minwords: \"Це значення повинно містити не менше %s слів.\",\n  maxwords: \"Це значення повинно містити не більше %s слів.\",\n  words:    \"Це значення повинно містити від %s до %s слів.\"\n});\n"
  },
  {
    "path": "src/i18n/uk.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('uk', {\n  defaultMessage: \"Некоректне значення.\",\n  type: {\n    email:        \"Введіть адресу електронної пошти.\",\n    url:          \"Введіть URL-адресу.\",\n    number:       \"Введіть число.\",\n    integer:      \"Введіть ціле число.\",\n    digits:       \"Введіть тільки цифри.\",\n    alphanum:     \"Введіть буквено-цифрове значення.\"\n  },\n  notblank:       \"Це поле повинно бути заповнено.\",\n  required:       \"Обов'язкове поле\",\n  pattern:        \"Це значення некоректно.\",\n  min:            \"Це значення повинно бути не менше ніж %s.\",\n  max:            \"Це значення повинно бути не більше ніж %s.\",\n  range:          \"Це значення повинно бути від %s до %s.\",\n  minlength:      \"Це значення повинно містити не менше ніж %s символів.\",\n  maxlength:      \"Це значення повинно містити не більше ніж %s символів.\",\n  length:         \"Це значення повинно містити від %s до %s символів.\",\n  mincheck:       \"Виберіть не менше %s значень.\",\n  maxcheck:       \"Виберіть не більше %s значень.\",\n  check:          \"Виберіть від %s до %s значень.\",\n  equalto:        \"Це значення повинно збігатися.\"\n});\n\nParsley.setLocale('uk');\n"
  },
  {
    "path": "src/i18n/ur.js",
    "content": "// This is included with the Parsley library itself,\n// thus there is no use in adding it to your project.\nimport Parsley from '../parsley/main';\n\nParsley.addMessages('ur', {\n  defaultMessage: \"شائد یہ قیمت غلط ہے۔\",\n  type: {\n    email:        \"یہ قیمت ایک درست ای میل ہونی چاہیے۔\",\n    url:          \"یہ قیمت ایک درست یو آر ایل ہونا چاہیے۔ \",\n    number:       \"یہ قیمت ایک درست نمبر ہونا چاہیے۔\",\n    integer:      \"یہ قیمت ایک عدد صحیح ہونا چاہیے۔\",\n    digits:       \"یہ قیمت اعداد ہونے چاہیے۔\",\n    alphanum:     \"یہ قیمت حرفی ہندسی میں سے ہونا چاہیے۔\"\n  },\n  notblank:       \"یہ قیمت خالی نہیں ہونی چاہیے۔\",\n  required:       \"یہ قیمت ضروری ہے۔ \",\n  pattern:        \"شائد یہ قیمت غلط ہے۔\",\n  min:            \"یہ قیمت %s سے بڑی یا اسکے برابر ہونی چاہیے۔\",\n  max:            \"یہ قیمت %sسے چھوٹی یا اسکے برابر ہونی چاہیے۔\",\n  range:          \"یہ قیمت %sاور %s کے درمیان ہونی چاہیے۔\",\n  minlength:      \"یہ قیمت بہت کم احراف پر مشتمل ہے۔ یہ %sاحراف یا اس سے زیادہ ہونے چاہیے۔\",\n  maxlength:      \"یہ قیمت بہت زیادہ احراف پر مشتمل ہے۔ یہ %sاحراف یا اس سے کم ہونے چاہیے۔\",\n  length:         \"اس قیت کا طول غلط ہے۔ یہ %s اور %s احراف پر مشتمل ہونی چاہیے۔\",\n  mincheck:       \"آپکو کم سے کم %s قیمتوں کا انتخاب کرنا ہوگا۔\",\n  maxcheck:       \"آپکو %s یا اس سے کم قیمتوں کا انتخاب کرنا ہوگا۔\",\n  check:          \"آپکو %s اور %s کے درمیان کسی قیمت کا انتخاب کرنا ہوگا۔\",\n  equalto:        \"یہ قیت جیسی ہے ویسی ہی رہنی چاہیے۔ \"\n});\n\nParsley.setLocale('ur');\n"
  },
  {
    "path": "src/i18n/vi.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('vi', {\n  defaultMessage: \"Trường này có vẻ không đúng.\",\n  type: {\n    email:        \"Trường này không phải là email.\",\n    url:          \"Trường này cần là một đường dẫn.\",\n    number:       \"Trường này cần là một số.\",\n    integer:      \"Trường này cần là số nguyên.\",\n    digits:       \"Trường này cần là ký tự số.\",\n    alphanum:     \"Trường này cần là chữ và số.\"\n  },\n  notblank:       \"Trường này không được để trống.\",\n  required:       \"Trường này là bắt buộc.\",\n  pattern:        \"Giá trị này có vẻ không đúng.\",\n  min:            \"Giá trị cần lớn hơn hoặc bằng %s.\",\n  max:            \"Giá trị cần bé hơn hoặc bằng %s.\",\n  range:          \"Giá trị cần nằm trong khoảng %s và %s.\",\n  minlength:      \"Giá trị quá ngắn. Cần là %s ký tự hoặc nhiều hơn.\",\n  maxlength:      \"Giá trị quá dài. Cần là %s ký tự hoặc ít hơn.\",\n  length:         \"Độ dài không đúng. Cần có độ dài ở giữa %s và %s ký tự.\",\n  mincheck:       \"Bạn cần chọn tối thiểu %s tùy chọn.\",\n  maxcheck:       \"Bạn cần chọn %s tùy chọn hoặc ít hơn.\",\n  check:          \"Bạn cần chọn giữa %s và %s tùy chọn.\",\n  equalto:        \"Giá trị này cần bằng.\",\n  euvatin:        \"Đây không phải là số VAT.\",\n});\n\nParsley.setLocale('vi');\n"
  },
  {
    "path": "src/i18n/zh_cn.extra.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('zh-cn', {\n  dateiso: \"请输入正确格式的日期 (YYYY-MM-DD).\"\n});\n"
  },
  {
    "path": "src/i18n/zh_cn.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('zh-cn', {\n  defaultMessage: \"不正确的值\",\n  type: {\n    email:        \"请输入一个有效的电子邮箱地址\",\n    url:          \"请输入一个有效的链接\",\n    number:       \"请输入正确的数字\",\n    integer:      \"请输入正确的整数\",\n    digits:       \"请输入正确的号码\",\n    alphanum:     \"请输入字母或数字\"\n  },\n  notblank:       \"请输入值\",\n  required:       \"必填项\",\n  pattern:        \"格式不正确\",\n  min:            \"输入值请大于或等于 %s\",\n  max:            \"输入值请小于或等于 %s\",\n  range:          \"输入值应该在 %s 到 %s 之间\",\n  minlength:      \"请输入至少 %s 个字符\",\n  maxlength:      \"请输入至多 %s 个字符\",\n  length:         \"字符长度应该在 %s 到 %s 之间\",\n  mincheck:       \"请至少选择 %s 个选项\",\n  maxcheck:       \"请选择不超过 %s 个选项\",\n  check:          \"请选择 %s 到 %s 个选项\",\n  equalto:        \"输入值不同\"\n});\n\nParsley.setLocale('zh-cn');\n"
  },
  {
    "path": "src/i18n/zh_tw.js",
    "content": "// Validation errors messages for Parsley\nimport Parsley from '../parsley';\n\nParsley.addMessages('zh-tw', {\n  defaultMessage: \"這個值似乎是無效的。\",\n  type: {\n    email:        \"請輸入一個正確的電子郵件地址。\",\n    url:          \"請輸入一個有效的網址。\",\n    number:       \"請輸入一個數字。\",\n    integer:      \"請輸入一個整數。\",\n    digits:       \"這個欄位只接受數字。\",\n    alphanum:     \"這個欄位只接受英文字母或是數字。\"\n  },\n  notblank:       \"這個欄位不能為空白。\",\n  required:       \"這個欄位必須填寫。\",\n  pattern:        \"這個值似乎是無效的。\",\n  min:            \"輸入的值應該大於或等於 %s\",\n  max:            \"輸入的值應該小於或等於 %s\",\n  range:          \"輸入的值應該在 %s 和 %s 之間。\",\n  minlength:      \"輸入的值至少要有 %s 個字元。\",\n  maxlength:      \"輸入的值最多可以有 %s 個字元。\",\n  length:         \"字元長度應該在 %s 和 %s 之間。\",\n  mincheck:       \"你至少要選擇 %s 個項目。\",\n  maxcheck:       \"你最多可選擇 %s 個項目。\",\n  check:          \"你必須選擇 %s 到 %s 個項目。\",\n  equalto:        \"輸入值不同。\"\n});\n\nParsley.setLocale('zh-tw');\n"
  },
  {
    "path": "src/parsley/base.js",
    "content": "import $ from 'jquery';\nimport Utils from './utils';\n\nvar Base = function () {\n  this.__id__ = Utils.generateID();\n};\n\nBase.prototype = {\n  asyncSupport: true, // Deprecated\n\n  _pipeAccordingToValidationResult: function () {\n    var pipe = () => {\n      var r = $.Deferred();\n      if (true !== this.validationResult)\n        r.reject();\n      return r.resolve().promise();\n    };\n    return [pipe, pipe];\n  },\n\n  actualizeOptions: function () {\n    Utils.attr(this.element, this.options.namespace, this.domOptions);\n    if (this.parent && this.parent.actualizeOptions)\n      this.parent.actualizeOptions();\n    return this;\n  },\n\n  _resetOptions: function (initOptions) {\n    this.domOptions = Utils.objectCreate(this.parent.options);\n    this.options = Utils.objectCreate(this.domOptions);\n    // Shallow copy of ownProperties of initOptions:\n    for (var i in initOptions) {\n      if (initOptions.hasOwnProperty(i))\n        this.options[i] = initOptions[i];\n    }\n    this.actualizeOptions();\n  },\n\n  _listeners: null,\n\n  // Register a callback for the given event name\n  // Callback is called with context as the first argument and the `this`\n  // The context is the current parsley instance, or window.Parsley if global\n  // A return value of `false` will interrupt the calls\n  on: function (name, fn) {\n    this._listeners = this._listeners || {};\n    var queue = this._listeners[name] = this._listeners[name] || [];\n    queue.push(fn);\n\n    return this;\n  },\n\n  // Deprecated. Use `on` instead\n  subscribe: function(name, fn) {\n    $.listenTo(this, name.toLowerCase(), fn);\n  },\n\n  // Unregister a callback (or all if none is given) for the given event name\n  off: function (name, fn) {\n    var queue = this._listeners && this._listeners[name];\n    if (queue) {\n      if (!fn) {\n        delete this._listeners[name];\n      } else {\n        for (var i = queue.length; i--; )\n          if (queue[i] === fn)\n            queue.splice(i, 1);\n      }\n    }\n    return this;\n  },\n\n  // Deprecated. Use `off`\n  unsubscribe: function(name, fn) {\n    $.unsubscribeTo(this, name.toLowerCase());\n  },\n\n  // Trigger an event of the given name\n  // A return value of `false` interrupts the callback chain\n  // Returns false if execution was interrupted\n  trigger: function (name, target, extraArg) {\n    target = target || this;\n    var queue = this._listeners && this._listeners[name];\n    var result;\n    var parentResult;\n    if (queue) {\n      for (var i = queue.length; i--; ) {\n        result = queue[i].call(target, target, extraArg);\n        if (result === false) return result;\n      }\n    }\n    if (this.parent) {\n      return this.parent.trigger(name, target, extraArg);\n    }\n    return true;\n  },\n\n  asyncIsValid: function (group, force) {\n    Utils.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n    return this.whenValid({group, force});\n  },\n\n  _findRelated: function () {\n    return this.options.multiple ?\n      $(this.parent.element.querySelectorAll(`[${this.options.namespace}multiple=\"${this.options.multiple}\"]`))\n    : this.$element;\n  }\n};\n\nexport default Base;\n"
  },
  {
    "path": "src/parsley/constraint.js",
    "content": "import Utils from './utils';\nimport Validator from './validator';\n\nconst Constraint = function(parsleyField, name, requirements, priority, isDomConstraint) {\n  const validatorSpec = window.Parsley._validatorRegistry.validators[name];\n  const validator = new Validator(validatorSpec);\n  priority = priority || parsleyField.options[name + 'Priority'] || validator.priority;\n  isDomConstraint = (true === isDomConstraint);\n\n  Object.assign(this, {\n    validator,\n    name,\n    requirements,\n    priority,\n    isDomConstraint\n  });\n  this._parseRequirements(parsleyField.options);\n};\n\nconst capitalize = function(str) {\n  const cap = str[0].toUpperCase();\n  return cap + str.slice(1);\n};\n\nConstraint.prototype = {\n  validate: function(value, instance) {\n    return this.validator.validate(value, ...this.requirementList, instance);\n  },\n\n  _parseRequirements: function(options) {\n    this.requirementList = this.validator.parseRequirements(this.requirements,\n      key => options[this.name + capitalize(key)]\n    );\n  }\n};\n\nexport default Constraint;\n"
  },
  {
    "path": "src/parsley/defaults.js",
    "content": "// All these options could be overriden and specified directly in DOM using\n// `data-parsley-` default DOM-API\n// eg: `inputs` can be set in DOM using `data-parsley-inputs=\"input, textarea\"`\n// eg: `data-parsley-stop-on-first-failing-constraint=\"false\"`\n\nvar Defaults = {\n  // ### General\n\n  // Default data-namespace for DOM API\n  namespace: 'data-parsley-',\n\n  // Supported inputs by default\n  inputs: 'input, textarea, select',\n\n  // Excluded inputs by default\n  excluded: 'input[type=button], input[type=submit], input[type=reset], input[type=hidden]',\n\n  // Stop validating field on highest priority failing constraint\n  priorityEnabled: true,\n\n  // ### Field only\n\n  // identifier used to group together inputs (e.g. radio buttons...)\n  multiple: null,\n\n  // identifier (or array of identifiers) used to validate only a select group of inputs\n  group: null,\n\n  // ### UI\n  // Enable\\Disable error messages\n  uiEnabled: true,\n\n  // Key events threshold before validation\n  validationThreshold: 3,\n\n  // Focused field on form validation error. 'first'|'last'|'none'\n  focus: 'first',\n\n  // event(s) that will trigger validation before first failure. eg: `input`...\n  trigger: false,\n\n  // event(s) that will trigger validation after first failure.\n  triggerAfterFailure: 'input',\n\n  // Class that would be added on every failing validation Parsley field\n  errorClass: 'parsley-error',\n\n  // Same for success validation\n  successClass: 'parsley-success',\n\n  // Return the `$element` that will receive these above success or error classes\n  // Could also be (and given directly from DOM) a valid selector like `'#div'`\n  classHandler: function (Field) {},\n\n  // Return the `$element` where errors will be appended\n  // Could also be (and given directly from DOM) a valid selector like `'#div'`\n  errorsContainer: function (Field) {},\n\n  // ul elem that would receive errors' list\n  errorsWrapper: '<ul class=\"parsley-errors-list\"></ul>',\n\n  // li elem that would receive error message\n  errorTemplate: '<li></li>'\n};\n\nexport default Defaults;\n"
  },
  {
    "path": "src/parsley/factory.js",
    "content": "import $ from 'jquery';\nimport Utils from './utils';\nimport Base from './base';\nimport Form from './form';\nimport Field from './field';\nimport Multiple from './multiple';\n\nvar Factory = function (element, options, parsleyFormInstance) {\n  this.element = element;\n  this.$element = $(element);\n\n  // If the element has already been bound, returns its saved Parsley instance\n  var savedparsleyFormInstance = Utils.getData(this.element, 'Parsley');\n  if (savedparsleyFormInstance) {\n\n    // If the saved instance has been bound without a Form parent and there is one given in this call, add it\n    if ('undefined' !== typeof parsleyFormInstance && savedparsleyFormInstance.parent === window.Parsley) {\n      savedparsleyFormInstance.parent = parsleyFormInstance;\n      savedparsleyFormInstance._resetOptions(savedparsleyFormInstance.options);\n    }\n\n    if ('object' === typeof options) {\n      Object.assign(savedparsleyFormInstance.options, options);\n    }\n\n    return savedparsleyFormInstance;\n  }\n\n  // Parsley must be instantiated with a DOM element or jQuery $element\n  if (this.element === null)\n    throw new Error('You must bind Parsley on an existing element.');\n\n  if ('undefined' !== typeof parsleyFormInstance && 'Form' !== parsleyFormInstance.__class__)\n    throw new Error('Parent instance must be a Form instance');\n\n  this.parent = parsleyFormInstance || window.Parsley;\n  return this.init(options);\n};\n\nFactory.prototype = {\n  init: function (options) {\n    this.__class__ = 'Parsley';\n    this.__version__ = 'VERSION';\n    this.__id__ = Utils.generateID();\n\n    // Pre-compute options\n    this._resetOptions(options);\n\n    // A Form instance is obviously a `<form>` element but also every node that is not an input and has the `data-parsley-validate` attribute\n    if (this.element.nodeName === 'FORM'\n      || (Utils.checkAttr(this.element, this.options.namespace, 'validate')\n        && !this.options.inputs.split(',').some(input => input.trim() === this.element.tagName.toLowerCase())))\n      return this.bind('parsleyForm');\n\n    // Every other element is bound as a `Field` or `FieldMultiple`\n    return this.isMultiple() ? this.handleMultiple() : this.bind('parsleyField');\n  },\n\n  isMultiple: function () {\n    var type = Utils.getType(this.element);\n    return ((type === 'radio' || type === 'checkbox') ||\n      (this.element.nodeName === 'SELECT' && null !== this.element.getAttribute('multiple')));\n  },\n\n  // Multiples fields are a real nightmare :(\n  // Maybe some refactoring would be appreciated here...\n  handleMultiple: function () {\n    var name;\n    var multiple;\n    var parsleyMultipleInstance;\n\n    // Handle multiple name\n    this.options.multiple = this.options.multiple ||\n      (name = this.element.getAttribute('name')) ||\n      this.element.getAttribute('id');\n\n    // Special select multiple input\n    if (this.element.nodeName === 'SELECT' && null !== this.element.getAttribute('multiple')) {\n      this.options.multiple = this.options.multiple || this.__id__;\n      return this.bind('parsleyFieldMultiple');\n\n      // Else for radio / checkboxes, we need a `name` or `data-parsley-multiple` to properly bind it\n    } else if (!this.options.multiple) {\n      Utils.warn('To be bound by Parsley, a radio, a checkbox and a multiple select input must have either a name or a multiple option.', this.$element);\n      return this;\n    }\n\n    // Remove special chars\n    this.options.multiple = this.options.multiple.replace(/(:|\\.|\\[|\\]|\\{|\\}|\\$)/g, '');\n\n    // Add proper `data-parsley-multiple` to siblings if we have a valid multiple name\n    if (name) {\n      const inputs = document.querySelectorAll('input[name=\"' + name + '\"]');\n      inputs.forEach((input) => {\n        var type = Utils.getType(input);\n        if ((type === 'radio' || type === 'checkbox'))\n          input.setAttribute(this.options.namespace + 'multiple', this.options.multiple);\n      });\n    }\n\n    // Check here if we don't already have a related multiple instance saved\n    var $previouslyRelated = this._findRelated();\n    for (var i = 0; i < $previouslyRelated.length; i++) {\n      parsleyMultipleInstance = Utils.getData($previouslyRelated.get(i), 'Parsley');\n      if ('undefined' !== typeof parsleyMultipleInstance) {\n\n        if (!Utils.getData(this.element, 'FieldMultiple')) {\n          parsleyMultipleInstance.addElement(this.$element);\n        }\n\n        break;\n      }\n    }\n\n    // Create a secret Field instance for every multiple field. It will be stored in `data('FieldMultiple')`\n    // And will be useful later to access classic `Field` stuff while being in a `FieldMultiple` instance\n    this.bind('parsleyField', true);\n\n    return parsleyMultipleInstance || this.bind('parsleyFieldMultiple');\n  },\n\n  // Return proper `Form`, `Field` or `FieldMultiple`\n  bind: function (type, doNotStore) {\n    var parsleyInstance;\n\n    switch (type) {\n      case 'parsleyForm':\n        parsleyInstance = Object.assign(\n          new Form(this.element, this.domOptions, this.options),\n          Form.prototype,\n          new Base(),\n          Base.prototype,\n          window.ParsleyExtend\n        )._bindFields();\n        break;\n      case 'parsleyField':\n        parsleyInstance = Object.assign(\n          new Field(this.element, this.domOptions, this.options, this.parent),\n          Field.prototype,\n          new Base(),\n          Base.prototype,\n          window.ParsleyExtend\n        );\n        break;\n      case 'parsleyFieldMultiple':\n        parsleyInstance = Object.assign(\n          new Field(this.element, this.domOptions, this.options, this.parent),\n          Field.prototype,\n          new Multiple(),\n          Multiple.prototype,\n          new Base(),\n          Base.prototype,\n          window.ParsleyExtend\n        )._init();\n        break;\n      default:\n        throw new Error(type + 'is not a supported Parsley type');\n    }\n\n    if (this.options.multiple)\n      Utils.setAttr(this.element, this.options.namespace, 'multiple', this.options.multiple);\n\n    if ('undefined' !== typeof doNotStore) {\n      Utils.setData(this.element, 'FieldMultiple', parsleyInstance);\n\n      return parsleyInstance;\n    }\n\n    // Store the freshly bound instance in a DOM element for later access using jQuery `data()`\n    Utils.setData(this.element, 'Parsley', parsleyInstance);\n\n    // Tell the world we have a new Form or Field instance!\n    parsleyInstance._actualizeTriggers();\n    parsleyInstance._trigger('init');\n\n    return parsleyInstance;\n  }\n};\n\nexport default Factory;\n"
  },
  {
    "path": "src/parsley/field.js",
    "content": "import $ from 'jquery';\nimport Constraint from './constraint';\nimport UI from './ui';\nimport Utils from './utils';\n\nvar Field = function (field, domOptions, options, parsleyFormInstance) {\n  this.__class__ = 'Field';\n\n  this.element = field;\n  this.$element = $(field);\n\n  // Set parent if we have one\n  if ('undefined' !== typeof parsleyFormInstance) {\n    this.parent = parsleyFormInstance;\n  }\n\n  this.options = options;\n  this.domOptions = domOptions;\n\n  // Initialize some properties\n  this.constraints = [];\n  this.constraintsByName = {};\n  this.validationResult = true;\n\n  // Bind constraints\n  this._bindConstraints();\n};\n\nvar statusMapping = {pending: null, resolved: true, rejected: false};\n\nField.prototype = {\n  // # Public API\n  // Validate field and trigger some events for mainly `UI`\n  // @returns `true`, an array of the validators that failed, or\n  // `null` if validation is not finished. Prefer using whenValidate\n  validate: function (options) {\n    if (arguments.length >= 1 && !Utils.isPlainObject(options)) {\n      Utils.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n      options = {options};\n    }\n    var promise = this.whenValidate(options);\n    if (!promise)  // If excluded with `group` option\n      return true;\n    switch (promise.state()) {\n      case 'pending': return null;\n      case 'resolved': return true;\n      case 'rejected': return this.validationResult;\n    }\n  },\n\n  // Validate field and trigger some events for mainly `UI`\n  // @returns a promise that succeeds only when all validations do\n  // or `undefined` if field is not in the given `group`.\n  whenValidate: function ({force, group} =  {}) {\n    // do not validate a field if not the same as given validation group\n    this.refresh();\n    if (group && !this._isInGroup(group))\n      return;\n\n    this.value = this.getValue();\n\n    // Field Validate event. `this.value` could be altered for custom needs\n    this._trigger('validate');\n\n    return this.whenValid({force, value: this.value, _refreshed: true})\n      .always(() => { this._reflowUI(); })\n      .done(() =>   { this._trigger('success'); })\n      .fail(() =>   { this._trigger('error'); })\n      .always(() => { this._trigger('validated'); })\n      .pipe(...this._pipeAccordingToValidationResult());\n  },\n\n  hasConstraints: function () {\n    return 0 !== this.constraints.length;\n  },\n\n  // An empty optional field does not need validation\n  needsValidation: function (value) {\n    if ('undefined' === typeof value)\n      value = this.getValue();\n\n    // If a field is empty and not required, it is valid\n    // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n    if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty)\n      return false;\n\n    return true;\n  },\n\n  _isInGroup: function (group) {\n    if (Array.isArray(this.options.group))\n      return -1 !== this.options.group.indexOf(group);\n    return this.options.group === group;\n  },\n\n  // Just validate field. Do not trigger any event.\n  // Returns `true` iff all constraints pass, `false` if there are failures,\n  // or `null` if the result can not be determined yet (depends on a promise)\n  // See also `whenValid`.\n  isValid: function (options) {\n    if (arguments.length >= 1 && !Utils.isPlainObject(options)) {\n      Utils.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n      var [force, value] = arguments;\n      options = {force, value};\n    }\n    var promise = this.whenValid(options);\n    if (!promise) // Excluded via `group`\n      return true;\n    return statusMapping[promise.state()];\n  },\n\n  // Just validate field. Do not trigger any event.\n  // @returns a promise that succeeds only when all validations do\n  // or `undefined` if the field is not in the given `group`.\n  // The argument `force` will force validation of empty fields.\n  // If a `value` is given, it will be validated instead of the value of the input.\n  whenValid: function ({force = false, value, group, _refreshed} = {}) {\n    // Recompute options and rebind constraints to have latest changes\n    if (!_refreshed)\n      this.refresh();\n    // do not validate a field if not the same as given validation group\n    if (group && !this._isInGroup(group))\n      return;\n\n    this.validationResult = true;\n\n    // A field without constraint is valid\n    if (!this.hasConstraints())\n      return $.when();\n\n    // Value could be passed as argument, needed to add more power to 'field:validate'\n    if ('undefined' === typeof value || null === value)\n      value = this.getValue();\n\n    if (!this.needsValidation(value) && true !== force)\n      return $.when();\n\n    var groupedConstraints = this._getGroupedConstraints();\n    var promises = [];\n    $.each(groupedConstraints, (_, constraints) => {\n      // Process one group of constraints at a time, we validate the constraints\n      // and combine the promises together.\n      var promise = Utils.all(\n        constraints.map(constraint => this._validateConstraint(value, constraint))\n      );\n      promises.push(promise);\n      if (promise.state() === 'rejected')\n        return false; // Interrupt processing if a group has already failed\n    });\n    return Utils.all(promises);\n  },\n\n  // @returns a promise\n  _validateConstraint: function(value, constraint) {\n    var result = constraint.validate(value, this);\n    // Map false to a failed promise\n    if (false === result)\n      result = $.Deferred().reject();\n    // Make sure we return a promise and that we record failures\n    return Utils.all([result]).fail(errorMessage => {\n      if (!(this.validationResult instanceof Array))\n        this.validationResult = [];\n      this.validationResult.push({\n        assert: constraint,\n        errorMessage: 'string' === typeof errorMessage && errorMessage\n      });\n    });\n  },\n\n  // @returns Parsley field computed value that could be overrided or configured in DOM\n  getValue: function () {\n    var value;\n\n    // Value could be overriden in DOM or with explicit options\n    if ('function' === typeof this.options.value)\n      value = this.options.value(this);\n    else if ('undefined' !== typeof this.options.value)\n      value = this.options.value;\n    else\n      value = this.$element.val();\n\n    // Handle wrong DOM or configurations\n    if ('undefined' === typeof value || null === value)\n      return '';\n\n    return this._handleWhitespace(value);\n  },\n\n  // Reset UI\n  reset: function () {\n    this._resetUI();\n    return this._trigger('reset');\n  },\n\n  // Destroy Parsley instance (+ UI)\n  destroy: function () {\n    // Field case: emit destroy event to clean UI and then destroy stored instance\n    this._destroyUI();\n    Utils.removeData(this.element, 'Parsley');\n    Utils.removeData(this.element, 'FieldMultiple');\n    this._trigger('destroy');\n  },\n\n  // Actualize options and rebind constraints\n  refresh: function () {\n    this._refreshConstraints();\n    return this;\n  },\n\n  _refreshConstraints: function () {\n    return this.actualizeOptions()._bindConstraints();\n  },\n\n  refreshConstraints: function() {\n    Utils.warnOnce(\"Parsley's refreshConstraints is deprecated. Please use refresh\");\n    return this.refresh();\n  },\n\n  /**\n  * Add a new constraint to a field\n  *\n  * @param {String}   name\n  * @param {Mixed}    requirements      optional\n  * @param {Number}   priority          optional\n  * @param {Boolean}  isDomConstraint   optional\n  */\n  addConstraint: function (name, requirements, priority, isDomConstraint) {\n\n    if (window.Parsley._validatorRegistry.validators[name]) {\n      var constraint = new Constraint(this, name, requirements, priority, isDomConstraint);\n\n      // if constraint already exist, delete it and push new version\n      if ('undefined' !== this.constraintsByName[constraint.name])\n        this.removeConstraint(constraint.name);\n\n      this.constraints.push(constraint);\n      this.constraintsByName[constraint.name] = constraint;\n    }\n\n    return this;\n  },\n\n  // Remove a constraint\n  removeConstraint: function (name) {\n    for (var i = 0; i < this.constraints.length; i++)\n      if (name === this.constraints[i].name) {\n        this.constraints.splice(i, 1);\n        break;\n      }\n    delete this.constraintsByName[name];\n    return this;\n  },\n\n  // Update a constraint (Remove + re-add)\n  updateConstraint: function (name, parameters, priority) {\n    return this.removeConstraint(name)\n      .addConstraint(name, parameters, priority);\n  },\n\n  // # Internals\n\n  // Internal only.\n  // Bind constraints from config + options + DOM\n  _bindConstraints: function () {\n    var constraints = [];\n    var constraintsByName = {};\n\n    // clean all existing DOM constraints to only keep javascript user constraints\n    for (var i = 0; i < this.constraints.length; i++)\n      if (false === this.constraints[i].isDomConstraint) {\n        constraints.push(this.constraints[i]);\n        constraintsByName[this.constraints[i].name] = this.constraints[i];\n      }\n\n    this.constraints = constraints;\n    this.constraintsByName = constraintsByName;\n\n    // then re-add Parsley DOM-API constraints\n    for (var name in this.options)\n      this.addConstraint(name, this.options[name], undefined, true);\n\n    // finally, bind special HTML5 constraints\n    return this._bindHtml5Constraints();\n  },\n\n  // Internal only.\n  // Bind specific HTML5 constraints to be HTML5 compliant\n  _bindHtml5Constraints: function () {\n    // html5 required\n    if (null !== this.element.getAttribute('required'))\n      this.addConstraint('required', true, undefined, true);\n\n    // html5 pattern\n    if (null !== this.element.getAttribute('pattern'))\n      this.addConstraint('pattern', this.element.getAttribute('pattern'), undefined, true);\n\n    // range\n    let min = this.element.getAttribute('min');\n    let max = this.element.getAttribute('max');\n    if (null !== min && null !== max)\n      this.addConstraint('range', [min, max], undefined, true);\n\n    // HTML5 min\n    else if (null !== min)\n      this.addConstraint('min', min, undefined, true);\n\n    // HTML5 max\n    else if (null !== max)\n      this.addConstraint('max', max, undefined, true);\n\n\n    // length\n    if (null !== this.element.getAttribute('minlength') && null !== this.element.getAttribute('maxlength'))\n      this.addConstraint('length', [this.element.getAttribute('minlength'), this.element.getAttribute('maxlength')], undefined, true);\n\n    // HTML5 minlength\n    else if (null !== this.element.getAttribute('minlength'))\n      this.addConstraint('minlength', this.element.getAttribute('minlength'), undefined, true);\n\n    // HTML5 maxlength\n    else if (null !== this.element.getAttribute('maxlength'))\n      this.addConstraint('maxlength', this.element.getAttribute('maxlength'), undefined, true);\n\n\n    // html5 types\n    var type = Utils.getType(this.element);\n\n    // Small special case here for HTML5 number: integer validator if step attribute is undefined or an integer value, number otherwise\n    if ('number' === type) {\n      return this.addConstraint('type', ['number', {\n        step: this.element.getAttribute('step') || '1',\n        base: min || this.element.getAttribute('value')\n      }], undefined, true);\n    // Regular other HTML5 supported types\n    } else if (/^(email|url|range|date)$/i.test(type)) {\n      return this.addConstraint('type', type, undefined, true);\n    }\n    return this;\n  },\n\n  // Internal only.\n  // Field is required if have required constraint without `false` value\n  _isRequired: function () {\n    if ('undefined' === typeof this.constraintsByName.required)\n      return false;\n\n    return false !== this.constraintsByName.required.requirements;\n  },\n\n  // Internal only.\n  // Shortcut to trigger an event\n  _trigger: function (eventName) {\n    return this.trigger('field:' + eventName);\n  },\n\n  // Internal only\n  // Handles whitespace in a value\n  // Use `data-parsley-whitespace=\"squish\"` to auto squish input value\n  // Use `data-parsley-whitespace=\"trim\"` to auto trim input value\n  _handleWhitespace: function (value) {\n    if (true === this.options.trimValue)\n      Utils.warnOnce('data-parsley-trim-value=\"true\" is deprecated, please use data-parsley-whitespace=\"trim\"');\n\n    if ('squish' === this.options.whitespace)\n      value = value.replace(/\\s{2,}/g, ' ');\n\n    if (('trim' === this.options.whitespace) || ('squish' === this.options.whitespace) || (true === this.options.trimValue))\n      value = Utils.trimString(value);\n\n    return value;\n  },\n\n  _isDateInput: function() {\n    var c = this.constraintsByName.type;\n    return c && c.requirements === 'date';\n  },\n\n  // Internal only.\n  // Returns the constraints, grouped by descending priority.\n  // The result is thus an array of arrays of constraints.\n  _getGroupedConstraints: function () {\n    if (false === this.options.priorityEnabled)\n      return [this.constraints];\n\n    var groupedConstraints = [];\n    var index = {};\n\n    // Create array unique of priorities\n    for (var i = 0; i < this.constraints.length; i++) {\n      var p = this.constraints[i].priority;\n      if (!index[p])\n        groupedConstraints.push(index[p] = []);\n      index[p].push(this.constraints[i]);\n    }\n    // Sort them by priority DESC\n    groupedConstraints.sort(function (a, b) { return b[0].priority - a[0].priority; });\n\n    return groupedConstraints;\n  }\n\n};\n\nexport default Field;\n"
  },
  {
    "path": "src/parsley/form.js",
    "content": "import $ from 'jquery';\nimport Base from './base';\nimport Utils from './utils';\n\nvar Form = function (element, domOptions, options) {\n  this.__class__ = 'Form';\n\n  this.element = element;\n  this.$element = $(element);\n  this.domOptions = domOptions;\n  this.options = options;\n  this.parent = window.Parsley;\n\n  this.fields = [];\n  this.validationResult = null;\n};\n\nvar statusMapping = {pending: null, resolved: true, rejected: false};\n\nForm.prototype = {\n  onSubmitValidate: function (event) {\n    // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n    if (true === event.parsley)\n      return;\n\n    // If we didn't come here through a submit button, use the first one in the form\n    var submitSource = this._submitSource || this.$element.find(Utils._SubmitSelector)[0];\n    this._submitSource = null;\n    var submitButtons = this.element.querySelectorAll('.parsley-synthetic-submit-button');\n    [...submitButtons].forEach(btn => btn.disabled = true);\n\n    if (submitSource && null !== submitSource.getAttribute('formnovalidate'))\n      return;\n\n    window.Parsley._remoteCache = {};\n\n    var promise = this.whenValidate({event});\n\n    if ('resolved' === promise.state() && false !== this._trigger('submit')) {\n      // All good, let event go through. We make this distinction because browsers\n      // differ in their handling of `submit` being called from inside a submit event [#1047]\n    } else {\n      // Rejected or pending: cancel this submit\n      event.stopImmediatePropagation();\n      event.preventDefault();\n      if ('pending' === promise.state())\n        promise.done(() => { this._submit(submitSource); });\n    }\n  },\n\n  onSubmitButton: function(event) {\n    this._submitSource = event.currentTarget;\n  },\n  // internal\n  // _submit submits the form, this time without going through the validations.\n  // Care must be taken to \"fake\" the actual submit button being clicked.\n  _submit: function (submitSource) {\n    if (false === this._trigger('submit'))\n      return;\n    // Add submit button's data\n    if (submitSource) {\n      var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n      if (0 === $synthetic.length)\n        $synthetic = $('<input class=\"parsley-synthetic-submit-button\" type=\"hidden\">').appendTo(this.$element);\n      $synthetic.attr({\n        name: submitSource.getAttribute('name'),\n        value: submitSource.getAttribute('value')\n      });\n    }\n\n    this.$element.trigger(Object.assign($.Event('submit'), {parsley: true}));\n  },\n\n  // Performs validation on fields while triggering events.\n  // @returns `true` if all validations succeeds, `false`\n  // if a failure is immediately detected, or `null`\n  // if dependant on a promise.\n  // Consider using `whenValidate` instead.\n  validate: function (options) {\n    if (arguments.length >= 1 && !Utils.isPlainObject(options)) {\n      Utils.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n      var [group, force, event] = arguments;\n      options = {group, force, event};\n    }\n    return statusMapping[ this.whenValidate(options).state() ];\n  },\n\n  whenValidate: function ({group, force, event} = {}) {\n    this.submitEvent = event;\n    if (event) {\n      this.submitEvent = Object.assign({}, event, {preventDefault: () => {\n        Utils.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n        this.validationResult = false;\n      }});\n    }\n    this.validationResult = true;\n\n    // fire validate event to eventually modify things before every validation\n    this._trigger('validate');\n\n    // Refresh form DOM options and form's fields that could have changed\n    this._refreshFields();\n\n    var promises = this._withoutReactualizingFormOptions(() => {\n      return $.map(this.fields, field => field.whenValidate({force, group}));\n    });\n\n    return Utils.all(promises)\n      .done(  () => { this._trigger('success'); })\n      .fail(  () => {\n        this.validationResult = false;\n        this.focus();\n        this._trigger('error');\n      })\n      .always(() => { this._trigger('validated'); })\n      .pipe(...this._pipeAccordingToValidationResult());\n  },\n\n  // Iterate over refreshed fields, and stop on first failure.\n  // Returns `true` if all fields are valid, `false` if a failure is detected\n  // or `null` if the result depends on an unresolved promise.\n  // Prefer using `whenValid` instead.\n  isValid: function (options) {\n    if (arguments.length >= 1 && !Utils.isPlainObject(options)) {\n      Utils.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n      var [group, force] = arguments;\n      options = {group, force};\n    }\n    return statusMapping[ this.whenValid(options).state() ];\n  },\n\n  // Iterate over refreshed fields and validate them.\n  // Returns a promise.\n  // A validation that immediately fails will interrupt the validations.\n  whenValid: function ({group, force} = {}) {\n    this._refreshFields();\n\n    var promises = this._withoutReactualizingFormOptions(() => {\n      return this.fields.map(field => field.whenValid({group, force}));\n    });\n    return Utils.all(promises);\n  },\n\n  refresh: function() {\n    this._refreshFields();\n    return this;\n  },\n\n  // Reset UI\n  reset: function () {\n    // Form case: emit a reset event for each field\n    for (var i = 0; i < this.fields.length; i++)\n      this.fields[i].reset();\n\n    this._trigger('reset');\n  },\n\n  // Destroy Parsley instance (+ UI)\n  destroy: function () {\n    // Field case: emit destroy event to clean UI and then destroy stored instance\n    this._destroyUI();\n\n    // Form case: destroy all its fields and then destroy stored instance\n    for (var i = 0; i < this.fields.length; i++)\n      this.fields[i].destroy();\n\n    Utils.removeData(this.element, 'Parsley');\n    this._trigger('destroy');\n  },\n\n  _refreshFields: function () {\n    return this.actualizeOptions()._bindFields();\n  },\n\n  _bindFields: function () {\n    var oldFields = this.fields;\n\n    this.fields = [];\n    this.fieldsMappedById = {};\n\n    this._withoutReactualizingFormOptions(() => {\n      this.$element\n      .find(this.options.inputs)\n      .not(this.options.excluded)\n      .not(`[${this.options.namespace}excluded=true]`)\n      .each((_, element) => {\n        var fieldInstance = new window.Parsley.Factory(element, {}, this);\n\n        // Only add valid and not excluded `Field` and `FieldMultiple` children\n        if ('Field' === fieldInstance.__class__ || 'FieldMultiple' === fieldInstance.__class__) {\n          let uniqueId = fieldInstance.__class__ + '-' + fieldInstance.__id__;\n          if ('undefined' === typeof this.fieldsMappedById[uniqueId]) {\n            this.fieldsMappedById[uniqueId] = fieldInstance;\n            this.fields.push(fieldInstance);\n          }\n        }\n      });\n      Utils.difference(oldFields, this.fields).forEach((field) => {\n        field.reset();\n      })\n    });\n    return this;\n  },\n\n  // Internal only.\n  // Looping on a form's fields to do validation or similar\n  // will trigger reactualizing options on all of them, which\n  // in turn will reactualize the form's options.\n  // To avoid calling actualizeOptions so many times on the form\n  // for nothing, _withoutReactualizingFormOptions temporarily disables\n  // the method actualizeOptions on this form while `fn` is called.\n  _withoutReactualizingFormOptions: function (fn) {\n    var oldActualizeOptions = this.actualizeOptions;\n    this.actualizeOptions = function () { return this; };\n    var result = fn();\n    this.actualizeOptions = oldActualizeOptions;\n    return result;\n  },\n\n  // Internal only.\n  // Shortcut to trigger an event\n  // Returns true iff event is not interrupted and default not prevented.\n  _trigger: function (eventName) {\n    return this.trigger('form:' + eventName);\n  }\n\n};\n\nexport default Form;\n"
  },
  {
    "path": "src/parsley/main.js",
    "content": "import $ from 'jquery';\nimport Utils from './utils';\nimport Defaults from './defaults';\nimport Base from './base';\nimport ValidatorRegistry from './validator_registry';\nimport UI from './ui';\nimport Form from './form';\nimport Field from './field';\nimport Multiple from './multiple';\nimport Factory from './factory';\n\nvar vernums = $.fn.jquery.split('.');\nif (parseInt(vernums[0]) <= 1 && parseInt(vernums[1]) < 8) {\n  throw \"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.\";\n}\nif (!vernums.forEach) {\n  Utils.warn('Parsley requires ES5 to run properly. Please include https://github.com/es-shims/es5-shim');\n}\n// Inherit `on`, `off` & `trigger` to Parsley:\nvar Parsley = Object.assign(new Base(), {\n    element: document,\n    $element: $(document),\n    actualizeOptions: null,\n    _resetOptions: null,\n    Factory: Factory,\n    version: 'VERSION'\n  });\n\n// Supplement Field and Form with Base\n// This way, the constructors will have access to those methods\nObject.assign(Field.prototype, UI.Field, Base.prototype);\nObject.assign(Form.prototype, UI.Form, Base.prototype);\n// Inherit actualizeOptions and _resetOptions:\nObject.assign(Factory.prototype, Base.prototype);\n\n// ### jQuery API\n// `$('.elem').parsley(options)` or `$('.elem').psly(options)`\n$.fn.parsley = $.fn.psly = function (options) {\n  if (this.length > 1) {\n    var instances = [];\n\n    this.each(function () {\n      instances.push($(this).parsley(options));\n    });\n\n    return instances;\n  }\n\n  // Return undefined if applied to non existing DOM element\n  if (this.length == 0) {\n    return;\n  }\n\n  return new Factory(this[0], options);\n};\n\n// ### Field and Form extension\n// Ensure the extension is now defined if it wasn't previously\nif ('undefined' === typeof window.ParsleyExtend)\n  window.ParsleyExtend = {};\n\n// ### Parsley config\n// Inherit from ParsleyDefault, and copy over any existing values\nParsley.options = Object.assign(Utils.objectCreate(Defaults), window.ParsleyConfig);\nwindow.ParsleyConfig = Parsley.options; // Old way of accessing global options\n\n// ### Globals\nwindow.Parsley = window.psly = Parsley;\nParsley.Utils = Utils;\nwindow.ParsleyUtils = {};\nvar utilsKeys = Object.keys(Utils);\nutilsKeys.forEach((key) => {\n  var value = Utils[key];\n  if ('function' === typeof value) {\n    window.ParsleyUtils[key] = (...args) => {\n      Utils.warnOnce('Accessing `window.ParsleyUtils` is deprecated. Use `window.Parsley.Utils` instead.');\n      return Utils[key](...args);\n    };\n  }\n});\n\n// ### Define methods that forward to the registry, and deprecate all access except through window.Parsley\nvar registry = window.Parsley._validatorRegistry = new ValidatorRegistry(window.ParsleyConfig.validators, window.ParsleyConfig.i18n);\nwindow.ParsleyValidator = {};\n'setLocale addCatalog addMessage addMessages getErrorMessage formatMessage addValidator updateValidator removeValidator hasValidator'.split(' ').forEach((method) => {\n  window.Parsley[method] = (...args) => registry[method](...args);\n  window.ParsleyValidator[method] = function () {\n    Utils.warnOnce(`Accessing the method '${method}' through Validator is deprecated. Simply call 'window.Parsley.${method}(...)'`);\n    return window.Parsley[method](...arguments);\n  };\n});\n\n// ### UI\n// Deprecated global object\nwindow.Parsley.UI = UI;\nwindow.ParsleyUI = {\n  removeError: function (instance, name, doNotUpdateClass) {\n    var updateClass = true !== doNotUpdateClass;\n    Utils.warnOnce(`Accessing UI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n    return instance.removeError(name, {updateClass});\n  },\n  getErrorsMessages: function (instance) {\n    Utils.warnOnce(`Accessing UI is deprecated. Call 'getErrorsMessages' on the instance directly.`);\n    return instance.getErrorsMessages();\n  }\n};\n'addError updateError'.split(' ').forEach(function (method) {\n  window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n    var updateClass = true !== doNotUpdateClass;\n    Utils.warnOnce(`Accessing UI is deprecated. Call '${method}' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n    return instance[method](name, {message, assert, updateClass});\n  };\n});\n\n// ### PARSLEY auto-binding\n// Prevent it by setting `ParsleyConfig.autoBind` to `false`\nif (false !== window.ParsleyConfig.autoBind) {\n  $(function () {\n    const parsleyValidateNodes = document.querySelectorAll('[data-parsley-validate]');\n    // Works only on `data-parsley-validate`.\n    if (parsleyValidateNodes.length)\n      $(parsleyValidateNodes).parsley();\n  });\n}\n\nexport default Parsley;\n"
  },
  {
    "path": "src/parsley/multiple.js",
    "content": "import $ from 'jquery';\nimport Utils from './utils';\n\nvar Multiple = function () {\n  this.__class__ = 'FieldMultiple';\n};\n\nMultiple.prototype = {\n  // Add new `$element` sibling for multiple field\n  addElement: function ($element) {\n    this.$elements.push($element);\n\n    return this;\n  },\n\n  // See `Field._refreshConstraints()`\n  _refreshConstraints: function () {\n    var fieldConstraints;\n\n    this.constraints = [];\n\n    // Select multiple special treatment\n    if (this.element.nodeName === 'SELECT') {\n      this.actualizeOptions()._bindConstraints();\n\n      return this;\n    }\n\n    // Gather all constraints for each input in the multiple group\n    for (var i = 0; i < this.$elements.length; i++) {\n\n      // Check if element have not been dynamically removed since last binding\n      if (!document.body.contains(this.$elements[i][0])) {\n        this.$elements.splice(i, 1);\n        continue;\n      }\n\n      fieldConstraints = Utils.getData(this.$elements[i][0],'FieldMultiple')._refreshConstraints().constraints;\n\n      for (var j = 0; j < fieldConstraints.length; j++)\n        this.addConstraint(fieldConstraints[j].name, fieldConstraints[j].requirements, fieldConstraints[j].priority, fieldConstraints[j].isDomConstraint);\n    }\n\n    return this;\n  },\n\n  // See `Field.getValue()`\n  getValue: function () {\n    // Value could be overriden in DOM\n    if ('function' === typeof this.options.value)\n      return this.options.value(this);\n    else if ('undefined' !== typeof this.options.value)\n      return this.options.value;\n\n    // Radio input case\n    if (this.element.nodeName === 'INPUT') {\n      var type = Utils.getType(this.element);\n      if (type === 'radio')\n        return this._findRelated().filter(':checked').val() || '';\n\n      // checkbox input case\n      if (type === 'checkbox') {\n        var values = [];\n\n        this._findRelated().filter(':checked').each(function () {\n          values.push($(this).val());\n        });\n\n        return values;\n      }\n    }\n\n    // Select multiple case\n    if (this.element.nodeName === 'SELECT' && null === this.$element.val())\n      return [];\n\n    // Default case that should never happen\n    return this.$element.val();\n  },\n\n  _init: function () {\n    this.$elements = [this.$element];\n\n    return this;\n  }\n};\n\nexport default Multiple;\n"
  },
  {
    "path": "src/parsley/pubsub.js",
    "content": "import $ from 'jquery';\nimport Field from './field';\nimport Form from './form';\nimport Utils from './utils';\n\nvar o = $({});\nvar deprecated = function () {\n  Utils.warnOnce(\"Parsley's pubsub module is deprecated; use the 'on' and 'off' methods on parsley instances or window.Parsley\");\n};\n\n// Returns an event handler that calls `fn` with the arguments it expects\nfunction adapt(fn, context) {\n  // Store to allow unbinding\n  if (!fn.parsleyAdaptedCallback) {\n    fn.parsleyAdaptedCallback = function () {\n      var args = Array.prototype.slice.call(arguments, 0);\n      args.unshift(this);\n      fn.apply(context || o, args);\n    };\n  }\n  return fn.parsleyAdaptedCallback;\n}\n\nvar eventPrefix = 'parsley:';\n// Converts 'parsley:form:validate' into 'form:validate'\nfunction eventName(name) {\n  if (name.lastIndexOf(eventPrefix, 0) === 0)\n    return name.substr(eventPrefix.length);\n  return name;\n}\n\n// $.listen is deprecated. Use Parsley.on instead.\n$.listen = function (name, callback) {\n  var context;\n  deprecated();\n  if ('object' === typeof arguments[1] && 'function' === typeof arguments[2]) {\n    context = arguments[1];\n    callback = arguments[2];\n  }\n\n  if ('function' !== typeof callback)\n    throw new Error('Wrong parameters');\n\n  window.Parsley.on(eventName(name), adapt(callback, context));\n};\n\n$.listenTo = function (instance, name, fn) {\n  deprecated();\n  if (!(instance instanceof Field) && !(instance instanceof Form))\n    throw new Error('Must give Parsley instance');\n\n  if ('string' !== typeof name || 'function' !== typeof fn)\n    throw new Error('Wrong parameters');\n\n  instance.on(eventName(name), adapt(fn));\n};\n\n$.unsubscribe = function (name, fn) {\n  deprecated();\n  if ('string' !== typeof name || 'function' !== typeof fn)\n    throw new Error('Wrong arguments');\n  window.Parsley.off(eventName(name), fn.parsleyAdaptedCallback);\n};\n\n$.unsubscribeTo = function (instance, name) {\n  deprecated();\n  if (!(instance instanceof Field) && !(instance instanceof Form))\n    throw new Error('Must give Parsley instance');\n  instance.off(eventName(name));\n};\n\n$.unsubscribeAll = function (name) {\n  deprecated();\n  window.Parsley.off(eventName(name));\n  $('form,input,textarea,select').each(function () {\n    var instance = Utils.getData(this, 'Parsley');\n    if (instance) {\n      instance.off(eventName(name));\n    }\n  });\n};\n\n// $.emit is deprecated. Use jQuery events instead.\n$.emit = function (name, instance) {\n  deprecated();\n  var instanceGiven = (instance instanceof Field) || (instance instanceof Form);\n  var args = Array.prototype.slice.call(arguments, instanceGiven ? 2 : 1);\n  args.unshift(eventName(name));\n  if (!instanceGiven) {\n    instance = window.Parsley;\n  }\n  instance.trigger(...args);\n};\n\nexport default {};\n"
  },
  {
    "path": "src/parsley/remote.js",
    "content": "import $ from 'jquery';\nimport Utils from './utils';\nimport Base from './base';\n\nimport Parsley from './main';\n\n$.extend(true, Parsley, {\n  asyncValidators: {\n    'default': {\n      fn: function (xhr) {\n        // By default, only status 2xx are deemed successful.\n        // Note: we use status instead of state() because responses with status 200\n        // but invalid messages (e.g. an empty body for content type set to JSON) will\n        // result in state() === 'rejected'.\n        return xhr.status >= 200 && xhr.status < 300;\n      },\n      url: false\n    },\n    reverse: {\n      fn: function (xhr) {\n        // If reverse option is set, a failing ajax request is considered successful\n        return xhr.status < 200 || xhr.status >= 300;\n      },\n      url: false\n    }\n  },\n\n  addAsyncValidator: function (name, fn, url, options) {\n    Parsley.asyncValidators[name] = {\n      fn: fn,\n      url: url || false,\n      options: options || {}\n    };\n\n    return this;\n  }\n\n});\n\nParsley.addValidator('remote', {\n  requirementType: {\n    '': 'string',\n    'validator': 'string',\n    'reverse': 'boolean',\n    'options': 'object'\n  },\n\n  validateString: function (value, url, options, instance) {\n    var data = {};\n    var ajaxOptions;\n    var csr;\n    var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n\n    if ('undefined' === typeof Parsley.asyncValidators[validator])\n      throw new Error('Calling an undefined async validator: `' + validator + '`');\n\n    url = Parsley.asyncValidators[validator].url || url;\n\n    // Fill current value\n    if (url.indexOf('{value}') > -1) {\n      url = url.replace('{value}', encodeURIComponent(value));\n    } else {\n      data[instance.element.getAttribute('name') || instance.element.getAttribute('id')] = value;\n    }\n\n    // Merge options passed in from the function with the ones in the attribute\n    var remoteOptions = $.extend(true, options.options || {} , Parsley.asyncValidators[validator].options);\n\n    // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n    ajaxOptions = $.extend(true, {}, {\n      url: url,\n      data: data,\n      type: 'GET'\n    }, remoteOptions);\n\n    // Generate store key based on ajax options\n    instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n\n    csr = $.param(ajaxOptions);\n\n    // Initialise query cache\n    if ('undefined' === typeof Parsley._remoteCache)\n      Parsley._remoteCache = {};\n\n    // Try to retrieve stored xhr\n    var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n    var handleXhr = function () {\n      var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n      if (!result) // Map falsy results to rejected promise\n        result = $.Deferred().reject();\n      return $.when(result);\n    };\n\n    return xhr.then(handleXhr, handleXhr);\n  },\n\n  priority: -1\n});\n\nParsley.on('form:submit', function () {\n  Parsley._remoteCache = {};\n});\n\nBase.prototype.addAsyncValidator = function () {\n  Utils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n  return Parsley.addAsyncValidator(...arguments);\n};\n"
  },
  {
    "path": "src/parsley/ui.js",
    "content": "import $ from 'jquery';\nimport Utils from './utils';\n\nvar UI = {};\n\nvar diffResults = function (newResult, oldResult, deep) {\n  var added = [];\n  var kept = [];\n\n  for (var i = 0; i < newResult.length; i++) {\n    var found = false;\n\n    for (var j = 0; j < oldResult.length; j++)\n      if (newResult[i].assert.name === oldResult[j].assert.name) {\n        found = true;\n        break;\n      }\n\n    if (found)\n      kept.push(newResult[i]);\n    else\n      added.push(newResult[i]);\n  }\n\n  return {\n    kept: kept,\n    added: added,\n    removed: !deep ? diffResults(oldResult, newResult, true).added : []\n  };\n};\n\nUI.Form = {\n\n  _actualizeTriggers: function () {\n    this.$element.on('submit.Parsley', evt => { this.onSubmitValidate(evt); });\n    this.$element.on('click.Parsley', Utils._SubmitSelector, evt => { this.onSubmitButton(evt); });\n\n    // UI could be disabled\n    if (false === this.options.uiEnabled)\n      return;\n\n    this.element.setAttribute('novalidate', '');\n  },\n\n  focus: function () {\n    this._focusedField = null;\n\n    if (true === this.validationResult || 'none' === this.options.focus)\n      return null;\n\n    for (var i = 0; i < this.fields.length; i++) {\n      var field = this.fields[i];\n      if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n        this._focusedField = field.$element;\n        if ('first' === this.options.focus)\n          break;\n      }\n    }\n\n    if (null === this._focusedField)\n      return null;\n\n    return this._focusedField.focus();\n  },\n\n  _destroyUI: function () {\n    // Reset all event listeners\n    this.$element.off('.Parsley');\n  }\n\n};\n\nUI.Field = {\n\n  _reflowUI: function () {\n    this._buildUI();\n\n    // If this field doesn't have an active UI don't bother doing something\n    if (!this._ui)\n      return;\n\n    // Diff between two validation results\n    var diff = diffResults(this.validationResult, this._ui.lastValidationResult);\n\n    // Then store current validation result for next reflow\n    this._ui.lastValidationResult = this.validationResult;\n\n    // Handle valid / invalid / none field class\n    this._manageStatusClass();\n\n    // Add, remove, updated errors messages\n    this._manageErrorsMessages(diff);\n\n    // Triggers impl\n    this._actualizeTriggers();\n\n    // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n    if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n      this._failedOnce = true;\n      this._actualizeTriggers();\n    }\n  },\n\n  // Returns an array of field's error message(s)\n  getErrorsMessages: function () {\n    // No error message, field is valid\n    if (true === this.validationResult)\n      return [];\n\n    var messages = [];\n\n    for (var i = 0; i < this.validationResult.length; i++)\n      messages.push(this.validationResult[i].errorMessage ||\n       this._getErrorMessage(this.validationResult[i].assert));\n\n    return messages;\n  },\n\n  // It's a goal of Parsley that this method is no longer required [#1073]\n  addError: function (name, {message, assert, updateClass = true} = {}) {\n    this._buildUI();\n    this._addError(name, {message, assert});\n\n    if (updateClass)\n      this._errorClass();\n  },\n\n  // It's a goal of Parsley that this method is no longer required [#1073]\n  updateError: function (name, {message, assert, updateClass = true} = {}) {\n    this._buildUI();\n    this._updateError(name, {message, assert});\n\n    if (updateClass)\n      this._errorClass();\n  },\n\n  // It's a goal of Parsley that this method is no longer required [#1073]\n  removeError: function (name, {updateClass = true} = {}) {\n    this._buildUI();\n    this._removeError(name);\n\n    // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n    // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n    if (updateClass)\n      this._manageStatusClass();\n  },\n\n  _manageStatusClass: function () {\n    if (this.hasConstraints() && this.needsValidation() && true === this.validationResult)\n      this._successClass();\n    else if (this.validationResult.length > 0)\n      this._errorClass();\n    else\n      this._resetClass();\n  },\n\n  _manageErrorsMessages: function (diff) {\n    if ('undefined' !== typeof this.options.errorsMessagesDisabled)\n      return;\n\n    // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n    if ('undefined' !== typeof this.options.errorMessage) {\n      if ((diff.added.length || diff.kept.length)) {\n        this._insertErrorWrapper();\n\n        if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length)\n          this._ui.$errorsWrapper\n            .append(\n              $(this.options.errorTemplate)\n              .addClass('parsley-custom-error-message')\n            );\n\n        this._ui.$errorClassHandler.attr('aria-describedby', this._ui.errorsWrapperId);\n\n        return this._ui.$errorsWrapper\n          .addClass('filled')\n          .attr('aria-hidden', 'false')\n          .find('.parsley-custom-error-message')\n          .html(this.options.errorMessage);\n      }\n\n      this._ui.$errorClassHandler.removeAttr('aria-describedby');\n\n      return this._ui.$errorsWrapper\n        .removeClass('filled')\n        .attr('aria-hidden', 'true')\n        .find('.parsley-custom-error-message')\n        .remove();\n    }\n\n    // Show, hide, update failing constraints messages\n    for (var i = 0; i < diff.removed.length; i++)\n      this._removeError(diff.removed[i].assert.name);\n\n    for (i = 0; i < diff.added.length; i++)\n      this._addError(diff.added[i].assert.name, {message: diff.added[i].errorMessage, assert: diff.added[i].assert});\n\n    for (i = 0; i < diff.kept.length; i++)\n      this._updateError(diff.kept[i].assert.name, {message: diff.kept[i].errorMessage, assert: diff.kept[i].assert});\n  },\n\n\n  _addError: function (name, {message, assert}) {\n    this._insertErrorWrapper();\n    this._ui.$errorClassHandler\n      .attr('aria-describedby', this._ui.errorsWrapperId);\n    this._ui.$errorsWrapper\n      .addClass('filled')\n      .attr('aria-hidden', 'false')\n      .append(\n        $(this.options.errorTemplate)\n        .addClass('parsley-' + name)\n        .html(message || this._getErrorMessage(assert))\n      );\n  },\n\n  _updateError: function (name, {message, assert}) {\n    this._ui.$errorsWrapper\n      .addClass('filled')\n      .find('.parsley-' + name)\n      .html(message || this._getErrorMessage(assert));\n  },\n\n  _removeError: function (name) {\n    this._ui.$errorClassHandler\n      .removeAttr('aria-describedby');\n    this._ui.$errorsWrapper\n      .removeClass('filled')\n      .attr('aria-hidden', 'true')\n      .find('.parsley-' + name)\n      .remove();\n  },\n\n  _getErrorMessage: function (constraint) {\n    var customConstraintErrorMessage = constraint.name + 'Message';\n\n    if ('undefined' !== typeof this.options[customConstraintErrorMessage])\n      return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n\n    return window.Parsley.getErrorMessage(constraint);\n  },\n\n  _buildUI: function () {\n    // UI could be already built or disabled\n    if (this._ui || false === this.options.uiEnabled)\n      return;\n\n    var _ui = {};\n\n    // Give field its Parsley id in DOM\n    this.element.setAttribute(this.options.namespace + 'id', this.__id__);\n\n    /** Generate important UI elements and store them in this **/\n    // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n    _ui.$errorClassHandler = this._manageClassHandler();\n\n    // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n    _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n    _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId);\n\n    // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n    _ui.lastValidationResult = [];\n    _ui.validationInformationVisible = false;\n\n    // Store it in this for later\n    this._ui = _ui;\n  },\n\n  // Determine which element will have `parsley-error` and `parsley-success` classes\n  _manageClassHandler: function () {\n    // Class handled could also be determined by function given in Parsley options\n    if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length)\n      return $(this.options.classHandler);\n\n    // Class handled could also be determined by function given in Parsley options\n    var $handlerFunction = this.options.classHandler;\n\n    // It might also be the function name of a global function\n    if ('string' === typeof this.options.classHandler && 'function' === typeof window[this.options.classHandler])\n      $handlerFunction = window[this.options.classHandler];\n\n    if ('function' === typeof $handlerFunction) {\n      var $handler = $handlerFunction.call(this, this);\n\n      // If this function returned a valid existing DOM element, go for it\n      if ('undefined' !== typeof $handler && $handler.length)\n        return $handler;\n    } else if ('object' === typeof $handlerFunction && $handlerFunction instanceof jQuery && $handlerFunction.length) {\n      return $handlerFunction;\n    } else if ($handlerFunction) {\n      Utils.warn('The class handler `' + $handlerFunction + '` does not exist in DOM nor as a global JS function');\n    }\n\n    return this._inputHolder();\n  },\n\n  _inputHolder: function() {\n    // if simple element (input, texatrea, select...) it will perfectly host the classes and precede the error container\n    if (!this.options.multiple || this.element.nodeName === 'SELECT')\n      return this.$element;\n\n    // But if multiple element (radio, checkbox), that would be their parent\n    return this.$element.parent();\n  },\n\n  _insertErrorWrapper: function () {\n    var $errorsContainer = this.options.errorsContainer;\n\n    // Nothing to do if already inserted\n    if (0 !== this._ui.$errorsWrapper.parent().length)\n      return this._ui.$errorsWrapper.parent();\n\n    if ('string' === typeof $errorsContainer) {\n      if ($($errorsContainer).length)\n        return $($errorsContainer).append(this._ui.$errorsWrapper);\n      else if ('function' === typeof window[$errorsContainer])\n        $errorsContainer = window[$errorsContainer];\n      else\n        Utils.warn('The errors container `' + $errorsContainer + '` does not exist in DOM nor as a global JS function');\n    }\n\n    if ('function' === typeof $errorsContainer)\n      $errorsContainer = $errorsContainer.call(this, this);\n\n    if ('object' === typeof $errorsContainer && $errorsContainer.length)\n      return $errorsContainer.append(this._ui.$errorsWrapper);\n\n    return this._inputHolder().after(this._ui.$errorsWrapper);\n  },\n\n  _actualizeTriggers: function () {\n    var $toBind = this._findRelated();\n    var trigger;\n\n    // Remove Parsley events already bound on this field\n    $toBind.off('.Parsley');\n    if (this._failedOnce)\n      $toBind.on(Utils.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), () => {\n        this._validateIfNeeded();\n      });\n    else if (trigger = Utils.namespaceEvents(this.options.trigger, 'Parsley')) {\n      $toBind.on(trigger, event => {\n        this._validateIfNeeded(event);\n      });\n    }\n  },\n\n  _validateIfNeeded: function (event) {\n    // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n    // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n    // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n    if (event && /key|input/.test(event.type))\n      if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold)\n        return;\n\n    if (this.options.debounce) {\n      window.clearTimeout(this._debounced);\n      this._debounced = window.setTimeout(() => this.validate(), this.options.debounce);\n    } else\n      this.validate();\n  },\n\n  _resetUI: function () {\n    // Reset all event listeners\n    this._failedOnce = false;\n    this._actualizeTriggers();\n\n    // Nothing to do if UI never initialized for this field\n    if ('undefined' === typeof this._ui)\n      return;\n\n    // Reset all errors' li\n    this._ui.$errorsWrapper\n      .removeClass('filled')\n      .children()\n      .remove();\n\n    // Reset validation class\n    this._resetClass();\n\n    // Reset validation flags and last validation result\n    this._ui.lastValidationResult = [];\n    this._ui.validationInformationVisible = false;\n  },\n\n  _destroyUI: function () {\n    this._resetUI();\n\n    if ('undefined' !== typeof this._ui)\n      this._ui.$errorsWrapper.remove();\n\n    delete this._ui;\n  },\n\n  _successClass: function () {\n    this._ui.validationInformationVisible = true;\n    this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n  },\n  _errorClass: function () {\n    this._ui.validationInformationVisible = true;\n    this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n  },\n  _resetClass: function () {\n    this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n  }\n};\n\nexport default UI;\n"
  },
  {
    "path": "src/parsley/utils.js",
    "content": "import $ from 'jquery';\n\nvar globalID = 1;\nvar pastWarnings = {};\n\nvar Utils = {\n  // Parsley DOM-API\n  // returns object from dom attributes and values\n  attr: function (element, namespace, obj) {\n    var i;\n    var attribute;\n    var attributes;\n    var regex = new RegExp('^' + namespace, 'i');\n\n    if ('undefined' === typeof obj)\n      obj = {};\n    else {\n      // Clear all own properties. This won't affect prototype's values\n      for (i in obj) {\n        if (obj.hasOwnProperty(i))\n          delete obj[i];\n      }\n    }\n\n    if (!element)\n      return obj;\n\n    attributes = element.attributes;\n    for (i = attributes.length; i--; ) {\n      attribute = attributes[i];\n\n      if (attribute && attribute.specified && regex.test(attribute.name)) {\n        obj[this.camelize(attribute.name.slice(namespace.length))] = this.deserializeValue(attribute.value);\n      }\n    }\n\n    return obj;\n  },\n\n  checkAttr: function (element, namespace, checkAttr) {\n    return element.hasAttribute(namespace + checkAttr);\n  },\n\n  setAttr: function (element, namespace, attr, value) {\n    element.setAttribute(this.dasherize(namespace + attr), String(value));\n  },\n\n  getType: function(element) {\n    return element.getAttribute('type') || 'text';\n  },\n\n  generateID: function () {\n    return '' + globalID++;\n  },\n\n  /** Third party functions **/\n  deserializeValue: function (value) {\n    var num;\n\n    try {\n      return value ?\n        value == \"true\" ||\n        (value == \"false\" ? false :\n        value == \"null\" ? null :\n        !isNaN(num = Number(value)) ? num :\n        /^[\\[\\{]/.test(value) ? JSON.parse(value) :\n        value)\n        : value;\n    } catch (e) { return value; }\n  },\n\n  // Zepto camelize function\n  camelize: function (str) {\n    return str.replace(/-+(.)?/g, function (match, chr) {\n      return chr ? chr.toUpperCase() : '';\n    });\n  },\n\n  // Zepto dasherize function\n  // Warning: inefficient regex complexity\n  dasherize: function (str) {\n    return str.replace(/::/g, '/')\n      .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n      .replace(/([a-z\\d])([A-Z])/g, '$1_$2')\n      .replace(/_/g, '-')\n      .toLowerCase();\n  },\n\n  warn: function () {\n    if (window.console && 'function' === typeof window.console.warn)\n      window.console.warn(...arguments);\n  },\n\n  warnOnce: function(msg) {\n    if (!pastWarnings[msg]) {\n      pastWarnings[msg] = true;\n      this.warn(...arguments);\n    }\n  },\n\n  _resetWarnings: function () {\n    pastWarnings = {};\n  },\n\n  trimString: function(string) {\n    return string.replace(/^\\s+|\\s+$/g, '');\n  },\n\n  parse: {\n    date: function(string) {\n      let parsed = string.match(/^(\\d{4,})-(\\d\\d)-(\\d\\d)$/);\n      if (!parsed)\n        return null;\n      let [_, year, month, day] = parsed.map(x => parseInt(x, 10));\n      let date = new Date(year, month - 1, day);\n      if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day)\n        return null;\n      return date;\n    },\n    string: function(string) {\n      return string;\n    },\n    integer: function(string) {\n      if (isNaN(string))\n        return null;\n      return parseInt(string, 10);\n    },\n    number: function(string) {\n      if (isNaN(string))\n        throw null;\n      return parseFloat(string);\n    },\n    'boolean': function _boolean(string) {\n      return !(/^\\s*false\\s*$/i.test(string));\n    },\n    object: function(string) {\n      return Utils.deserializeValue(string);\n    },\n    regexp: function(regexp) {\n      var flags = '';\n\n      // Test if RegExp is literal, if not, nothing to be done, otherwise, we need to isolate flags and pattern\n      if (/^\\/.*\\/(?:[gimy]*)$/.test(regexp)) {\n        // Replace the regexp literal string with the first match group: ([gimy]*)\n        // If no flag is present, this will be a blank string\n        flags = regexp.replace(/.*\\/([gimy]*)$/, '$1');\n        // Again, replace the regexp literal string with the first match group:\n        // everything excluding the opening and closing slashes and the flags\n        regexp = regexp.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1');\n      } else {\n        // Anchor regexp:\n        regexp = '^' + regexp + '$';\n      }\n      return new RegExp(regexp, flags);\n    }\n  },\n\n  parseRequirement: function(requirementType, string) {\n    var converter = this.parse[requirementType || 'string'];\n    if (!converter)\n      throw 'Unknown requirement specification: \"' + requirementType + '\"';\n    let converted = converter(string);\n    if (converted === null)\n      throw `Requirement is not a ${requirementType}: \"${string}\"`;\n    return converted;\n  },\n\n  namespaceEvents: function(events, namespace) {\n    events = this.trimString(events || '').split(/\\s+/);\n    if (!events[0])\n      return '';\n    return $.map(events, evt => `${evt}.${namespace}`).join(' ');\n  },\n\n  difference: function(array, remove) {\n    // This is O(N^2), should be optimized\n    let result = [];\n    array.forEach((elem) => {\n      if (remove.indexOf(elem) == -1)\n        result.push(elem);\n    });\n    return result;\n  },\n\n  // Alter-ego to native Promise.all, but for jQuery\n  all: function(promises) {\n    // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements\n    return $.when(...promises, 42, 42);\n  },\n\n  // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n  objectCreate: Object.create || (function () {\n    var Object = function () {};\n    return function (prototype) {\n      if (arguments.length > 1) {\n        throw Error('Second argument not supported');\n      }\n      if (typeof prototype != 'object') {\n        throw TypeError('Argument must be an object');\n      }\n      Object.prototype = prototype;\n      var result = new Object();\n      Object.prototype = null;\n      return result;\n    };\n  })(),\n\n  _SubmitSelector: 'input[type=\"submit\"], button:submit',\n\n  isPlainObject: function(obj) {\n    return Object.prototype.toString.call(obj) === '[object Object]';\n  },\n\n  setData: function(DomElement, name, data) {\n    DomElement.parsleyData = DomElement.parsleyData || {};\n    DomElement.parsleyData[name] = data;\n  },\n\n  getData: function(DomElement, name) {\n    DomElement.parsleyData = DomElement.parsleyData || {};\n    return DomElement.parsleyData[name];\n  },\n\n  removeData: function(DomElement, name) {\n    delete DomElement.parsleyData[name];\n  }\n};\n\nexport default Utils;\n"
  },
  {
    "path": "src/parsley/validator.js",
    "content": "import $ from 'jquery';\nimport Utils from './utils';\n\nvar convertArrayRequirement = function(string, length) {\n  var m = string.match(/^\\s*\\[(.*)\\]\\s*$/);\n  if (!m)\n    throw 'Requirement is not an array: \"' + string + '\"';\n  var values = m[1].split(',').map(Utils.trimString);\n  if (values.length !== length)\n    throw 'Requirement has ' + values.length + ' values when ' + length + ' are needed';\n  return values;\n};\n\nvar convertExtraOptionRequirement = function(requirementSpec, string, extraOptionReader) {\n  var main = null;\n  var extra = {};\n  for (var key in requirementSpec) {\n    if (key) {\n      var value = extraOptionReader(key);\n      if ('string' === typeof value)\n        value = Utils.parseRequirement(requirementSpec[key], value);\n      extra[key] = value;\n    } else {\n      main = Utils.parseRequirement(requirementSpec[key], string);\n    }\n  }\n  return [main, extra];\n};\n\n// A Validator needs to implement the methods `validate` and `parseRequirements`\n\nvar Validator = function(spec) {\n  $.extend(true, this, spec);\n};\n\nValidator.prototype = {\n  // Returns `true` iff the given `value` is valid according the given requirements.\n  validate: function(value, requirementFirstArg) {\n    if (this.fn) { // Legacy style validator\n\n      if (arguments.length > 3)  // If more args then value, requirement, instance...\n        requirementFirstArg = [].slice.call(arguments, 1, -1);  // Skip first arg (value) and last (instance), combining the rest\n      return this.fn(value, requirementFirstArg);\n    }\n\n    if (Array.isArray(value)) {\n      if (!this.validateMultiple)\n        throw 'Validator `' + this.name + '` does not handle multiple values';\n      return this.validateMultiple(...arguments);\n    } else {\n      let instance = arguments[arguments.length - 1];\n      if (this.validateDate && instance._isDateInput()) {\n        arguments[0] = Utils.parse.date(arguments[0]);\n        if (arguments[0] === null)\n          return false;\n        return this.validateDate(...arguments);\n      }\n      if (this.validateNumber) {\n        if (!value) // Builtin validators all accept empty strings, except `required` of course\n          return true;\n        if (isNaN(value))\n          return false;\n        arguments[0] = parseFloat(arguments[0]);\n        return this.validateNumber(...arguments);\n      }\n      if (this.validateString) {\n        return this.validateString(...arguments);\n      }\n      throw 'Validator `' + this.name + '` only handles multiple values';\n    }\n  },\n\n  // Parses `requirements` into an array of arguments,\n  // according to `this.requirementType`\n  parseRequirements: function(requirements, extraOptionReader) {\n    if ('string' !== typeof requirements) {\n      // Assume requirement already parsed\n      // but make sure we return an array\n      return Array.isArray(requirements) ? requirements : [requirements];\n    }\n    var type = this.requirementType;\n    if (Array.isArray(type)) {\n      var values = convertArrayRequirement(requirements, type.length);\n      for (var i = 0; i < values.length; i++)\n        values[i] = Utils.parseRequirement(type[i], values[i]);\n      return values;\n    } else if (Utils.isPlainObject(type)) {\n      return convertExtraOptionRequirement(type, requirements, extraOptionReader);\n    } else {\n      return [Utils.parseRequirement(type, requirements)];\n    }\n  },\n  // Defaults:\n  requirementType: 'string',\n\n  priority: 2\n\n};\n\nexport default Validator;\n"
  },
  {
    "path": "src/parsley/validator_registry.js",
    "content": "import $ from 'jquery';\nimport Utils from './utils';\nimport Defaults from './defaults';\nimport Validator from './validator';\n\nvar ValidatorRegistry = function (validators, catalog) {\n  this.__class__ = 'ValidatorRegistry';\n\n  // Default Parsley locale is en\n  this.locale = 'en';\n\n  this.init(validators || {}, catalog || {});\n};\n\nvar typeTesters =  {\n  email: /^((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-zA-Z]|\\d|-|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-zA-Z]|\\d|-|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))$/,\n\n  // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n  number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n\n  integer: /^-?\\d+$/,\n\n  digits: /^\\d+$/,\n\n  alphanum: /^\\w+$/i,\n\n  date: {\n    test: value => Utils.parse.date(value) !== null\n  },\n\n  url: new RegExp(\n      \"^\" +\n        // protocol identifier\n        \"(?:(?:https?|ftp)://)?\" + // ** mod: make scheme optional\n        // user:pass authentication\n        \"(?:\\\\S+(?::\\\\S*)?@)?\" +\n        \"(?:\" +\n          // IP address exclusion\n          // private & local networks\n          // \"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" +   // ** mod: allow local networks\n          // \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" +  // ** mod: allow local networks\n          // \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\" +  // ** mod: allow local networks\n          // IP address dotted notation octets\n          // excludes loopback network 0.0.0.0\n          // excludes reserved space >= 224.0.0.0\n          // excludes network & broacast addresses\n          // (first & last IP address of each class)\n          \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" +\n          \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" +\n          \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" +\n        \"|\" +\n          // host name\n          \"(?:(?:[a-zA-Z\\\\u00a1-\\\\uffff0-9]-*)*[a-zA-Z\\\\u00a1-\\\\uffff0-9]+)\" +\n          // domain name\n          \"(?:\\\\.(?:[a-zA-Z\\\\u00a1-\\\\uffff0-9]-*)*[a-zA-Z\\\\u00a1-\\\\uffff0-9]+)*\" +\n          // TLD identifier\n          \"(?:\\\\.(?:[a-zA-Z\\\\u00a1-\\\\uffff]{2,}))\" +\n        \")\" +\n        // port number\n        \"(?::\\\\d{2,5})?\" +\n        // resource path\n        \"(?:/\\\\S*)?\" +\n      \"$\"\n    )\n};\ntypeTesters.range = typeTesters.number;\n\n// See http://stackoverflow.com/a/10454560/8279\nvar decimalPlaces = num => {\n  var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n  if (!match) { return 0; }\n  return Math.max(\n       0,\n       // Number of digits right of decimal point.\n       (match[1] ? match[1].length : 0) -\n       // Adjust for scientific notation.\n       (match[2] ? +match[2] : 0));\n};\n\n// parseArguments('number', ['1', '2']) => [1, 2]\nlet parseArguments = (type, args) => args.map(Utils.parse[type]);\n// operatorToValidator returns a validating function for an operator function, applied to the given type\nlet operatorToValidator = (type, operator) => {\n  return (value, ...requirementsAndInput) => {\n    requirementsAndInput.pop(); // Get rid of `input` argument\n    return operator(value, ...parseArguments(type, requirementsAndInput));\n  };\n};\n\nlet comparisonOperator = operator => ({\n  validateDate: operatorToValidator('date', operator),\n  validateNumber: operatorToValidator('number', operator),\n  requirementType: operator.length <= 2 ? 'string' : ['string', 'string'], // Support operators with a 1 or 2 requirement(s)\n  priority: 30\n});\n\nValidatorRegistry.prototype = {\n  init: function (validators, catalog) {\n    this.catalog = catalog;\n    // Copy prototype's validators:\n    this.validators = Object.assign({}, this.validators);\n\n    for (var name in validators)\n      this.addValidator(name, validators[name].fn, validators[name].priority);\n\n    window.Parsley.trigger('parsley:validator:init');\n  },\n\n  // Set new messages locale if we have dictionary loaded in ParsleyConfig.i18n\n  setLocale: function (locale) {\n    if ('undefined' === typeof this.catalog[locale])\n      throw new Error(locale + ' is not available in the catalog');\n\n    this.locale = locale;\n\n    return this;\n  },\n\n  // Add a new messages catalog for a given locale. Set locale for this catalog if set === `true`\n  addCatalog: function (locale, messages, set) {\n    if ('object' === typeof messages)\n      this.catalog[locale] = messages;\n\n    if (true === set)\n      return this.setLocale(locale);\n\n    return this;\n  },\n\n  // Add a specific message for a given constraint in a given locale\n  addMessage: function (locale, name, message) {\n    if ('undefined' === typeof this.catalog[locale])\n      this.catalog[locale] = {};\n\n    this.catalog[locale][name] = message;\n\n    return this;\n  },\n\n  // Add messages for a given locale\n  addMessages: function (locale, nameMessageObject) {\n    for (var name in nameMessageObject)\n      this.addMessage(locale, name, nameMessageObject[name]);\n\n    return this;\n  },\n\n  // Add a new validator\n  //\n  //    addValidator('custom', {\n  //        requirementType: ['integer', 'integer'],\n  //        validateString: function(value, from, to) {},\n  //        priority: 22,\n  //        messages: {\n  //          en: \"Hey, that's no good\",\n  //          fr: \"Aye aye, pas bon du tout\",\n  //        }\n  //    })\n  //\n  // Old API was addValidator(name, function, priority)\n  //\n  addValidator: function (name, arg1, arg2) {\n    if (this.validators[name])\n      Utils.warn('Validator \"' + name + '\" is already defined.');\n    else if (Defaults.hasOwnProperty(name)) {\n      Utils.warn('\"' + name + '\" is a restricted keyword and is not a valid validator name.');\n      return;\n    }\n    return this._setValidator(...arguments);\n  },\n\n  hasValidator: function (name) {\n    return !!this.validators[name];\n  },\n\n  updateValidator: function (name, arg1, arg2) {\n    if (!this.validators[name]) {\n      Utils.warn('Validator \"' + name + '\" is not already defined.');\n      return this.addValidator(...arguments);\n    }\n    return this._setValidator(...arguments);\n  },\n\n  removeValidator: function (name) {\n    if (!this.validators[name])\n      Utils.warn('Validator \"' + name + '\" is not defined.');\n\n    delete this.validators[name];\n\n    return this;\n  },\n\n  _setValidator: function (name, validator, priority) {\n    if ('object' !== typeof validator) {\n      // Old style validator, with `fn` and `priority`\n      validator = {\n        fn: validator,\n        priority: priority\n      };\n    }\n    if (!validator.validate) {\n      validator = new Validator(validator);\n    }\n    this.validators[name] = validator;\n\n    for (var locale in validator.messages || {})\n      this.addMessage(locale, name, validator.messages[locale]);\n\n    return this;\n  },\n\n  getErrorMessage: function (constraint) {\n    var message;\n\n    // Type constraints are a bit different, we have to match their requirements too to find right error message\n    if ('type' === constraint.name) {\n      var typeMessages = this.catalog[this.locale][constraint.name] || {};\n      message = typeMessages[constraint.requirements];\n    } else\n      message = this.formatMessage(this.catalog[this.locale][constraint.name], constraint.requirements);\n\n    return message || this.catalog[this.locale].defaultMessage || this.catalog.en.defaultMessage;\n  },\n\n  // Kind of light `sprintf()` implementation\n  formatMessage: function (string, parameters) {\n    if ('object' === typeof parameters) {\n      for (var i in parameters)\n        string = this.formatMessage(string, parameters[i]);\n\n      return string;\n    }\n\n    return 'string' === typeof string ? string.replace(/%s/i, parameters) : '';\n  },\n\n  // Here is the Parsley default validators list.\n  // A validator is an object with the following key values:\n  //  - priority: an integer\n  //  - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n  //  - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n  // Alternatively, a validator can be a function that returns such an object\n  //\n  validators: {\n    notblank: {\n      validateString: function(value) {\n        return /\\S/.test(value);\n      },\n      priority: 2\n    },\n    required: {\n      validateMultiple: function(values) {\n        return values.length > 0;\n      },\n      validateString: function(value) {\n        return /\\S/.test(value);\n      },\n      priority: 512\n    },\n    type: {\n      validateString: function(value, type, {step = 'any', base = 0} = {}) {\n        var tester = typeTesters[type];\n        if (!tester) {\n          throw new Error('validator type `' + type + '` is not supported');\n        }\n        if (!value)\n          return true;  // Builtin validators all accept empty strings, except `required` of course\n        if (!tester.test(value))\n          return false;\n        if ('number' === type) {\n          if (!/^any$/i.test(step || '')) {\n            var nb = Number(value);\n            var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n            if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n              return false;\n            // Be careful of rounding errors by using integers.\n            var toInt = f => Math.round(f * Math.pow(10, decimals));\n            if ((toInt(nb) - toInt(base)) % toInt(step) != 0)\n              return false;\n          }\n        }\n        return true;\n      },\n      requirementType: {\n        '': 'string',\n        step: 'string',\n        base: 'number'\n      },\n      priority: 256\n    },\n    pattern: {\n      validateString: function(value, regexp) {\n        if (!value)\n          return true;  // Builtin validators all accept empty strings, except `required` of course\n        return regexp.test(value);\n      },\n      requirementType: 'regexp',\n      priority: 64\n    },\n    minlength: {\n      validateString: function (value, requirement) {\n        if (!value)\n          return true;  // Builtin validators all accept empty strings, except `required` of course\n        return value.length >= requirement;\n      },\n      requirementType: 'integer',\n      priority: 30\n    },\n    maxlength: {\n      validateString: function (value, requirement) {\n        return value.length <= requirement;\n      },\n      requirementType: 'integer',\n      priority: 30\n    },\n    length: {\n      validateString: function (value, min, max) {\n        if (!value)\n          return true;  // Builtin validators all accept empty strings, except `required` of course\n        return value.length >= min && value.length <= max;\n      },\n      requirementType: ['integer', 'integer'],\n      priority: 30\n    },\n    mincheck: {\n      validateMultiple: function (values, requirement) {\n        return values.length >= requirement;\n      },\n      requirementType: 'integer',\n      priority: 30\n    },\n    maxcheck: {\n      validateMultiple: function (values, requirement) {\n        return values.length <= requirement;\n      },\n      requirementType: 'integer',\n      priority: 30\n    },\n    check: {\n      validateMultiple: function (values, min, max) {\n        return values.length >= min && values.length <= max;\n      },\n      requirementType: ['integer', 'integer'],\n      priority: 30\n    },\n    min: comparisonOperator((value, requirement) => value >= requirement),\n    max: comparisonOperator((value, requirement) => value <= requirement),\n    range: comparisonOperator((value, min, max) => value >= min && value <= max),\n    equalto: {\n      validateString: function (value, refOrValue) {\n        if (!value)\n          return true;  // Builtin validators all accept empty strings, except `required` of course\n        var $reference = $(refOrValue);\n        if ($reference.length)\n          return value === $reference.val();\n        else\n          return value === refOrValue;\n      },\n      priority: 256\n    },\n    euvatin: {\n      validateString: function (value, refOrValue) {\n        if (!value) {\n          return true;  // Builtin validators all accept empty strings, except `required` of course\n        }\n\n        var re = /^[A-Z][A-Z][A-Za-z0-9 -]{2,}$/;\n        return re.test(value);\n      },\n      priority: 30,\n    },\n  }\n};\n\nexport default ValidatorRegistry;\n"
  },
  {
    "path": "src/parsley.css",
    "content": "input.parsley-success,\nselect.parsley-success,\ntextarea.parsley-success {\n  color: #468847;\n  background-color: #DFF0D8;\n  border: 1px solid #D6E9C6;\n}\n\ninput.parsley-error,\nselect.parsley-error,\ntextarea.parsley-error {\n  color: #B94A48;\n  background-color: #F2DEDE;\n  border: 1px solid #EED3D7;\n}\n\n.parsley-errors-list {\n  margin: 2px 0 3px;\n  padding: 0;\n  list-style-type: none;\n  font-size: 0.9em;\n  line-height: 0.9em;\n  opacity: 0;\n  color: #B94A48;\n\n  transition: all .3s ease-in;\n  -o-transition: all .3s ease-in;\n  -moz-transition: all .3s ease-in;\n  -webkit-transition: all .3s ease-in;\n}\n\n.parsley-errors-list.filled {\n  opacity: 1;\n}\n"
  },
  {
    "path": "src/parsley.js",
    "content": "import $ from 'jquery';\nimport Parsley from './parsley/main';\nimport './parsley/pubsub';\nimport './parsley/remote';\nimport './i18n/en';\nimport inputevent from './vendor/inputevent';\n\ninputevent.install();\n\nexport default Parsley;\n"
  },
  {
    "path": "src/vendor/inputevent.js",
    "content": "/**\n * inputevent - Alleviate browser bugs for input events\n * https://github.com/marcandre/inputevent\n * @version v0.0.3 - (built Thu, Apr 14th 2016, 5:58 pm)\n * @author Marc-Andre Lafortune <github@marc-andre.ca>\n * @license MIT\n */\n\nimport $ from 'jquery';\n\nfunction InputEvent() {\n  let globals = window || global;\n\n  // Slightly odd way construct our object. This way methods are force bound.\n  // Used to test for duplicate library.\n  Object.assign(this, {\n\n    // For browsers that do not support isTrusted, assumes event is native.\n    isNativeEvent: evt => {\n      return evt.originalEvent && evt.originalEvent.isTrusted !== false;\n    },\n\n    fakeInputEvent: evt => {\n      if (this.isNativeEvent(evt)) {\n        $(evt.target).trigger('input');\n      }\n    },\n\n    misbehaves: evt => {\n      if (this.isNativeEvent(evt)) {\n        this.behavesOk(evt);\n        $(document)\n          .on('change.inputevent', evt.data.selector, this.fakeInputEvent);\n        this.fakeInputEvent(evt);\n      }\n    },\n\n    behavesOk: evt => {\n      if (this.isNativeEvent(evt)) {\n        $(document) // Simply unbinds the testing handler\n          .off('input.inputevent', evt.data.selector, this.behavesOk)\n          .off('change.inputevent', evt.data.selector, this.misbehaves);\n      }\n    },\n\n    // Bind the testing handlers\n    install: () => {\n      if (globals.inputEventPatched) {\n        return;\n      }\n      globals.inputEventPatched = '0.0.3';\n      for (let selector of ['select', 'input[type=\"checkbox\"]', 'input[type=\"radio\"]', 'input[type=\"file\"]']) {\n        $(document)\n          .on('input.inputevent', selector, {selector}, this.behavesOk)\n          .on('change.inputevent', selector, {selector}, this.misbehaves);\n      }\n    },\n\n    uninstall: () => {\n      delete globals.inputEventPatched;\n      $(document).off('.inputevent');\n    }\n\n  });\n};\n\nexport default new InputEvent();\n"
  },
  {
    "path": "test/.eslintrc",
    "content": "{\n  \"parserOptions\": {\n    \"ecmaVersion\": 6,\n    \"sourceType\": \"module\"\n  },\n  \"rules\": {\n    \"quotes\": 0,\n    \"indent\": 0,\n    \"no-unused-expressions\": 0\n  },\n  \"env\": {\n    \"browser\": true,\n    \"node\": true,\n    \"mocha\": true\n  },\n  \"globals\": {\n    \"spy\": true,\n    \"expect\": true\n  }\n}\n"
  },
  {
    "path": "test/runner.html",
    "content": "<!doctype html>\n<!-- You need to run `gulp test-browser` before opening this in your browser -->\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <title>Tests</title>\n  <link rel=\"stylesheet\" href=\"../node_modules/mocha/mocha.css\">\n\n  <!-- Polyfill (required by Babel) -->\n  <script src=\"../node_modules/@babel/polyfill/dist/polyfill.js\"></script>\n\n  <!-- Testing libraries -->\n  <script src=\"../node_modules/mocha/mocha.js\"></script>\n  <script src=\"../node_modules/expect.js/index.js\"></script>\n  <script src=\"../node_modules/sinon/pkg/sinon.js\"></script>\n\n  <!-- jQuery -->\n  <script src=\"../bower_components/jquery/dist/jquery.js\"></script>\n  <!-- Livereload -->\n  <script src=\"http://localhost:35729/livereload.js\"></script>\n\n  <!-- Load the built library -->\n  <script src=\"../tmp/__spec-build.js\"></script>\n</head>\n<body>\n  <!-- Required for browser reporter -->\n  <div id=\"mocha\"></div>\n</body>\n</html>\n"
  },
  {
    "path": "test/setup/browser.js",
    "content": "import './browser_setup.js'\nimport '../unit/index.js';\n"
  },
  {
    "path": "test/setup/browser_setup.js",
    "content": "import setup from './setup';\nimport mocha from '../../tools/mocha_options';\n\nwindow.global = window;\nglobal.travis = false;\nglobal.mocha.setup('bdd');\nglobal.onload = function() {\n  global.mocha.checkLeaks();\n  global.mocha.globals(mocha.globals);\n  global.mocha.run();\n  setup();\n};\n"
  },
  {
    "path": "test/setup/dom_leak_check.js",
    "content": "import $ from 'jquery';\n\nexport default function() {\n  afterEach(function() {\n    expect($('form input').length).to.be(0);\n  });\n\n  window.$ = $; // Export for testing purposes...\n}\n"
  },
  {
    "path": "test/setup/expect_warning.js",
    "content": "export default function () {\n  beforeEach(function() {\n    sinon.spy(window.console, 'warn');\n    window.console.warn.expectedCallCount = 0;\n  });\n  afterEach(function() {\n    expect(window.console.warn.callCount).to.be(window.console.warn.expectedCallCount);\n    window.console.warn.restore();\n  });\n\n  global.expectWarning = function(fn) {\n    var w = window.console.warn;\n    expect(w.callCount).to.be(w.expectedCallCount);\n    var result = fn.call();\n    w.expectedCallCount++;\n    expect(w.callCount).to.be(w.expectedCallCount);\n    return result;\n  };\n}\n"
  },
  {
    "path": "test/setup/node.js",
    "content": "import './node_setup'; // Import this before jquery is imported!\nimport setup from './setup';\nsetup();\n"
  },
  {
    "path": "test/setup/node_setup.js",
    "content": "global.expect = require('expect.js');\nglobal.sinon = require('sinon');\nglobal.travis = process.env.TRAVIS;\n\nvar jsdom = require('jsdom').jsdom;\nglobal.document = jsdom('<html><head></head><body></body></html>');\nglobal.window = document.defaultView;\nglobal.navigator = window.navigator = {\n  userAgent: 'NodeJS JSDom',\n  appVersion: ''\n};\n"
  },
  {
    "path": "test/setup/setup.js",
    "content": "import setup_ew from './expect_warning';\nimport setup_dlc from './dom_leak_check';\n\n\nexport default function() {\n  beforeEach(function() {\n    this.sandbox = global.sinon.sandbox.create();\n    global.stub = this.sandbox.stub.bind(this.sandbox);\n    global.spy = this.sandbox.spy.bind(this.sandbox);\n  });\n\n  afterEach(function() {\n    delete global.stub;\n    delete global.spy;\n    this.sandbox.restore();\n  });\n\n  setup_ew();\n  setup_dlc();\n}\n"
  },
  {
    "path": "test/unit/base.js",
    "content": "import $ from 'jquery';\nimport Parsley from '../../src/parsley';\nimport Utils from '../../src/parsley/utils';\n\ndescribe('Base', () => {\n  it('should provide a actualizeOptions() method', () => {\n    $('body').append('<input type=\"email\" data-parsley-pattern=\"[A-F][0-9]{5}\" data-parsley-required id=\"element\" />');\n    var parsleyField = $('#element').parsley({foo: 'bar'});\n    expect(parsleyField.options.pattern).to.eql('[A-F][0-9]{5}');\n    expect(parsleyField.options.required).to.eql('');\n\n    $('#element').removeAttr('data-parsley-pattern');\n    parsleyField.actualizeOptions();\n\n    expect(parsleyField.options.pattern).to.be(undefined);\n    expect(parsleyField.options.required).to.eql('');\n  });\n  it('should use reset() on field', () => {\n    $('body').append('<input type=\"email\" data-parsley-pattern=\"[A-F][0-9]{5}\" data-parsley-required id=\"element\" />');\n    var parsleyField = $('#element').parsley();\n    parsleyField.validate();\n    expect($('#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(1);\n    parsleyField.reset();\n    expect($('#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(0);\n  });\n  it('should use reset() on form', done => {\n    $('body').append(\n      '<form id=\"element\">'                           +\n        '<input id=\"field1\" type=\"text\" required />'  +\n        '<div id=\"field2\"></div>'                     +\n        '<textarea id=\"field2\"></textarea>'           +\n      '</form>');\n    var parsleyForm = $('#element').parsley();\n    parsleyForm.validate();\n    expect($('#parsley-id-' + $('#field1').psly().__id__ + ' li').length).to.be(1);\n\n    $('#element').parsley().on('form:reset', () => {\n      done();\n    });\n    parsleyForm.reset();\n\n    expect($('#parsley-id-' + $('#field1').psly().__id__ + ' li').length).to.be(0);\n  });\n  it('should use destroy() on field', done => {\n    $('body').append('<input type=\"email\" data-parsley-pattern=\"[A-F][0-9]{5}\" data-parsley-required id=\"element\" />');\n    var parsleyField = $('#element').parsley();\n\n    $('#element').parsley().on('field:destroy', () => {\n      done();\n    });\n\n    expect(Utils.getData($('#element')[0], 'Parsley')).to.have.key('__class__');\n    expect(Utils.getData($('#element')[0], 'Parsley').__class__).to.be('Field');\n    parsleyField.destroy();\n    expect(Utils.getData($('#element')[0], 'Parsley')).to.be(undefined);\n  });\n  it('should use destroy() on form', done => {\n    var triggered = 0;\n\n    $('body').append(\n      '<form id=\"element\">'                 +\n        '<input id=\"field1\" type=\"text\"/>'  +\n        '<div id=\"field2\"></div>'           +\n        '<textarea id=\"field2\"></textarea>' +\n      '</form>');\n    var parsleyForm = $('#element').parsley();\n    var fieldEventsCount = 0;\n    var formEventsCount = 0;\n\n    // Test that a subscribed field event on parent form would be triggered by fields too\n    // Here we only have field1 and field2 as valid parsley fields\n    $('#element').parsley().on('field:destroy', () => {\n      fieldEventsCount++;\n    });\n\n    $('#element').parsley().on('form:destroy', () => {\n      formEventsCount++;\n    });\n\n    expect(Utils.getData($('#element')[0], 'Parsley')).to.have.key('__class__');\n    expect(Utils.getData($('#element')[0], 'Parsley').__class__).to.be('Form');\n    expect(Utils.getData($('#field1')[0], 'Parsley')).to.have.key('__class__');\n    expect(Utils.getData($('#field1')[0], 'Parsley').__class__).to.be('Field');\n\n    parsleyForm.destroy();\n\n    expect(fieldEventsCount).to.be(2);\n    expect(formEventsCount).to.be(1);\n\n    // we should never enter here since parsley form instance is destroyed\n    Parsley.on('form:validate', () => {\n      expect(true).to.be(false);\n    });\n\n    // test that a submit event does not trigger parsley validation anymore\n    $('#element').on('submit', e => {\n      e.preventDefault();\n\n      expect(Utils.getData($('#element')[0], 'Parsley')).to.be(undefined);\n      expect(Utils.getData($('#field1')[0], 'Parsley')).to.be(undefined);\n      Parsley.off('form:validate');\n      done();\n    });\n\n    $('#element').submit();\n  });\n  afterEach(() => {\n    $('#element, .parsley-errors-list').remove();\n  });\n});\n"
  },
  {
    "path": "test/unit/extra/bind.js",
    "content": "import $ from 'jquery';\n\nimport Parsley from '../../../src/parsley';\n\ndescribe('extra/plugin/bind', () => {\n  // Hack to load and undo the loading of the plugin:\n  before(() => {\n    require('../../../src/extra/plugin/bind');\n  });\n  after(() => {\n    window.ParsleyExtend = {}; // Undo the plugin...\n  });\n\n  it('should have a bind.js plugin allowing to give pure json validation config to parsley constructor', () => {\n    $('body').append(\n      '<form id=\"element\" >' +\n        '<input type=\"text\" name=\"name\" />' +\n        '<input type=\"text\" name=\"email\" id=\"email\" />' +\n        '<input type=\"checkbox\" name=\"sexe\" id=\"sexe\" value=\"male\" />' +\n        '<input type=\"checkbox\" name=\"sexe\" value=\"female\" />' +\n      '</form>');\n\n    var parsleyInstance;\n    expectWarning(() => {\n      parsleyInstance = $('#element').parsley({\n        fields: {\n          '[name=\"name\"]': {\n            required: true,\n            length: [4, 20]\n          },\n          '#email': {\n            type: 'email'\n          },\n          '#sexe': {\n            required: true\n          }\n        }\n      });\n    });\n    expect($('[name=\"name\"]').parsley().constraints.length).to.be(2);\n    expect($('#email').parsley().constraints.length).to.be(1);\n    expect($('#sexe').parsley().constraints.length).to.be(1);\n    expect($('#sexe').parsley().constraints[0].name).to.be('required');\n  });\n\n  afterEach(() => {\n    $('#element, .fixture, .parsley-errors-list').remove();\n  });\n});\n"
  },
  {
    "path": "test/unit/extra/comparison.js",
    "content": "import $ from 'jquery';\n\nimport Parsley from '../../../src/parsley';\n\nimport comparison from '../../../src/extra/validator/comparison';\n\ndescribe('extra/validator/comparison', () => {\n  it('should have gt validator', () => {\n    var number = 5;\n\n    // Check with a selector\n    $('body').append('<input type=\"text\" id=\"element\" data-parsley-gt=\"#gt\" required /><input type=\"text\" id=\"gt\" value=\"' + number + '\" />');\n    expect($('#element').psly().isValid()).to.be(false);\n    $('#element').val(number + 1);\n    expect($('#element').psly().isValid()).to.be(true);\n    $('#element').val(number);\n    expect($('#element').psly().isValid()).to.be(false);\n    $('#element').val(number - 1);\n    expect($('#element').psly().isValid()).to.be(false);\n\n    // Check with a (different) number\n    number = 42;\n    $('#element').attr('data-parsley-gt', number);\n    $('#element').val(number + 1);\n    expect($('#element').psly().isValid()).to.be(true);\n    $('#element').val(number);\n    expect($('#element').psly().isValid()).to.be(false);\n    $('#element').val(number - 1);\n    expect($('#element').psly().isValid()).to.be(false);\n\n    $('#gt').remove();\n  });\n  it('should have gte validator', () => {\n    var number = 5;\n\n    // Check with a selector\n    $('body').append('<input type=\"text\" id=\"element\" data-parsley-gte=\"#gte\" required /><input type=\"text\" id=\"gte\" value=\"' + number + '\" />');\n    expect($('#element').psly().isValid()).to.be(false);\n    $('#element').val(number + 1);\n    expect($('#element').psly().isValid()).to.be(true);\n    $('#element').val(number);\n    expect($('#element').psly().isValid()).to.be(true);\n    $('#element').val(number - 1);\n    expect($('#element').psly().isValid()).to.be(false);\n\n    // Check with a (different) number\n    number = 42;\n    $('#element').attr('data-parsley-gte', number);\n    $('#element').val(number + 1);\n    expect($('#element').psly().isValid()).to.be(true);\n    $('#element').val(number);\n    expect($('#element').psly().isValid()).to.be(true);\n    $('#element').val(number - 1);\n    expect($('#element').psly().isValid()).to.be(false);\n\n    $('#gte').remove();\n  });\n  it('should have lt validator', () => {\n    var number = 5;\n\n    // Check with a selector\n    $('body').append('<input type=\"text\" id=\"element\" data-parsley-lt=\"#lt\" required /><input type=\"text\" id=\"lt\" value=\"' + number + '\" />');\n    expect($('#element').psly().isValid()).to.be(false);\n    $('#element').val(number + 1);\n    expect($('#element').psly().isValid()).to.be(false);\n    $('#element').val(number);\n    expect($('#element').psly().isValid()).to.be(false);\n    $('#element').val(number - 1);\n    expect($('#element').psly().isValid()).to.be(true);\n\n    // Check with a (different) number\n    number = 42;\n    $('#element').attr('data-parsley-lt', number);\n    $('#element').val(number + 1);\n    expect($('#element').psly().isValid()).to.be(false);\n    $('#element').val(number);\n    expect($('#element').psly().isValid()).to.be(false);\n    $('#element').val(number - 1);\n    expect($('#element').psly().isValid()).to.be(true);\n\n    $('#lt').remove();\n  });\n  it('should have lte validator', () => {\n    var number = 5;\n\n    // Check with a selector\n    $('body').append('<input type=\"text\" id=\"element\" data-parsley-lte=\"#lte\" required /><input type=\"text\" id=\"lte\" value=\"' + number + '\" />');\n    expect($('#element').psly().isValid()).to.be(false);\n    $('#element').val(number + 1);\n    expect($('#element').psly().isValid()).to.be(false);\n    $('#element').val(number);\n    expect($('#element').psly().isValid()).to.be(true);\n    $('#element').val(number - 1);\n    expect($('#element').psly().isValid()).to.be(true);\n\n    // Check with a (different) number\n    number = 42;\n    $('#element').attr('data-parsley-lte', number);\n    $('#element').val(number + 1);\n    expect($('#element').psly().isValid()).to.be(false);\n    $('#element').val(number);\n    expect($('#element').psly().isValid()).to.be(true);\n    $('#element').val(number - 1);\n    expect($('#element').psly().isValid()).to.be(true);\n\n    $('#lte').remove();\n  });\n  afterEach(() => {\n    $('#element, .fixture, .parsley-errors-list').remove();\n  });\n});\n"
  },
  {
    "path": "test/unit/extra/dateiso.js",
    "content": "import $ from 'jquery';\n\nimport Parsley from '../../../src/parsley';\n\nimport dateiso from '../../../src/extra/validator/dateiso';\n\ndescribe('extra/validator/dateiso', () => {\n\n  it('should have dateiso validator', () => {\n    var expectValidation = function(value, name, requirements) {\n      var field = $('<input>').parsley();\n      field.options[name] = requirements;\n      return expect(field.isValid({force: true, value: value}));\n    };\n\n    expectValidation('',           'dateiso').not.to.be(true);\n    expectValidation('foo',        'dateiso').not.to.be(true);\n    expectValidation('1986-30-01', 'dateiso').not.to.be(true);\n    expectValidation('1986-12-45', 'dateiso').not.to.be(true);\n    expectValidation('1986-12-01', 'dateiso').to.be(true);\n  });\n});\n"
  },
  {
    "path": "test/unit/extra/words.js",
    "content": "import $ from 'jquery';\n\nimport Parsley from '../../../src/parsley';\n\nimport words from '../../../src/extra/validator/words';\n\ndescribe('extra/validator/words', () => {\n  it('should have a minwords validator', () => {\n    $('body').append('<input type=\"text\" id=\"element\" data-parsley-minwords=\"2\" required />');\n    expect($('#element').psly().isValid()).to.be(false);\n    $('#element').val('foo');\n    expect($('#element').psly().isValid()).to.be(false);\n    $('#element').val('foo bar');\n    expect($('#element').psly().isValid()).to.be(true);\n  });\n  it('should have a maxwords validator', () => {\n    $('body').append('<input type=\"text\" id=\"element\" data-parsley-maxwords=\"2\" required />');\n    expect($('#element').psly().isValid()).to.be(false);\n    $('#element').val('foo bar');\n    expect($('#element').psly().isValid()).to.be(true);\n    $('#element').val('foo bar baz');\n    expect($('#element').psly().isValid()).to.be(false);\n  });\n  it('should have a words validator', () => {\n    $('body').append('<input type=\"text\" id=\"element\" data-parsley-words=\"[2, 4]\" required />');\n    expect($('#element').psly().isValid()).to.be(false);\n    $('#element').val('foo');\n    expect($('#element').psly().isValid()).to.be(false);\n    $('#element').val('foo bar baz');\n    expect($('#element').psly().isValid()).to.be(true);\n    $('#element').val('foo bar baz qux bux');\n    expect($('#element').psly().isValid()).to.be(false);\n  });\n  afterEach(() => {\n    $('#element, .fixture, .parsley-errors-list').remove();\n  });\n});\n"
  },
  {
    "path": "test/unit/field.js",
    "content": "import $ from 'jquery';\nimport Field from '../../src/parsley/field';\nimport Parsley from '../../src/parsley';\n\ndescribe('Field', () => {\n  it('should be a function', () => {\n    expect(Field).to.be.a('function');\n  });\n  it('should throw an error if no parsleyInstance given', () => {\n    expect(Field).to.throwException();\n  });\n  it('should properly bind DOM constraints', () => {\n    $('body').append('<input type=\"text\" id=\"element\" data-parsley-required />');\n    var parsleyField = $('#element').parsley();\n    expect(parsleyField.constraints.length).to.be(1);\n    expect(parsleyField.constraints[0].name).to.be('required');\n    expect(parsleyField.constraints[0].isDomConstraint).to.be(true);\n  });\n  it('should properly bind HTML DOM supported constraints', () => {\n    $('body').append('<input type=\"email\" id=\"element\" />');\n    var parsleyField = $('#element').parsley();\n    expect(parsleyField.constraints.length).to.be(1);\n    expect(parsleyField.constraints[0].name).to.be('type');\n    expect(parsleyField.constraints[0].isDomConstraint).to.be(true);\n  });\n  it('should ignore unknown types', () => {\n    $('body').append('<input type=\"\" id=\"element\" />');\n    var parsleyField = $('#element').parsley();\n    expect(parsleyField.constraints.length).to.be(0);\n  });\n  it('should ignore mistyped types', () => {\n    $('body').append('<input type=\"    email\" id=\"element\" />');\n    var parsleyField = $('#element').parsley();\n    expect(parsleyField.constraints.length).to.be(0);\n  });\n  it('should have a proper addConstraint() javascript method', () => {\n    $('body').append('<input type=\"text\" id=\"element\" />');\n    var parsleyField = $('#element').parsley()\n      .addConstraint('required', true);\n    expect(parsleyField.constraints.length).to.be(1);\n    expect(parsleyField.constraints[0].name).to.be('required');\n    expect(parsleyField.constraints[0].requirements).to.be(true);\n    expect(parsleyField.constraints[0].priority).to.be(512);\n    expect(parsleyField.constraints[0].isDomConstraint).to.be(false);\n\n    // trying to add an existing constraint result in an update\n    parsleyField.addConstraint('required', false, 64);\n    expect(parsleyField.constraints.length).to.be(1);\n    expect(parsleyField.constraints[0].name).to.be('required');\n    expect(parsleyField.constraints[0].requirements).to.be(false);\n    expect(parsleyField.constraints[0].priority).to.be(64);\n  });\n  it('should have a proper updateConstraint() javascript method', () => {\n    $('body').append('<input type=\"text\" id=\"element\" />');\n    var parsleyField = $('#element').parsley()\n      .addConstraint('required', true);\n\n    // same as above test where addConstraint resulted in an updateConstraint\n    parsleyField.updateConstraint('required', false, 64);\n    expect(parsleyField.constraints.length).to.be(1);\n    expect(parsleyField.constraints[0].name).to.be('required');\n    expect(parsleyField.constraints[0].requirements).to.be(false);\n    expect(parsleyField.constraints[0].priority).to.be(64);\n  });\n  it('should have a proper removeConstraint() javascript method', () => {\n    $('body').append('<input type=\"text\" id=\"element\" />');\n    var parsleyField = $('#element').parsley()\n      .addConstraint('required', true)\n      .addConstraint('notblank', true)\n      .removeConstraint('required');\n    expect(parsleyField.constraints.length).to.be(1);\n    expect(parsleyField.constraints[0].name).to.be('notblank');\n    expect(parsleyField._isRequired()).to.be(false);\n  });\n  it('should return true for fields without constraints', () => {\n    $('body').append('<input type=\"text\" id=\"element\" value=\"hola\" data-parsley-minlength=\"5\" />');\n    var parsleyField = $('#element').parsley();\n    // Start with some validation errors:\n    expect(parsleyField.isValid()).to.eql(false);\n    // The remove constraint and check result:\n    $('#element').removeAttr('data-parsley-minlength');\n    expect(parsleyField.isValid()).to.be(true);\n  });\n  it('should properly bind HTML5 supported constraints', () => {\n    $('body').append('<input type=\"email\" pattern=\"\\\\w+\" id=\"element\" required min=\"5\" max=\"100\" minlength=\"1\" maxlength=\"3\" />');\n    var parsleyField = $('#element').parsley();\n    // 5 validators: type=email, pattern, required, (min+max => range) and (minlength+maxlength => length)\n    expect(parsleyField.constraints.length).to.be(5);\n    $('#element').removeAttr('min');\n    // still 5 validators, with max instead of range now\n    expect(parsleyField.actualizeOptions().constraints.length).to.be(5);\n    $('#element').removeAttr('minlength');\n    // still 5 validators, with maxlength instead of length now\n    expect(parsleyField.actualizeOptions().constraints.length).to.be(5);\n  });\n\n  it('should properly bind HTML5 date inputs', () => {\n    // Uses RFC 3339/ISO 8601 format YYYY-MM-DD\n    $('body').append('<input type=\"date\" id=\"element\" max=\"2000-01-02\" min=\"1999-01-02\" value=\"1998-12-30\" />');\n    var parsleyField = $('#element').parsley();\n    expect(parsleyField.constraints.length).to.be(2); // Type=Date, Range\n    expect(parsleyField.isValid()).to.be(false);\n    expect(parsleyField.isValid({value: '1999-02-03'})).to.be(true);\n    $('#element').removeAttr('min');\n    expect(parsleyField.isValid()).to.be(true);\n    expect(parsleyField.constraints.length).to.be(2); // Type=Date, Max\n    $('#element').val('2001-03-03');\n    expect(parsleyField.isValid()).to.be(false);\n    $('#element').val('2001/01/01').removeAttr('max');\n    expect(parsleyField.isValid()).to.be(false);      // Still invalid because of format\n    expect(parsleyField.constraints.length).to.be(1); // Type=Date\n  });\n\n  var itShouldFollowSpecForNumber = (step, min, initial, value, valid) => {\n    var attrs = [\n      step ? `step=\"${step}\" ` : '',\n      min  ? `min=\"${min}\" ` : '',\n      initial ? `value=\"${initial}\" ` : ''\n    ].join('');\n    it('should follow HTML5 spec to validate \"number\" type ' +\n    (attrs ? `with attributes ${attrs}` : '') +\n    `by ${valid ? 'accepting' : 'rejecting'} \"${value}\"`, () => {\n      var $input = $(`<input type=\"number\" ${attrs}>`);\n      expect($input.parsley().isValid({value})).to.be(valid);\n    });\n  };\n\n  var checks = [\n    // step | min | initial | good        | bad values\n    //      |     |  value  | values      |\n    // ---- | --- | ------- | ----------- | ----------\n    \"       |     |         | 1, -2, 4.0  | 1.1, 4.       \",\n    \"  any  |     |         | -2, 4.3, .1 | 4., hi, ., 1. \",\n    \"  AnY  |     |         | .1e+2, -.2  | 4e, 4e-, .e+2 \",\n    \"  0.1  |     |         | -2, 4.3     | 4.03          \",\n    \"  0.01 |     |         | 1.11        | 1.111         \", // Bug #1056\n    \"       | 0.3 |         | 4.3         | -2, -2.7, 4.0 \",\n    \"       |     |   0.3   | -2.7, 4.3   | -2, -2.3, 4.0 \",\n    \"  0.4  | 0.3 |         | 1.1         | -2.9, 1.6, 1.8\",\n    \"  0.4  |     |   0.3   | -2.9, 1.1   | 1.6, 1.8      \",\n    \"  0.4  | 0.3 |   0.5   | 1.1         | -2.9, 1.6, 1.8\"\n  ];\n  $.each(checks, (_, check) => {\n    var trim = val => { return val.trim(); };\n    var [step, min, initial, ...goodAndBad] = check.split('|').map(trim);\n    var xs = goodAndBad.map(values => {\n      return values.split(',').map(trim);\n    });\n    var [good, bad] = xs;\n    $.each(good, (_, val) => {\n      itShouldFollowSpecForNumber(step, min, initial, val, true);\n      itShouldFollowSpecForNumber(step, min, initial, val.trim() + '0', true);\n    });\n    $.each(bad, (_, val) => {\n      itShouldFollowSpecForNumber(step, min, initial, val, false);\n    });\n  });\n  // 'any' must be exact match\n  itShouldFollowSpecForNumber('   any    ', '', '', '4.2', false);\n  // min / initial should be auto-trimmed\n  itShouldFollowSpecForNumber('0.2', '   0.3    ', '', '0.3', true);\n  // scientific notation\n  itShouldFollowSpecForNumber('', '0.3', '', '43e-1', true);\n  // commas are not accepted in the spec\n  itShouldFollowSpecForNumber('any', '', '', '1,000', false);\n\n\n  var itShouldFollowSpecForNumber = (step, min, initial, value, valid) => {\n    var attrs = [\n      step ? `step=\"${step}\" ` : '',\n      min  ? `min=\"${min}\" ` : '',\n      initial ? `value=\"${initial}\" ` : ''\n    ].join('');\n    it('should follow HTML5 spec to validate \"number\" type ' +\n    (attrs ? `with attributes ${attrs}` : '') +\n    `by ${valid ? 'accepting' : 'rejecting'} \"${value}\"`, () => {\n      var $input = $(`<input type=\"number\" ${attrs}>`);\n      expect($input.parsley().isValid({value})).to.be(valid);\n    });\n  };\n\n  it('should have a default step of \"any\" for data-parsley-type=\"number\"', () => {\n    var $input = $(`<input data-parsley-type=\"number\" value=\"4.444\">`);\n    expect($input.parsley().isValid()).to.be(true);\n    $input.attr('data-parsley-type-step', '1');\n    expect($input.parsley().isValid()).to.be(false);\n  });\n  it('should valid simple validator', () => {\n    $('body').append('<input type=\"text\" id=\"element\" value=\"\" />');\n    var parsleyField = $('#element').parsley()\n      .addConstraint('required', true);\n    expect(parsleyField.isValid()).to.be(false);\n    $('#element').val('foo');\n    expect(parsleyField.isValid()).to.be(true);\n  });\n  it('should valid more complex `type` validator', () => {\n    $('body').append('<input type=\"text\" id=\"element\" value=\"foo\" />');\n    var parsleyField = $('#element').parsley()\n      .addConstraint('type', 'email');\n    expect(parsleyField.isValid()).to.be(false);\n    $('#element').val('foo');\n    expect(parsleyField.isValid()).to.be(false);\n    $('#element').val('foo@bar.baz');\n    expect(parsleyField.isValid()).to.be(true);\n  });\n  it('should valid most complex Callback() validator', () => {\n    $('body').append('<input type=\"text\" id=\"element\" value=\"\" />');\n    window.Parsley.addValidator('ismultiple', (value, multiple) => {\n      if (!isNaN(parseFloat(value)) && isFinite(value))\n        return !(Number(value) % multiple);\n\n      return false;\n    }, 512);\n\n    var parsleyField = $('#element').parsley()\n      .addConstraint('ismultiple', 2);\n    expect(parsleyField.isValid()).to.eql(true);\n    $('#element').val('1');\n    expect(parsleyField.isValid()).to.be(false);\n    $('#element').val('2');\n    expect(parsleyField.isValid()).to.be(true);\n    parsleyField.updateConstraint('ismultiple', 3);\n    expect(parsleyField.isValid()).to.be(false);\n    $('#element').val('9');\n    expect(parsleyField.isValid()).to.be(true);\n    window.Parsley.removeValidator('ismultiple');\n  });\n  it('should properly compute constraints on each validation', () => {\n    $('body').append('<input type=\"email\" data-parsley-required id=\"element\" />');\n    window.Parsley.addValidator('foobazer', value => {\n      return 'foobar' === value;\n    }, 2);\n    window.Parsley.addValidator('ismultiple', (value, multiple) => {\n      if (!isNaN(parseFloat(value)) && isFinite(value))\n        return !(Number(value) % multiple);\n\n      return false;\n    }, 512);\n\n    var parsleyField = $('#element').parsley()\n      .addConstraint('ismultiple', 4)\n      .addConstraint('foobazer', true);\n    parsleyField.refresh();\n    expect(parsleyField.constraints.length).to.be(4);\n    $('#element').removeAttr('data-parsley-required');\n    parsleyField.refresh();\n    expect(parsleyField.constraints.length).to.be(3);\n    parsleyField\n      .removeConstraint('ismultiple')\n      .refresh();\n    expect(parsleyField.constraints.length).to.be(2);\n    window.Parsley.removeValidator('foobazer');\n    window.Parsley.removeValidator('ismultiple');\n  });\n  it('should handle constraints priorities on validation', () => {\n    $('body').append('<input type=\"email\" pattern=\"[A-F][0-9]{5}\" required id=\"element\" />');\n    var parsleyField = $('#element').parsley();\n    expect(parsleyField.isValid()).to.be(false);\n    expect(parsleyField.validationResult.length).to.be(1);\n    expect(parsleyField.validationResult[0].assert.name).to.be('required');\n    $('#element').val('foo');\n    expect(parsleyField.isValid()).to.be(false);\n    expect(parsleyField.validationResult.length).to.be(1);\n    expect(parsleyField.validationResult[0].assert.name).to.be('type');\n    $('#element').val('foo@bar.baz');\n    expect(parsleyField.isValid()).to.be(false);\n    expect(parsleyField.validationResult.length).to.be(1);\n    expect(parsleyField.validationResult[0].assert.name).to.be('pattern');\n  });\n  it('should handle all violations if `priorityEnabled` is set to false', () => {\n    $('body').append('<input type=\"email\" pattern=\"[A-F][0-9]{5}\" value=\"x\" id=\"element\" />');\n    var parsleyField = $('#element').parsley({priorityEnabled: false});\n    expect(parsleyField.isValid()).to.be(false);\n    expect(parsleyField.validationResult.length).to.be(2);\n  });\n  it('should trigger field:validate event', done => {\n    $('body').append('<input type=\"email\" pattern=\"[A-F][0-9]{5}\" required id=\"element\" />');\n    $('#element').psly()\n    .on('field:validate', function () {\n      // we are before validation!\n      expect(this.validationResult).to.be(true);\n      done();\n    })\n    .validate();\n  });\n  it('should trigger field:validated event', done => {\n    $('body').append('<input type=\"email\" pattern=\"[A-F][0-9]{5}\" required id=\"element\" />');\n    $('#element').psly()\n    .on('field:validated', function () {\n      // we are after validation!\n      expect(this.validationResult.length).to.be(1);\n      done();\n    })\n    .validate();\n  });\n  it('should trigger field:error event', done => {\n    $('body').append('<input type=\"email\" pattern=\"[A-F][0-9]{5}\" required id=\"element\" />');\n    $('#element').psly()\n    .on('field:error', function () {\n      expect(this.validationResult.length).to.be(1);\n      done();\n    })\n    .validate();\n  });\n  it('should trigger parsley:field:success event', done => {\n    $('body').append('<input type=\"email\" required id=\"element\" value=\"foo@bar.baz\" />');\n    $('#element').psly()\n    .on('field:success', function () {\n      expect(this.validationResult).to.be(true);\n      done();\n    })\n    .validate();\n  });\n\n  it('should have the validationResult be changeable', () => {\n    var submitted = false;\n    $('<form id=\"element\"><input/></form>')\n    .appendTo('body')\n    .parsley()\n    .on('field:success', field => {\n      field.validationResult = false;\n    })\n    .on('field:error', field => {\n      field.validationResult = true;\n    })\n    .on('form:submit', form => {\n      submitted = true;\n      return false;\n    });\n    $('#element').submit();\n    expect(submitted).to.be(false);\n    $('#element input').attr('required', true);\n    $('#element').submit();\n    expect(submitted).to.be(true);\n  });\n\n  it('should allow `this.value` alteration with field:validate.parsley event', () => {\n    $('body').append('<input type=\"email\" required id=\"element\" value=\"foo@bar.baz\" />');\n    expect($('#element').parsley().validate()).to.be(true);\n\n    $('#element').parsley().on('field:validate', function () {\n      this.value = '';\n    });\n\n    expect($('#element').parsley().validate()).not.to.be(true);\n  });\n  it('should have validateIfEmpty / force:true to validate empty fields', () => {\n    var calls = [];\n    window.Parsley.addValidator('checkevenwhenempty', value => {\n      calls.push(value);\n      return 'foo@bar.com' === value;\n    }, 2);\n\n    $('body').append('<input type=\"email\" data-parsley-checkevenwhenempty id=\"element\" />');\n    expect($('#element').psly().isValid()).to.be.eql(true);\n    expect(calls).to.be.eql([]);\n    expect($('#element').psly().isValid({force: true})).to.be.eql(false);\n    expect(calls).to.be.eql(['']);\n    $('#element').attr('data-parsley-validate-if-empty', '');\n    expect($('#element').psly().isValid()).to.be.eql(false);\n    expect(calls).to.be.eql(['', '']);\n    $('#element').val('foo@bar.com');\n    expect($('#element').psly().isValid()).to.be.eql(true);\n    expect(calls).to.be.eql(['', '', 'foo@bar.com']);\n    window.Parsley.removeValidator('checkevenwhenempty');\n  });\n  it('should allow passing a specific value to `isValid` method', () => {\n    expect($('<input type=\"email\" value=\"foo\">').parsley().isValid()).to.be(false);\n    expect($('<input type=\"email\" value=\"foo\">').parsley().isValid({value: ''})).to.be(true);\n    expectWarning(() => {\n      expect($('<input type=\"email\" value=\"foo\">').parsley().isValid(true, '')).to.be(true);\n    });\n  });\n  it('should have a whitespace=\"squish\" option', () => {\n    $('body').append('<input type=\"text\" id=\"element\" value=\" foo    bar \" />');\n    expect($('#element').parsley().getValue()).to.be(' foo    bar ');\n    $('#element').attr('data-parsley-whitespace', 'squish').parsley().actualizeOptions();\n    expect($('#element').parsley().getValue()).to.be('foo bar');\n  });\n  it('should have a whitespace=\"trim\" option', () => {\n    $('body').append('<input type=\"text\" id=\"element\" value=\" foo \" />');\n    expect($('#element').parsley().getValue()).to.be(' foo ');\n    $('#element').attr('data-parsley-whitespace', 'trim').parsley().actualizeOptions();\n    expect($('#element').parsley().getValue()).to.be('foo');\n  });\n  it('should have a trim-value option', () => {\n    $('body').append('<input type=\"text\" id=\"element\" value=\" foo \" />');\n    expect($('#element').parsley().getValue()).to.be(' foo ');\n    $('#element').attr('data-parsley-trim-value', true).parsley().actualizeOptions();\n    expectWarning(() => {\n      expect($('#element').parsley().getValue()).to.be('foo');\n    });\n  });\n\n  it('should delay validation if debounce option specified', done => {\n    // Use a an initially valid input. Any success event will be a sign that validation completed\n    // and treated as a failure. We will make the field invalid before delayed validation occurs,\n    // so only error event will be a test success.\n    $('body').append('<input data-parsley-debounce=\"100\" value=\"x\" required data-parsley-trigger=\"validatenow\" id=\"element\"/>');\n    $('#element').parsley()\n    .on('field:error', () => done())\n    .on('field:success', () => expect().fail('validation should not happen yet'));\n\n    // Trigger validation immediately\n    $('#element').trigger('validatenow');\n    // and a bit later, which should reset the counter\n    setTimeout(() => $('#element').trigger('validatenow'), 50);\n    // Set final condition after a delay longer than our debounce, less than 50+debounce\n    setTimeout(() => $('#element').val(''), 140);\n  });\n\n  it('should inherit options from the form, even if the form is bound after', () => {\n    $('body').append('<form id=\"element\" data-parsley-required>' +\n      '<input type=\"text\"/></form>');\n    var psly = $('#element input').parsley();\n    expect(psly.isValid()).not.to.be(false);\n    $('#element').parsley();\n    expect(psly.isValid()).to.be(false);\n  });\n  it('should have options that can be set easily', () => {\n    var psly = $('<input type=\"text\"/>').parsley();\n    psly.options.required = true;\n    expect(psly.isValid()).to.be(false);\n  });\n  it('should have a value option', () => {\n    $('body').append('<input type=\"text\" id=\"element\"/>');\n    expect($('#element').parsley({value: 'foo'}).getValue()).to.be('foo');\n  });\n  it('should accept a function as value option', () => {\n    $('body').append('<input type=\"text\" id=\"element\"/>');\n    var str = 'fo';\n    var parsley = $('#element').parsley({value: () => { return str = str + 'o';}});\n    expect(parsley.getValue()).to.be('foo');\n    expect(parsley.getValue()).to.be('fooo');\n  });\n  it('should properly handle null or undefined values', () => {\n    $('body').append('<input type=\"text\" id=\"element\" required value/>');\n    expect($('#element').parsley().isValid()).to.be(false);\n  });\n  afterEach(() => {\n    $('#element, .parsley-errors-list').remove();\n  });\n});\n"
  },
  {
    "path": "test/unit/form.js",
    "content": "import $ from 'jquery';\nimport Form from '../../src/parsley/form';\nimport Parsley from '../../src/parsley';\n\ndescribe('Form', () => {\n  it('should be a function', () => {\n    expect(Form).to.be.a('function');\n  });\n  it('should bind parsleyFields children', () => {\n    $('body').append(\n      '<form id=\"element\">'                 +\n        '<input id=\"field1\" type=\"text\"/>'  +\n        '<div id=\"field2\"></div>'           +\n        '<textarea id=\"field2\"></textarea>' +\n      '</form>');\n    var parsleyForm = $('#element').parsley();\n    expect(parsleyForm.fields.length).to.be(2);\n  });\n  it('should bind parsleyFields children, and not excluded ones', () => {\n    $('body').append(\n      '<form id=\"element\">'                 +\n        '<input id=\"field1\" type=\"text\"/>'  +\n        '<div id=\"field2\"></div>'           +\n        '<textarea id=\"field2\"></textarea>' +\n        '<div data-parsley-validate></div>' + // Form, not a valid child\n        '<input id=\"field3\" disabled />'    + // Disabled, excluded by custom options below\n        '<input id=\"field-excluded\" data-parsley-excluded=\"true\" />'    + // Excluded with 'excluded' option\n        '<input type=\"submit\"/>'            + // Excluded field, not valid\n      '</form>');\n    var parsleyForm = $('#element').parsley({excluded: '[disabled], input[type=button], input[type=submit], input[type=reset]'});\n    expect(parsleyForm.fields.length).to.be(2);\n    expect($('#field-excluded').data('Parsley')).to.be(undefined);\n  });\n  it('should properly reset excluded', () => {\n    $('body').append(\n      '<form id=\"element\">'                 +\n        '<input id=\"field\" required class=\"foo\"/>'  +\n      '</form>');\n    var parsleyForm = $('#element').parsley();\n    parsleyForm.validate();\n    expect($('.parsley-error').length).to.be(1);\n    parsleyForm.options.excluded = \".foo\";\n    parsleyForm.validate();\n    expect($('.parsley-error').length).to.be(0);\n  });\n  it('should properly bind options for form and children fields', () => {\n    $('body').append(\n      '<form id=\"element\" data-parsley-trigger=\"change\">'                 +\n        '<input id=\"field1\" type=\"text\" data-parsley-required=\"true\" />'  +\n        '<div id=\"field2\"></div>'                                         +\n        '<textarea id=\"field3\" data-parsley-notblank=\"true\"></textarea>'  +\n      '</form>');\n    var parsleyForm = $('#element').parsley();\n    expect(parsleyForm.fields.length).to.be(2);\n    expect($('#field1').parsley().options.trigger).to.be('change');\n    expect($('#field1').parsley().options.required).to.eql(true);\n    expect($('#field1').parsley().options.notblank).to.be(undefined);\n    expect($('#field3').parsley().options.notblank).to.eql(true);\n    expect($('#field3').parsley().options.required).to.be(undefined);\n  });\n  it('should properly store validation state after `validate()`', () => {\n    $('body').append(\n      '<form id=\"element\" data-parsley-trigger=\"change\">'                 +\n        '<input id=\"field1\" type=\"text\" data-parsley-required=\"true\" />'  +\n        '<div id=\"field2\"></div>'                                         +\n        '<textarea id=\"field3\" data-parsley-notblank=\"true\"></textarea>'  +\n      '</form>');\n    var parsleyForm = $('#element').parsley();\n    parsleyForm.validate();\n    expect(parsleyForm.validationResult).to.be(false);\n    $('#field1').val('foo');\n    $('#field3').val('foo');\n    expect(parsleyForm.validate()).to.be(true);\n  });\n  it('should handle group validation', () => {\n    $('body').append(\n      '<form id=\"element\">'                                                                        +\n        '<input id=\"field1\" type=\"text\" data-parsley-group=\"foo\" data-parsley-required=\"true\" />'  +\n        '<div id=\"field2\"></div>'                                                                  +\n        '<textarea id=\"field3\" data-parsley-required=\"true\"></textarea>'  +\n      '</form>');\n    var parsleyForm = $('#element').parsley();\n    expect(parsleyForm.isValid()).to.be(false);\n    $('#field1').val('value');\n    expect(parsleyForm.isValid()).to.be(false);\n    expect(parsleyForm.isValid({group: 'foo'})).to.be(true);\n    $('#field3').attr('data-parsley-group', 'bar');\n    expectWarning(() => {\n      expect(parsleyForm.isValid('bar')).to.be(false);\n    });\n  });\n  it('should handle group validation with controls with multiple group names', () => {\n    $('body').append(\n      '<form id=\"element\">'                                                                        +\n        '<input id=\"field1\" type=\"text\" data-parsley-group=\\'[\"foo\", \"bar\"]\\' data-parsley-required=\"true\" />'  +\n        '<input id=\"field2\" type=\"text\" data-parsley-group=\\'[\"bar\", \"baz\"]\\' data-parsley-required=\"true\" />'  +\n        '<textarea id=\"field3\" data-parsley-group=\\'[\"baz\", \"qux\"]\\' data-parsley-required=\"true\"></textarea>'  +\n      '</form>');\n    var parsleyForm = $('#element').parsley();\n    expect(parsleyForm.isValid()).to.be(false);\n    $('#field1').val('value');\n    $('#field2').val('value');\n    expect(parsleyForm.isValid()).to.be(false);\n    // group name only on one required field, with value\n    expect(parsleyForm.isValid('foo')).to.be(true);\n    // group name on multiple required fields, all with values\n    expect(parsleyForm.isValid('bar')).to.be(true);\n    // group name on multiple required fields, one missing a value\n    expect(parsleyForm.isValid('baz')).to.be(false);\n    // group name on single required field, without value\n    expect(parsleyForm.isValid('qux')).to.be(false);\n  });\n  it('should send submit button values, even for async validations', () => {\n    var deferred = null;\n    window.Parsley.addValidator('custom', () => {\n      deferred = $.Deferred();\n      return deferred.promise();\n    });\n\n    $('body').append(\n      '<form id=\"element\">'                 +\n        '<input id=\"field1\" type=\"text\" name=\"nick\" data-parsley-custom data-parsley-required />'  +\n        '<div id=\"field2\" name=\"comment\"></div>'                                         +\n        '<input type=\"submit\" name=\"foo\" value=\"bar\" />'  +\n        '<input type=\"submit\" name=\"foo\" value=\"other\" />'  +\n        '<button name=\"foo\" value=\"but\">ok</button>' +\n      '</form>');\n    var parsleyForm = $('#element').parsley();\n\n    $('#element input:last').click();\n    // Form should not be submitted at this point, coz field is required\n    expect(deferred).to.be(null);\n\n    $('#field1').val('something');\n    var values = [];\n    $('#element').on('submit', evt => {\n      expect(evt.parsley).to.be(true);\n      values.push($('form input[type!=submit][name=\"foo\"]').val());\n      evt.preventDefault();\n    });\n\n    $('#element button').click();\n    expect(values).to.eql([]);\n    deferred.resolve();\n    expect(values).to.eql(['but']);\n\n    $('#element input[value=\"other\"]').click();\n    deferred.resolve();\n    expect(values).to.eql(['but', 'other']);\n\n    $('#element').submit(); // Similar to pressing 'enter'\n    deferred.resolve();\n    expect(values).to.eql(['but', 'other', 'bar']);\n\n    window.Parsley.removeValidator('custom');\n  });\n  it('should not validate when triggered by a button with formnovalidate', () => {\n    var $form = $('<form id=\"element\"><input type=\"string\" required /><input type=\"submit\" formnovalidate /><form>').appendTo($('body'));\n    $form.on('submit', e => {\n      e.preventDefault();\n    });\n\n    var callbacks = [];\n    $.each(['validate', 'error', 'success', 'validated', 'submit'], (i, cb) => {\n      $form.parsley().on('form:' + cb, () => {\n        callbacks.push(cb);\n      });\n    });\n    $form.parsley();\n    $form.find('input[type=submit]').click();\n    expect(callbacks.join()).to.be('');\n  });\n\n  it('should have a force option for validate and isValid methods', () => {\n    $('body').append(\n      '<form id=\"element\">'                                   +\n        '<input id=\"field1\" type=\"email\" />'                  +\n        '<input id=\"field3\" data-parsley-notblank=\"true\" />'  +\n      '</form>');\n    expect($('#element').parsley().isValid()).to.be(true);\n    expect($('#element').parsley().isValid({force: true})).to.be(false);\n    expect($('#element').parsley().validate()).to.be(true);\n    expectWarning(() => {\n      expect($('#element').parsley().validate(undefined, true)).to.be(false);\n    });\n  });\n  it('should properly bind dynamically added fields', () => {\n    $('body').append('<form id=\"element\" data-parsley-trigger=\"change\"></form>');\n    $('#element').append('<input type=\"email\" id=\"email\" required />');\n    var fieldInstance = $('#email').psly();\n    expect(fieldInstance.__class__).to.be('Field');\n    var formInstance = $('#element').psly();\n    // form corectly have its field, and field have finaly its parent form\n    expect(formInstance.fields[0].$element.attr('id')).to.be('email');\n    expect(fieldInstance.parent.__class__).to.be('Form');\n  });\n  it('should fire the right callbacks in the right order', () => {\n    var $form = $('<form id=\"element\"><input type=\"string\" required /><form>').appendTo($('body'));\n    $form.on('submit', e => {\n      e.preventDefault();\n    });\n\n    var callbacks = [];\n    $.each(['validate', 'error', 'success', 'validated', 'submit'], (i, cb) => {\n      $form.parsley().on('form:' + cb, () => {\n        callbacks.push(cb);\n      });\n    });\n    $form.parsley();\n    $form.submit();\n    $form.find('input').val('Hello');\n    $form.submit();\n    expect(callbacks.join()).to.be('validate,error,validated,validate,success,validated,submit');\n  });\n  it('should fire \"form:validate.parsley\" to give the opportunity for changes before validation occurs', () => {\n    var $form = $('<form id=\"element\"><input type=\"string\" required /><form>').appendTo($('body'));\n    $form.parsley().on('form:validate', function () {\n      this.$element.find('input').remove();\n    });\n    expect($form.parsley().validate()).to.be(true);\n  });\n  it('should stop event propagation on form submit', done => {\n    $('body').append('<form id=\"element\"><input type=\"text\" required/></form>');\n    var parsleyInstance = $('#element').parsley()\n    .on('form:validated', () => {\n      done();\n    });\n    $('#element').on('submit', () => {\n      // It sould never pass here!\n      expect(true).to.be(false);\n    })\n    .submit();\n  });\n\n  it('should have the validationResult be changeable', () => {\n    var submitted = false;\n    $('<form id=\"element\"></form>')\n    .appendTo('body')\n    .parsley()\n    .on('form:success', form => {\n      form.validationResult = false;\n    })\n    .on('form:error', form => {\n      form.validationResult = true;\n    })\n    .on('form:submit', form => {\n      submitted = true;\n      return false;\n    });\n    $('#element').submit();\n    expect(submitted).to.be(false);\n    $('#element').append('<input required>').submit();\n    expect(submitted).to.be(true);\n  });\n\n  it('should fire form:submit.event and be interruptable when validated', done => {\n    $('<form id=\"element\"></form>')\n    .appendTo('body')\n    .parsley()\n    .on('form:submit', () => {\n      done();\n      return false;\n    });\n    $('#element').submit();\n  });\n\n  it('should deprecate interruptions with submitEvent.preventDefault()', () => {\n    expectWarning(() => {\n      $('<form id=\"element\"></form>')\n      .appendTo('body')\n      .parsley()\n      .on('form:validate', (form) => {\n        form.submitEvent.preventDefault();\n      })\n      .on('form:submit', (form) => {\n        throw new Error('Form should not have been submitted');\n      });\n      $('#element').submit();\n    });\n  });\n\n  it('should fire field:reset event if fields are removed or excluded', () => {\n    var parsleyInstance;\n    var steps = [];\n    var step = 'init';\n    var parsleyForm = $('<form id=\"element\"><input type=\"text\" required></form>')\n        .appendTo('body')\n        .parsley()\n        .on('field:reset', function () {\n          steps.push('form: ' + step);\n          expect(this).to.be(parsleyInstance);\n        })\n        ;\n    parsleyInstance = $('#element input').parsley()\n        .on('field:reset', function () {\n          steps.push('field: ' + step);\n          expect(this).to.be(parsleyInstance);\n        });\n\n    parsleyForm.validate();\n    parsleyForm.validate();\n    parsleyForm.options.excluded = '[required]';\n    step = 'excluded';\n    parsleyForm.validate();\n    parsleyForm.validate();\n    parsleyForm.options.excluded = '';\n    step = 'not excluded';\n    parsleyForm.validate();\n    parsleyForm.validate();\n    var $i = $('#element input').detach();\n    step = 'detached';\n    parsleyForm.validate();\n    parsleyForm.validate();\n    $i.appendTo('form');\n    step = 'reattached';\n    parsleyForm.validate();\n    parsleyForm.validate();\n    $i.remove();\n    step = 'removed';\n    parsleyForm.validate();\n    parsleyForm.validate();\n    expect(steps).to.eql(['field: excluded', 'form: excluded', 'field: detached', 'form: detached', 'field: removed', 'form: removed']);\n  });\n\n  it('should handle validators returning promises', done => {\n    var called = 0;\n    var shouldSubmit = false;\n    var form = $('<form id=\"element\"><input data-parsley-custom value=\"x\"/></form>')\n    .appendTo('body')\n    .parsley();\n    var deferred;\n    window.Parsley.addValidator('custom', () => {\n      called++;\n      deferred = $.Deferred();\n      return deferred.promise();\n    });\n\n    $('#element').on('submit', evt => {\n      evt.preventDefault();\n      expect(evt.parsley).to.be(true); // Sanity check\n      expect(shouldSubmit).to.be(true);\n      window.Parsley.removeValidator('custom');\n      done();\n    });\n    $('#element').submit();\n    expect(called).to.eql(1);\n    deferred.reject();\n\n    var promise = form.whenValidate();\n    expect(called).to.eql(2);\n    expect(promise.state()).to.eql('pending');\n    deferred.reject();\n    expect(promise.state()).to.eql('rejected');\n\n    $('#element').submit();\n    expect(called).to.eql(3);\n    shouldSubmit = true;\n    deferred.resolve();\n  });\n\n  it('should handle priority correctly', () => {\n    var calls = [];\n    var form = $('<form id=\"element\"><input value=\"0\" data-parsley-custom1 data-parsley-custom2 data-parsley-custom3 data-parsley-custom4/></form>')\n    .appendTo('body')\n    .parsley()\n      .on('form:submit', evt => { return false; });\n    for (const i of [1, 2, 3, 4])\n      window.Parsley.addValidator(`custom${i}`, {\n        priority: i <= 2 ? 100 : 10 - i,\n        validateNumber: function(value, requirement) {\n          calls.push(i);\n          return value > i;\n        }\n      });\n    $('#element').submit();\n    $('#element input').val('3');\n    $('#element').submit();\n    $('#element input').val('5');\n    $('#element').submit();\n    expect(calls).to.eql([2, 1, 2, 1, 3, 2, 1, 3, 4]);\n    for (const i of [1, 2, 3, 4])\n      window.Parsley.removeValidator(`custom${i}`);\n\n  });\n\n  it('should refresh', () => {\n    $('body').append(\n      '<form id=\"element\">'                                                                        +\n        '<input required />'  +\n      '</form>');\n    var parsleyForm = $('#element').parsley();\n    parsleyForm.validate();\n    expect($('.parsley-error').length).to.be(1);\n    parsleyForm.options.excluded = \"input\";\n    parsleyForm.refresh();\n    expect($('.parsley-error').length).to.be(0);\n  });\n\n  afterEach(() => {\n    $('#element').remove();\n  });\n});\n"
  },
  {
    "path": "test/unit/index.js",
    "content": "import './base'\nimport './field'\nimport './form'\nimport './multiple'\nimport './parsley'\nimport './pubsub'\nimport './remote'\nimport './ui'\nimport './utils'\nimport './validator'\nimport './validator_registry'\n"
  },
  {
    "path": "test/unit/multiple.js",
    "content": "import $ from 'jquery';\nimport Parsley from '../../src/parsley';\n\ndescribe('Multiple', () => {\n  it('should not throw errors with multiple items with weird automated generated names', () => {\n    $('body').append(\n      '<form id=\"element\">' +\n        '<input type=\"checkbox\" name=\"hello[]\" id=\"check1\" value=\"1\" />'  +\n        '<input type=\"checkbox\" name=\"{{ hello }}\" id=\"check2\" value=\"2\" />'  +\n        '<input type=\"checkbox\" name=\"$hello$\" id=\"check3\" value=\"3\" />'  +\n        '<input type=\"checkbox\" name=\"hello world[ x ]\" id=\"check4\" value=\"4\" />'  +\n        '<input type=\"checkbox\" value=\"foo\" />' +\n      '</form>');\n    expectWarning(() => {\n      $('#element').parsley();\n    });\n  });\n  it('should return same Multiple instance for each field in same multiple group, and it should count as one field in form', () => {\n    $('body').append(\n      '<form id=\"element\" >' +\n        '<input type=\"checkbox\" name=\"check\" id=\"check1\" value=\"1\" />'  +\n        '<input type=\"checkbox\" name=\"check\" id=\"check2\" value=\"2\" />'  +\n        '<input type=\"checkbox\" name=\"check\" id=\"check3\" value=\"3\" />'  +\n      '</form>');\n    var parsleyMultipleInstance = $('#check1').parsley();\n    expect($('#check2').parsley().__id__).to.be(parsleyMultipleInstance.__id__);\n    expect($('#check3').parsley().__id__).to.be(parsleyMultipleInstance.__id__);\n    expect(parsleyMultipleInstance.$elements.length).to.be(3);\n    expect($('#element').parsley().fields.length).to.be(1);\n  });\n  it('should auto add a data-parsley-multiple attribute to each correctly binded multiple input', () => {\n    $('body').append(\n      '<form id=\"element\" >' +\n        '<input type=\"checkbox\" name=\"check\" id=\"check1\" value=\"1\" />'  +\n        '<input type=\"checkbox\" name=\"check\" id=\"check2\" value=\"2\" />'  +\n        '<input type=\"checkbox\" name=\"check\" id=\"check3\" value=\"3\" />'  +\n        '<input type=\"checkbox\" value=\"foo\" />' +\n      '</form>');\n    expectWarning(() => {\n      $('#element').parsley();\n    });\n    expect($('#check1').attr('data-parsley-multiple')).to.be('check');\n    expect($('#check2').attr('data-parsley-multiple')).to.be('check');\n    expect($('#check3').attr('data-parsley-multiple')).to.be('check');\n    expect($('#check4').eq(3).attr('data-parsley-multiple')).to.be(undefined);\n  });\n  it('should have a specific `getValue` method (checkbox)', () => {\n    $('body').append(\n      '<form id=\"element\" >' +\n        '<input type=\"checkbox\" name=\"check[]\" id=\"check1\" value=\"1\" />'  +\n        '<input type=\"checkbox\" name=\"check[]\" id=\"check2\" value=\"2\" />'  +\n      '</form>');\n    expect($('#check1').parsley().getValue()).to.be.eql([]);\n    expect($('#check2').attr('checked', 'checked').parsley().getValue()).to.be.eql(['2']);\n  });\n  it('should have a specific `getValue` method (radio)', () => {\n    $('body').append(\n      '<form id=\"element\" >' +\n        '<input type=\"radio\" name=\"radio\" id=\"radio1\" value=\"3\" />'  +\n        '<input type=\"radio\" name=\"radio\" id=\"radio2\" value=\"4\" />'  +\n      '</form>');\n    expect($('#radio1').parsley().getValue()).to.be.eql('');\n    expect($('#radio2').attr('checked', 'checked').parsley().getValue()).to.be.eql('4');\n  });\n  it('should handle required constraint (checkbox)', () => {\n    $('body').append(\n      '<form id=\"element\" >' +\n        '<input type=\"checkbox\" name=\"check[]\" id=\"check1\" value=\"1\" />'  +\n        '<input type=\"checkbox\" name=\"check[]\" id=\"check2\" value=\"2\" required />'  +\n      '</form>');\n    expect($('#element').parsley().isValid()).to.be(false);\n    $('#check2').attr('checked', 'checked');\n    expect($('#element').parsley().isValid()).to.be(true);\n  });\n  it('should handle required constraint (radio)', () => {\n    $('body').append(\n      '<form id=\"element\" >' +\n        '<input type=\"radio\" name=\"radio\" id=\"radio1\" value=\"3\" required />'  +\n        '<input type=\"radio\" name=\"radio\" id=\"radio2\" value=\"4\" />'  +\n      '</form>');\n    expect($('#element').parsley().isValid()).to.be(false);\n    $('#radio1').attr('checked', 'checked');\n    expect($('#element').parsley().isValid()).to.be(true);\n  });\n  it('should handle check constraint', () => {\n    $('body').append(\n      '<form id=\"element\" >' +\n        '<input type=\"checkbox\" name=\"check[]\" id=\"check1\" value=\"1\" data-parsley-check=\"[1, 2]\" />'  +\n        '<input type=\"checkbox\" name=\"check[]\" id=\"check2\" value=\"2\" />'  +\n        '<input type=\"checkbox\" name=\"check[]\" id=\"check3\" value=\"3\" />'  +\n        '<input type=\"checkbox\" name=\"check[]\" id=\"check4\" value=\"4\" />'  +\n      '</form>');\n\n    // if not required, field is optional and do not fail\n    expect($('#check1').parsley().isValid()).to.be.eql(true);\n    expect($('#element').parsley().isValid()).to.be(true);\n\n    // once required, it fails if not rightly checked\n    $('#check1').attr('required', 'true');\n    expect($('#element').parsley().isValid()).to.be(false);\n    $('#check2').attr('checked', 'checked');\n    expect($('#element').parsley().isValid()).to.be(true);\n    $('#check1').attr('checked', 'checked');\n    $('#check3').attr('checked', 'checked');\n    expect($('#element').parsley().isValid()).to.be(false);\n  });\n  it('should support select multiple', () => {\n    $('body').append(\n      '<select multiple name=\"foo\" id=\"element\" required data-parsley-mincheck=\"2\">' +\n        '<option value=\"1\">1</option>'  +\n        '<option value=\"2\">2</option>'  +\n        '<option value=\"3\">3</option>'  +\n      '</select>');\n    var parsleyField = $('#element').parsley();\n    expect(parsleyField.__class__).to.be('FieldMultiple');\n    expect(parsleyField.options.multiple).to.be('foo');\n    expect(parsleyField.getValue()).to.be.eql([]);\n    expect(parsleyField.isValid()).to.be(false);\n    $('#element option[value=\"1\"]').attr('selected', 'selected');\n    expect(parsleyField.getValue()).to.be.eql(['1']);\n    expect(parsleyField.isValid()).to.be(false);\n    $('#element option[value=\"2\"]').attr('selected', 'selected');\n    expect(parsleyField.getValue()).to.be.eql(['1', '2']);\n    expect(parsleyField.isValid()).to.be(true);\n  });\n  it('should support select with default without a value', () => {\n    $('body').append(\n      '<select id=\"element\" required>'    +\n        '<option selected=\"selected\" value>default</option>'  +\n        '<option value=\"2\">2</option>'    +\n      '</select>');\n    expect($('#element').parsley().isValid()).to.be(false);\n  });\n  it('should not bind radio or checkboxes without a name or and id or a multiple option', () => {\n    $('body').append('<input type=\"radio\" value=\"foo\" />');\n    var parsleyInstance =\n      expectWarning(() => {\n        return $('input[type=radio]').psly();\n      });\n    expect(parsleyInstance.__class__).to.be('Parsley');\n    $('input[type=radio]').attr('id', 'element');\n    parsleyInstance = $('#element').parsley();\n    expect(parsleyInstance.__class__).to.be('FieldMultiple');\n    expect(parsleyInstance.options.multiple).to.be('element');\n    $('#element').attr('name', 'element');\n    parsleyInstance = $('input[name=element]').parsley();\n    expect(parsleyInstance.__class__).to.be('FieldMultiple');\n    expect(parsleyInstance.options.multiple).to.be('element');\n    parsleyInstance.destroy();\n    $('#element').attr('data-parsley-multiple', 'elementfoo');\n    parsleyInstance = $('input[name=element]').parsley();\n    expect(parsleyInstance.__class__).to.be('FieldMultiple');\n    expect(parsleyInstance.options.multiple).to.be('elementfoo');\n  });\n  it('should bind select multiple input without a name or a multiple option', () => {\n    $('body').append('<select multiple id=\"element\"></select>');\n    expect($('#element').parsley().__class__).to.be('FieldMultiple');\n    expect($('#element').attr('data-parsley-multiple')).to.be('element');\n  });\n  it('should remove errors on change, whatever field is changed', () => {\n    $('body').append(\n      '<form id=\"element\" >' +\n        '<input type=\"checkbox\" name=\"check[]\" id=\"check1\" value=\"1\" required />'  +\n        '<input type=\"checkbox\" name=\"check[]\" id=\"check2\" value=\"2\" />'  +\n        '<input type=\"checkbox\" name=\"check[]\" id=\"check3\" value=\"3\" />'  +\n        '<input type=\"checkbox\" name=\"check[]\" id=\"check4\" value=\"4\" />'  +\n      '</form>');\n    $('#element').parsley().validate();\n    expect($('.parsley-errors-list.filled').length).to.be(1);\n    $('#check2').attr('checked', 'checked').trigger('input');\n    expect($('.parsley-errors-list.filled').length).to.be(0);\n  });\n  it('should add errors on change if trigger enabled, whatever field is changed', () => {\n    $('body').append(\n      '<form id=\"element\" >' +\n        '<input type=\"checkbox\" name=\"check[]\" id=\"check1\" value=\"1\" required data-parsley-mincheck=\"2\" data-parsley-trigger=\"change\" />'  +\n        '<input type=\"checkbox\" name=\"check[]\" id=\"check2\" value=\"2\" />'  +\n        '<input type=\"checkbox\" name=\"check[]\" id=\"check3\" value=\"3\" />'  +\n        '<input type=\"checkbox\" name=\"check[]\" id=\"check4\" value=\"4\" />'  +\n      '</form>');\n    var parsleyInstance = $('#check1').parsley();\n    expect(parsleyInstance.validationResult).to.be(true);\n    $('#check3').trigger($.Event('change'));\n    expect(parsleyInstance.validationResult.length).to.be(1);\n  });\n  it('should bind only valid multiple siblings sharing the same name', () => {\n    $('body').append(\n      '<form id=\"element\">' +\n        '<input name=\"foo\" type=\"hidden\" value=\"0\"/>' +\n        '<input name=\"foo\" id=\"check\" type=\"checkbox\" value=\"1\"/>' +\n        '<input name=\"foo\" id=\"check-2\" type=\"checkbox\" value=\"2\"/>' +\n      '</form>' +\n      '<form id=\"element-2\">' +\n        '<input name=\"foo\" id=\"other-check\" type=\"checkbox\" value=\"3\"/>' +\n      '</form>');\n    $('#element, #element-2').parsley();\n    expect($('#check').parsley().$elements.length).to.be(2);\n  });\n  it('should handle form namespace configuration inheritance and click events while multiple binding through Form', () => {\n    $('body').append(\n      '<form id=\"element\" >' +\n        '<input type=\"radio\" name=\"radio\" id=\"radio1\" value=\"3\" foo-bar-required />'  +\n        '<input type=\"radio\" name=\"radio\" id=\"radio2\" value=\"4\" />'  +\n      '</form>');\n    // set specific namespace here for form\n    var parsleyInstance = $('#element').parsley({namespace: 'foo-bar-'});\n    parsleyInstance.validate();\n    expect($('ul.parsley-errors-list li').length).to.be(1);\n    $('#radio2').trigger('click').trigger('input');\n    expect($('ul.parsley-errors-list li').length).to.be(0);\n  });\n  it('should handle dynamic multiple items removal', () => {\n    $('body').append(\n      '<form id=\"element\" >' +\n        '<input type=\"checkbox\" name=\"check[]\" id=\"check1\" value=\"1\" data-parsley-check=\"[1, 2]\" />'  +\n        '<input type=\"checkbox\" name=\"check[]\" id=\"check2\" value=\"2\" />'  +\n        '<input type=\"checkbox\" name=\"check[]\" id=\"check3\" value=\"3\" />'  +\n        '<input type=\"checkbox\" name=\"check[]\" id=\"check4\" value=\"4\" />'  +\n      '</form>');\n    // bind all multiple checkbox inputs. TODO refacto multiple binding\n    $('#element').parsley();\n    var parsleyInstance = $('[type=checkbox]:first').parsley();\n    expect(parsleyInstance.$elements.length).to.be(4);\n    $('[type=checkbox]:last').remove();\n    // validate form to go through all multiple inputs. TODO refacto multiple binding\n    $('#element').parsley().validate();\n    expect(parsleyInstance.$elements.length).to.be(3);\n  });\n  it('value option can be a function', () => {\n    $('body').append(\n      '<form id=\"element\" >' +\n        '<input type=\"checkbox\" name=\"check[]\" id=\"check1\" value=\"1\" required />'  +\n        '<input type=\"checkbox\" name=\"check[]\" id=\"check2\" value=\"2\" />'  +\n        '<input type=\"checkbox\" name=\"check[]\" id=\"check3\" value=\"3\" />'  +\n        '<input type=\"checkbox\" name=\"check[]\" id=\"check4\" value=\"4\" />'  +\n      '</form>');\n    var called = false;\n    var valid = $('#element')\n    .parsley({value: function() { called = true; return ['x']; }})\n    .isValid();\n    expect(valid).to.be(true);\n    expect(called).to.be(true);\n  });\n  afterEach(() => {\n    $('#element, #element-2, .parsley-errors-list').remove();\n  });\n});\n"
  },
  {
    "path": "test/unit/parsley.js",
    "content": "import $ from 'jquery';\nimport Parsley from '../../src/parsley';\nvar Factory = Parsley.Factory;\n\ndescribe('Factory', () => {\n  it('should be a function', () => {\n    expect(Factory).to.be.a('function');\n  });\n  it('should register some window globals', () => {\n    expect(window.ParsleyUtils).not.to.be(undefined);\n    expect(window.ParsleyValidator).not.to.be(undefined);\n  });\n  it('should throw an error if no element given', () => {\n    expect(Factory).to.throwException();\n  });\n  it('should return Form instance if instantiated on a form', () => {\n    $('body').append('<form id=\"element\"></form>');\n    var parsleyInstance = new Factory($('#element')[0]);\n    expect(parsleyInstance).to.be.an('object');\n    expect(parsleyInstance.__class__).to.be('Form');\n  });\n  it('should return Field instance if instantiated on a field', () => {\n    $('body').append('<input id=\"element\" />');\n    var parsleyInstance = new Factory($('#element')[0]);\n    expect(parsleyInstance).to.be.an('object');\n    expect(parsleyInstance.__class__).to.be('Field');\n  });\n  it('should return Field even if instantiated on an unsupported element', () => {\n    $('body').append('<div id=\"element\"></div>');\n    var parsleyInstance = new Factory($('#element')[0]);\n    expect(parsleyInstance).to.be.an('object');\n    expect(parsleyInstance.__class__).to.be('Field');\n  });\n  it('should return Field instance even if instantiated on an excluded field type, and do not have an errors container', () => {\n    $('body').append('<input type=\"submit\" id=\"element\" />');\n    var parsleyInstance = new Factory($('#element')[0]);\n    expect(parsleyInstance).to.be.an('object');\n    expect(parsleyInstance.__class__).to.be('Field');\n  });\n  it('should have excluded fields by default', () => {\n    $('body').append(\n      '<form id=\"element\" >'        +\n        '<input type=\"submit\" />'   +\n        '<input type=\"reset\" />'    +\n        '<input type=\"hidden\" />'   +\n        '<input type=\"button\" />'   +\n      '</form>');\n    var parsleyInstance = $('#element').parsley();\n    expect(parsleyInstance.fields.length).to.be(0);\n  });\n  it('should return Form if instantiated on an unsupported element with data-parsley-validate attribute', () => {\n    $('body').append('<div id=\"element\" data-parsley-validate></div>');\n    var parsleyInstance = new Factory($('#element')[0]);\n    expect(parsleyInstance).to.be.an('object');\n    expect(parsleyInstance.__class__).to.be('Form');\n  });\n  it('should handle namespace configuration', () => {\n    $('body').append('<div id=\"element\"></div>');\n\n    // default ParsleyOptions.namespace\n    expect(new Factory($('#element')[0]).options.namespace).to.be('data-parsley-');\n\n    // global JS config\n    $('#element').parsley().destroy();\n    window.ParsleyConfig.namespace = 'data-foo-';\n    expect(new Factory($('#element')[0]).options.namespace).to.be('data-foo-');\n\n    // option on the go\n    $('#element').parsley().destroy();\n    expect(new Factory($('#element')[0], {\n      namespace: 'data-bar-'\n    }).options.namespace).to.be('data-bar-');\n\n    // data- DOM-API\n    $('#element').parsley().destroy();\n    $('#element').attr('data-parsley-namespace', 'data-baz-');\n    expect(new Factory($('#element')[0], {\n      namespace: 'data-bar-'\n    }).options.namespace).to.be('data-bar-');\n    delete window.ParsleyConfig.namespace;\n  });\n  it('should handle proper options management', () => {\n    $('body').append('<form id=\"element\" data-parsley-foo=\"bar\" data-parsley-baz=\"baz\"></form>');\n    window.ParsleyConfig = Object.assign(window.ParsleyConfig, {bar: 'baz', baz: 'qux'});\n    var parsleyInstance = new Factory($('#element')[0], {qux: 'bux'});\n    expect(parsleyInstance.options.foo).to.be('bar');\n    expect(parsleyInstance.options.baz).to.be('baz');\n    expect(parsleyInstance.options.bar).to.be('baz');\n    expect(parsleyInstance.options.qux).to.be('bux');\n    delete window.ParsleyConfig.bar;\n    delete window.ParsleyConfig.baz;\n  });\n  it('should have a jquery plugin API', () => {\n    $('body').append('<input type=\"text\" id=\"element\" data-parsley-namespace=\"baz-\"></div>');\n    var parsleyInstance = $('#element').parsley({foo: 'bar'});\n    expect(parsleyInstance.__class__).to.be('Field');\n    expect(parsleyInstance.options.namespace).to.be('baz-');\n    expect(parsleyInstance.options.foo).to.be('bar');\n  });\n  it('should have a jquery API returning undefined if done on a empty set', () => {\n    expect($('#foo').parsley()).to.be(undefined);\n  });\n  it('should have a jquery API that binds multiple selectors', () => {\n    $('body').append('<div id=\"element\">' +\n      '<input type=\"text\" id=\"foo\" required />' +\n      '<input type=\"text\" id=\"bar\" required />' +\n    '</div>');\n    expect($('input').parsley().length).to.be(2);\n  });\n  it('should set options with $.fn.parsley', () => {\n    $('body').append('<form id=\"element\" data-parsley-foo=\"bar\"></form>');\n    var parsleyInstance = $('#element').parsley({foo: 42});\n    expect(parsleyInstance.options.foo).to.be(42);\n    $('#element').parsley({foo: 'updated'});\n    expect(parsleyInstance.options.foo).to.be('updated');\n    delete parsleyInstance.options.foo;\n    expect(parsleyInstance.options.foo).to.be('bar');\n  });\n\n  afterEach(() => {\n    $('#element').remove();\n  });\n});\n"
  },
  {
    "path": "test/unit/pubsub.js",
    "content": "import $ from 'jquery';\nimport Parsley from '../../src/parsley';\n\ndescribe('PubSub', () => {\n  it('listen() without context', done => {\n    expectWarning(() => {\n      $.listen('foo', (instance, arg) => {\n        expect(arg).to.be('bar');\n        done();\n      });\n    });\n    $.emit('foo', 'bar');\n  });\n  it('listen() with context', done => {\n    var obj = {foo: bar => { return 'foo' + bar; }};\n    $.listen('foo', obj, function (instance, arg) {\n      expect(this.foo(arg)).to.be('foobar');\n      done();\n    });\n    $.emit('foo', 'bar');\n  });\n  it('listenTo() Field', done => {\n    $('body').append('<input type=\"text\" id=\"element\" />');\n    $('body').append('<input type=\"text\" id=\"element2\" />');\n\n    var instance = $('#element').psly();\n\n    $.listenTo(instance, 'foo', parsleyInstance => {\n      expect(parsleyInstance.__id__).to.be(instance.__id__);\n      done();\n    });\n\n    $.emit('foo', 'bar');\n    $.emit('foo', $('#element2').psly());\n    $.emit('foo', instance);\n  });\n  it('listenTo() Form will listen to Form', done => {\n    $('body').append(\n      '<form id=\"element\" data-parsley-trigger=\"change\">'                 +\n        '<input id=\"field1\" type=\"text\" data-parsley-required=\"true\" />'  +\n        '<div id=\"field2\"></div>'                                         +\n        '<textarea id=\"field3\" data-parsley-notblank=\"true\"></textarea>'  +\n      '</form>');\n\n    $.listenTo($('#element').psly(), 'foo', parsleyInstance => {\n      expect($('#element').psly().__id__ === parsleyInstance.__id__);\n      done();\n    });\n\n    $.emit('foo', $('#element').psly());\n  });\n  it('listenTo() Form will listen to its fields too', done => {\n    $('body').append(\n      '<form id=\"element\" data-parsley-trigger=\"change\">'                 +\n        '<input id=\"field1\" type=\"text\" data-parsley-required=\"true\" />'  +\n        '<div id=\"field2\"></div>'                                         +\n        '<textarea id=\"field3\" data-parsley-notblank=\"true\"></textarea>'  +\n      '</form>');\n\n    $.listenTo($('#element').psly(), 'foo', instance => {\n      done();\n    });\n\n    $.emit('foo', $('#field1').psly());\n  });\n  it('unsubscribeTo()', done => {\n    $('body').append('<input type=\"text\" id=\"element\" />');\n    $.listen('foo', () => { done(); });\n    $.listenTo($('#element').psly(), 'foo', () => { expect(true).to.be(false); });\n    $.unsubscribeTo($('#element').psly(), 'foo');\n    $.emit('foo', $('#element').psly());\n  });\n  it('unsubscribe()', () => {\n    var fn = () => { expect(true).to.be(false); };\n    $.listen('foo', fn);\n    $.unsubscribe('foo', fn);\n    $.emit('foo');\n  });\n  afterEach(() => {\n    $('#element, #element2').remove();\n\n    $.unsubscribeAll('foo');\n  });\n});\n"
  },
  {
    "path": "test/unit/remote.js",
    "content": "import $ from 'jquery';\n\nimport Parsley from '../../src/parsley';\n\ndescribe('ParsleyRemote', () => {\n  var stubbed = false;\n  var stubAjax = status => {\n    restoreAjax();\n    var deferred = $.Deferred();\n    var xhr = Object.assign(deferred.promise(), {status: status});\n    if (status === 200) {\n      deferred.resolve({}, 'success', 'xhr');\n    } else {\n      deferred.reject(xhr, 'error', 'error');\n    }\n    sinon.stub($, 'ajax').returns(xhr);\n    stubbed = true;\n  };\n  var restoreAjax = () => {\n    if (stubbed)\n      $.ajax.restore();\n    stubbed = false;\n  };\n\n  afterEach(restoreAjax);\n\n  beforeEach(() => {\n    delete window.Parsley._remoteCache;\n  });\n  it('should have window.ParsleyExtend defined', () => {\n    expect(window.ParsleyExtend).not.to.be(undefined);\n  });\n  it('should handle properly validation with remote validator', done => {\n    $('body').append('<input type=\"text\" data-parsley-remote=\"http://foo.bar\" id=\"element\" required name=\"element\" value=\"foo\" />');\n    var parsleyInstance = $('#element').parsley();\n\n    stubAjax(400);\n\n    parsleyInstance.whenValid()\n      .fail(() => {\n        stubAjax(200);\n\n        $('#element').val('bar');\n        parsleyInstance.whenValid()\n          .done(() => { done(); });\n      });\n  });\n  it('should handle remote reverse option', done => {\n    $('body').append('<input type=\"text\" data-parsley-remote=\"http://foo.bar\" id=\"element\" data-parsley-remote-reverse=\"true\" required name=\"element\" value=\"baz\" />');\n    var parsleyInstance = $('#element').parsley();\n\n    stubAjax(200);\n    parsleyInstance.whenValid()\n      .fail(() => {\n        stubAjax(400);\n\n        $('#element').val('bux');\n        parsleyInstance.whenValid()\n          .done(() => { done(); });\n      });\n  });\n  it('should handle remote options', done => {\n    $('body').append('<input type=\"text\" data-parsley-remote=\"http://foo.bar\" id=\"element\" data-parsley-remote-options=\\'{ \"type\": \"POST\", \"data\": {\"foo\": \"bar\"} }\\' required name=\"element\" value=\"baz\" />');\n    var parsleyInstance = $('#element').parsley();\n\n    stubAjax(200);\n    parsleyInstance.whenValid()\n      .done(() => {\n        expect($.ajax.calledWithMatch({type: 'POST'})).to.be(true);\n        expect($.ajax.calledWithMatch({url: 'http://foo.bar'})).to.be(true);\n        expect($.ajax.calledWithMatch({data: {foo: 'bar', element: 'baz'}})).to.be(true);\n        done();\n      });\n  });\n  it('should save some calls for queries already done', done => {\n    $('body').append('<input type=\"text\" data-parsley-remote=\"http://foo.bar\" id=\"element\" required name=\"element\" value=\"foo\" />');\n    var parsleyInstance = $('#element').parsley();\n\n    stubAjax(200);\n    parsleyInstance.whenValid()\n      .done(() => {\n        expect($.ajax.calledOnce).to.be(true);\n        expect($.ajax.calledWithMatch({data: {element: 'foo'}})).to.be(true);\n        stubAjax(400);\n\n        $('#element').val('bar');\n        parsleyInstance.whenValid()\n          .fail(() => {\n            expect($.ajax.calledOnce).to.be(true);\n            expect($.ajax.calledWithMatch({data: {element: 'bar'}})).to.be(true);\n\n            stubAjax(200);\n            $('#element').val('foo');\n\n            parsleyInstance.whenValid()\n              .done(() => {\n                expect($.ajax.callCount).to.be(0);\n                expect($.ajax.calledOnce).to.be(false);\n                done();\n              });\n          });\n      });\n  });\n\n  it('should handle remote validator option', done => {\n    window.Parsley.addAsyncValidator('custom', xhr => {\n      return xhr.status === 404;\n    });\n\n    $('body').append('<input type=\"text\" data-parsley-remote=\"http://foo.bar\" id=\"element\" data-parsley-remote-validator=\"custom\" required name=\"element\" value=\"foobar\" />');\n    var parsleyInstance = $('#element').parsley();\n\n    stubAjax(200);\n    parsleyInstance.whenValid()\n      .fail(() => {\n        stubAjax(400);\n\n        $('#element').val('foobaz');\n        parsleyInstance.whenValid()\n          .fail(() => {\n            stubAjax(404);\n\n            $('#element').val('fooquux');\n            parsleyInstance.whenValid()\n              .done(() => { done(); });\n          });\n      });\n  });\n  it('should handle remote validator option with custom url', done => {\n    $('body').append('<input type=\"text\" data-parsley-remote id=\"element\" data-parsley-remote-validator=\"mycustom\" required name=\"element\" value=\"foobar\" />');\n    var parsleyInstance = $('#element').parsley();\n\n    window.Parsley.addAsyncValidator('mycustom', xhr => {\n      return xhr.status === 404;\n    }, 'http://foobar.baz');\n\n    stubAjax(200);\n    parsleyInstance.whenValid()\n      .fail(() => {\n        expect($.ajax.calledWithMatch({url: 'http://foobar.baz'})).to.be(true);\n        done();\n      });\n  });\n  it('should have PluginField as the `this` context of the AJAX callback', done => {\n    $('body').append('<input type=\"text\" data-parsley-remote id=\"element\" data-parsley-remote-validator=\"mycustom\" required name=\"element\" value=\"foobar\" />');\n    var parsleyInstance = $('#element').parsley();\n\n    window.Parsley.addAsyncValidator('mycustom', function (xhr) {\n      expect(this.__class__).to.be('Field');\n    }, 'http://foobar.baz');\n\n    stubAjax(200);\n    parsleyInstance.whenValid()\n      .fail(() => {\n        expect($.ajax.calledWithMatch({url: 'http://foobar.baz'})).to.be(true);\n        done();\n      });\n  });\n\n  it('should handle deprecated call to addAsyncValidator using an instance', () => {\n    $('body').append('<input type=\"text\" data-parsley-remote id=\"element\" data-parsley-remote-validator=\"mycustom\" required name=\"element\" value=\"foobar\" />');\n\n    expectWarning(() => {\n      $('input').parsley().addAsyncValidator('instancetest', $.noop, '');\n    });\n    expect(Parsley.asyncValidators.instancetest).not.to.be(undefined);\n  });\n\n  it('should clear the cache before and after submitting a form', () => {\n    var parsleyInstance =\n      $('<form id=\"element\"><input type=\"text\" required></form>')\n      .appendTo('body')\n      .on('submit', evt => { evt.preventDefault(); })\n      .parsley();\n    window.Parsley._remoteCache = {dummy: 42};\n    $('#element').submit();\n    expect(window.Parsley._remoteCache.dummy).to.be(undefined);\n    window.Parsley._remoteCache = {dummy: 42};\n    $('#element input').val('hello');\n    parsleyInstance.validate();\n    expect(window.Parsley._remoteCache.dummy).to.be(42);\n    $('#element').submit();\n    expect(window.Parsley._remoteCache.dummy).to.be(undefined);\n  });\n\n  it('should allow the change of XHR options', done => {\n    var parsleyInstance =\n      $('<input id=\"element\" data-parsley-remote=\"http://parsleyjs.org\" name=\"element\" value=\"foobar\"/>')\n      .appendTo('body')\n      .parsley()\n      .on('field:ajaxoptions', (field, options) => {\n        options.url = options.url + '/test/' + options.data.element;\n      });\n\n    stubAjax(200);\n    parsleyInstance.whenValid()\n      .done(() => {\n        expect($.ajax.calledWithMatch({url: 'http://parsleyjs.org/test/foobar'})).to.be(true);\n        expect($.ajax.calledWithMatch({data: {element: 'foobar'}})).to.be(true);\n        done();\n      });\n  });\n\n  it('should allow RESTful URLs', done => {\n    var parsleyInstance =\n      $('<input id=\"element\" data-parsley-remote=\"http://parsleyjs.org/thisisrest/{value}\" name=\"element\" value=\"foo bar\"/>')\n      .appendTo('body')\n      .parsley();\n\n    stubAjax(200);\n    parsleyInstance.whenValid()\n      .done(() => {\n        expect($.ajax.calledWithMatch({url: 'http://parsleyjs.org/thisisrest/foo%20bar'})).to.be(true);\n        expect($.ajax.calledWithMatch({data: {element: 'foo bar'}})).to.be(false);\n        done();\n      });\n  });\n\n  it.skip('should abort successives querries and do not handle their return');\n  afterEach(() => {\n    $('#element, .parsley-errors-list').remove();\n  });\n});\n"
  },
  {
    "path": "test/unit/ui.js",
    "content": "import $ from 'jquery';\nimport UI from '../../src/parsley/ui';\nimport Parsley from '../../src/parsley';\n\ndescribe('UI', () => {\n  before(() => {\n    Parsley.setLocale('en');\n  });\n\n  it('should create proper errors container when needed', () => {\n    $('body').append('<input type=\"text\" id=\"element\" data-parsley-required />');\n    var parsleyField = $('#element').psly();\n    expect($('ul#parsley-id-' + parsleyField.__id__).length).to.be(0);\n    parsleyField.validate();\n    expect($('#element').attr('data-parsley-id')).to.be(parsleyField.__id__);\n    expect($('ul#parsley-id-' + parsleyField.__id__).length).to.be(1);\n    expect($('ul#parsley-id-' + parsleyField.__id__).hasClass('parsley-errors-list')).to.be(true);\n  });\n  it('should handle errors-container option', () => {\n    $('body').append(\n      '<form id=\"element\">'                                                                      +\n        '<input id=\"field1\" type=\"text\" required data-parsley-errors-container=\"#container\" />'  +\n        '<div id=\"container\"></div>'                                                             +\n        '<div id=\"container2\"></div>'                                                            +\n      '</form>');\n    $('#element').psly().validate();\n    expect($('#container .parsley-errors-list').length).to.be(1);\n    $('#element').psly().destroy();\n    $('#field1').removeAttr('data-parsley-errors-container');\n    $('#element').psly({\n      errorsContainer: function (ins) {\n        expect(ins).to.be($('#field1').psly());\n        expect(this).to.be($('#field1').psly());\n        return $('#container2');\n      }\n    }).validate();\n    expect($('#container2 .parsley-errors-list').length).to.be(1);\n  });\n  it('should handle errors-container option with function', () => {\n    $('body').append(\n      '<form id=\"element\">'                                                                                    +\n        '<input id=\"field1\" type=\"text\" required data-parsley-errors-container=\"parsleyContainerFunction\" />'  +\n        '<div id=\"container\"></div>'                                                                           +\n        '<div id=\"container2\"></div>'                                                                          +\n      '</form>');\n    window.parsleyContainerFunction = function (ins) {\n      expect(ins).to.be($('#field1').psly());\n      expect(this).to.be($('#field1').psly());\n      return $('#container2');\n    };\n    $('#element').psly().validate();\n    expect($('#container2 .parsley-errors-list').length).to.be(1);\n    delete window.parsleyContainerFunction;\n  });\n  it('should handle wrong errors-container option', () => {\n    $('body').append('<input type=\"text\" id=\"element\" data-parsley-errors-container=\"#donotexist\" required/>');\n    var parsley = $('#element').psly();\n    expectWarning(() => {\n      parsley.validate();\n    });\n  });\n  it('should not add success class on a field without constraints', () => {\n    $('body').append('<input type=\"text\" id=\"element\" />');\n    var parsleyField = $('#element').psly();\n    parsleyField.validate();\n    expect($('#element').hasClass('parsley-error')).to.be(false);\n    expect($('#element').hasClass('parsley-success')).to.be(false);\n  });\n  it('should not add success class on an empty optional field', () => {\n    $('body').append('<input type=\"number\" id=\"element\" />');\n    var parsleyField = $('#element').psly();\n    parsleyField.validate();\n    expect($('#element').hasClass('parsley-error')).to.be(false);\n    expect($('#element').hasClass('parsley-success')).to.be(false);\n  });\n  var checkType = (type, html, fillValue) => {\n    it(`should add proper parsley class on success or failure (${type})`, () => {\n      $('body').append(`<form id=\"element\"><section>${html}</section></form>`);\n      let form = $('#element').parsley();\n      let $inputHolder = $('#element section').children().first();\n      form.validate();\n      expect($inputHolder.attr('class')).to.be('parsley-error');\n      expect($('.parsley-errors-list').parent().prop(\"tagName\")).to.be('SECTION');\n      // Fill and revalidate:\n      fillValue($inputHolder);\n      form.validate();\n      expect($inputHolder.attr('class')).to.be('parsley-success');\n    });\n  };\n\n  let callVal = $input => $input.val('foo');\n  checkType('text', '<input type=\"text\" required/>', callVal);\n  checkType('select', '<select multiple required><option value=\"foo\">foo</option>', callVal);\n\n  let callProp = $fieldset => $fieldset.find('input').prop('checked', true);\n  checkType('radio', '<fieldset><input type=\"radio\" name=\"foo\" required /></fieldset>', callProp);\n  checkType('checkbox', '<fieldset><input type=\"checkbox\" name=\"foo\" required /></fieldset>', callProp);\n\n  it('should handle class-handler option', () => {\n    $('body').append(\n      '<form id=\"element\">'                                                                 +\n        '<input id=\"field1\" type=\"email\" data-parsley-class-handler=\"#field2\" required />'  +\n        '<div id=\"field2\"></div>'                                                           +\n        '<div id=\"field3\"></div>'                                                           +\n      '</form>');\n    $('#element').psly().validate();\n    expect($('#field2').hasClass('parsley-error')).to.be(true);\n    $('#element').psly().destroy();\n    $('#field1').removeAttr('data-parsley-class-handler');\n    $('#element').psly({\n      classHandler: function (ins) {\n        expect(ins).to.be($('#field1').parsley());\n        expect(this).to.be($('#field1').parsley());\n        return $('#field3');\n      }\n    }).validate();\n    expect($('#field3').hasClass('parsley-error')).to.be(true);\n  });\n  it('should handle class-handler option with a function', () => {\n    $('body').append(\n      '<form id=\"element\">'                                                                 +\n        '<input id=\"field1\" type=\"email\" data-parsley-class-handler=\"#field2\" required />'  +\n        '<div id=\"field4\"></div>'                                                           +\n      '</form>');\n    $('#field1').attr('data-parsley-class-handler', 'parsleyClassHandler');\n    window.parsleyClassHandler = function (ins) {\n      expect(ins).to.be($('#field1').parsley());\n      expect(this).to.be($('#field1').parsley());\n      return $('#field4');\n    };\n    $('#element').psly().validate();\n    expect($('#field4').hasClass('parsley-error')).to.be(true);\n    $('#element').psly().destroy();\n    $('#field1').attr('data-parsley-class-handler', 'someUndefinedFunctionName');\n    expectWarning(() => {\n      $('#element').psly().validate();\n    });\n    expect($('#field1').hasClass('parsley-error')).to.be(true);\n    delete window.parsleyClassHandler;\n  });\n  it('should show higher priority error message by default', () => {\n    $('body').append('<input type=\"email\" id=\"element\" required />');\n    var parsleyField = $('#element').psly();\n    parsleyField.validate();\n    expect($('#element').hasClass('parsley-error')).to.be(true);\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(1);\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').hasClass('parsley-required')).to.be(true);\n\n    $('#element').val('foo').psly().validate();\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(1);\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').hasClass('parsley-type')).to.be(true);\n  });\n  it('should show custom error message by validator', () => {\n    $('body').append('<input type=\"email\" id=\"element\" required data-parsley-required-message=\"foo\" data-parsley-type-message=\"bar\"/>');\n    var parsleyField = $('#element').psly();\n    parsleyField.validate();\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').text()).to.be('foo');\n    $('#element').val('foo').psly().validate();\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').text()).to.be('bar');\n  });\n  it('should show custom error message with variabilized parameters', () => {\n    $('body').append('<input type=\"text\" id=\"element\" value=\"bar\" data-parsley-minlength=\"7\" data-parsley-minlength-message=\"foo %s bar\"/>');\n    var parsleyField = $('#element').psly();\n    parsleyField.validate();\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').text()).to.be('foo 7 bar');\n  });\n  it('should show custom error message for whole field', () => {\n    $('body').append('<input type=\"email\" id=\"element\" required data-parsley-error-message=\"baz\"/>');\n    var parsleyField = $('#element').psly();\n    parsleyField.validate();\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').text()).to.be('baz');\n    $('#element').val('foo').psly().validate();\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').text()).to.be('baz');\n    $('#element').val('foo@bar.baz').psly().validate();\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(0);\n  });\n  it('should display no error message if diabled', () => {\n    $('body').append('<input type=\"email\" id=\"element\" required data-parsley-errors-messages-disabled />');\n    var parsleyField = $('#element').psly();\n    parsleyField.validate();\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(0);\n    expect($('#element').hasClass('parsley-error')).to.be(true);\n  });\n  it('should handle simple triggers (change, focus...)', () => {\n    $('body').append('<input type=\"email\" id=\"element\" required data-parsley-trigger=\"change\" />');\n    var parsleyField = $('#element').psly();\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(0);\n    $('#element').trigger($.Event('change'));\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(1);\n  });\n  it('should allow customization of triggers after first error', () => {\n    $('body').append('<input type=\"email\" id=\"element\" required data-parsley-trigger-after-failure=\"focusout\" />');\n    var parsleyField = $('#element').psly();\n    parsleyField.validate();\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(1);\n    $('#element').val('a@example.com');\n    $('#element').trigger('input');\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(1);\n    $('#element').trigger('focusout');\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(0);\n  });\n  it('should auto bind error trigger on select field error (input=text)', () => {\n    $('body').append('<input type=\"email\" id=\"element\" required />');\n    var parsleyField = $('#element').psly();\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(0);\n    parsleyField.validate();\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(1);\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').hasClass('parsley-required')).to.be(true);\n    $('#element').val('foo').trigger('input');\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').hasClass('parsley-type')).to.be(true);\n  });\n  it('should auto bind error trigger on select field error (select)', () => {\n    $('body').append('<select id=\"element\" required>' +\n      '<option value=\"\">Choose</option>' +\n      '<option value=\"foo\">foo</option>' +\n      '<option value=\"bar\">bar</option>' +\n    '</select>');\n    var parsleyField = $('#element').psly();\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(0);\n    parsleyField.validate();\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(1);\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').hasClass('parsley-required')).to.be(true);\n    $('#element [option=\"foo\"]').attr('selected', 'selected');\n    $('#element').trigger($.Event('change'));\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').hasClass('parsley-type')).to.be(false);\n  });\n  it('should handle complex triggers (keyup, keypress...)', () => {\n    $('body').append('<input type=\"email\" id=\"element\" required data-parsley-trigger=\"keyup\" />');\n    var parsleyField = $('#element').psly();\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(0);\n    $('#element').val('foo').trigger($.Event('keyup'));\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(0);\n    $('#element').val('foob').trigger($.Event('keyup'));\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(1);\n  });\n  it('should handle trigger keyup threshold validation', () => {\n    $('body').append('<input type=\"email\" id=\"element\" data-parsley-validation-threshold=\"7\" required data-parsley-trigger=\"keyup\" />');\n    var parsleyField = $('#element').psly();\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(0);\n    $('#element').val('a@b.com').trigger('keyup');\n    expect($('#element').hasClass('success')).to.be(false);\n    $('#element').val('aa@b.com').trigger('keyup');\n    expect($('#element').hasClass('parsley-success')).to.be(true);\n    $('#element').val('@b.com').trigger('keyup');\n    expect($('#element').hasClass('parsley-success')).to.be(false);\n  });\n  it('should handle UI disabling', () => {\n    $('body').append('<input type=\"email\" id=\"element\" data-parsley-ui-enabled=\"false\" required data-parsley-trigger=\"keyup\" />');\n    var parsleyField = $('#element').psly();\n    expect($('ul#parsley-id-' + parsleyField.__id__).length).to.be(0);\n    parsleyField.validate();\n    expect($('ul#parsley-id-' + parsleyField.__id__).length).to.be(0);\n  });\n  it('should add novalidate on form elem', () => {\n    $('body').append(\n      '<form id=\"element\" data-parsley-trigger=\"change\">'                 +\n        '<input id=\"field1\" type=\"text\" data-parsley-required=\"true\" />'  +\n        '<div id=\"field2\"></div>'                                         +\n        '<textarea id=\"field3\" data-parsley-notblank=\"true\"></textarea>'  +\n      '</form>');\n    var parsleyForm = $('#element').parsley();\n    expect($('#element').attr('novalidate')).not.to.be(undefined);\n  });\n  it('should test the no-focus option', () => {\n    $('body').append(\n      '<form id=\"element\" data-parsley-focus=\"first\">'                                          +\n        '<input id=\"field1\" type=\"text\" data-parsley-required=\"true\" data-parsley-no-focus />'  +\n        '<input id=\"field2\" data-parsley-required />'                                           +\n      '</form>');\n    $('#element').parsley().validate();\n    expect($('#element').parsley()._focusedField.attr('id')).to.be('field2');\n    $('#field2').val('foo');\n    $('#element').psly().validate();\n    expect($('#element').parsley()._focusedField).to.be(null);\n    $('#field1').removeAttr('data-parsley-no-focus');\n    $('#element').psly().validate();\n    expect($('#element').parsley()._focusedField.attr('id')).to.be('field1');\n    $('#element').attr('data-parsley-focus', 'last');\n    $('#element').psly().validate();\n    expect($('#element').parsley()._focusedField.attr('id')).to.be('field1');\n    $('#field2').val('');\n    $('#element').psly().validate();\n    expect($('#element').parsley()._focusedField.attr('id')).to.be('field2');\n  });\n  it('should test the manual add / update / remove error', () => {\n    $('body').append('<input type=\"text\" id=\"element\" />');\n    var parsleyField = $('#element').parsley();\n    parsleyField.removeError('non-existent');\n    parsleyField.validate();\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(0);\n    expect($('#element').hasClass('parsley-error')).to.be(false);\n    expectWarning(() => {\n      window.ParsleyUI.addError(parsleyField, 'foo', 'bar');\n    });\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(1);\n    expect($('#element').hasClass('parsley-error')).to.be(true);\n    expect($('li.parsley-foo').length).to.be(1);\n    expect($('li.parsley-foo').text()).to.be('bar');\n    expectWarning(() => {\n      window.ParsleyUI.updateError(parsleyField, 'foo', 'baz');\n    });\n    expect($('li.parsley-foo').text()).to.be('baz');\n    expectWarning(() => {\n      window.ParsleyUI.removeError(parsleyField, 'foo');\n    });\n    expect($('#element').hasClass('parsley-error')).to.be(false);\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').length).to.be(0);\n  });\n  it('should have a getErrorsMessage() method', () => {\n    $('body').append('<input type=\"email\" id=\"element\" value=\"foo\" data-parsley-minlength=\"5\" />');\n    var parsleyInstance = $('#element').parsley();\n    parsleyInstance.validate();\n    expectWarning(() => {\n      window.ParsleyUI.getErrorsMessages(parsleyInstance);\n    });\n    expect(window.ParsleyUI.getErrorsMessages(parsleyInstance).length).to.be(1);\n    expect(window.ParsleyUI.getErrorsMessages(parsleyInstance)[0]).to.be('This value should be a valid email.');\n\n    $('#element').attr('data-parsley-priority-enabled', false);\n    parsleyInstance.validate();\n    expect(window.ParsleyUI.getErrorsMessages(parsleyInstance).length).to.be(2);\n    expect(window.ParsleyUI.getErrorsMessages(parsleyInstance)[0]).to.be('This value is too short. It should have 5 characters or more.');\n\n  });\n  it('should not have errors ul created for excluded fields', () => {\n    $('body').append('<div id=\"hidden\"><input type=\"hidden\" id=\"element\" value=\"foo\" data-parsley-minlength=\"5\" /></div>');\n    var parsleyInstance = $('#element').parsley();\n    expect($('#hidden ul').length).to.be(0);\n    $('#hidden').remove();\n  });\n  it('should remove filled class from errors container when reseting', () => {\n    $('body').append('<input type=\"email\" id=\"element\" value=\"foo\" data-parsley-minlength=\"5\" />');\n    var parsleyInstance = $('#element').parsley();\n    parsleyInstance.validate();\n    parsleyInstance.reset();\n    expect($('ul#parsley-id-' + parsleyInstance.__id__).hasClass('filled')).to.be(false);\n  });\n  it('should re-bind error triggers after a reset (input=text)', () => {\n    $('body').append('<input type=\"text\" id=\"element\" required />');\n    var parsleyInstance = $('#element').parsley();\n    parsleyInstance.validate();\n    parsleyInstance.reset();\n    parsleyInstance.validate();\n    expect($('ul#parsley-id-' + parsleyInstance.__id__ + ' li').length).to.be(1);\n    $('#element').val('foo').trigger('input');\n    expect($('ul#parsley-id-' + parsleyInstance.__id__ + ' li').length).to.be(0);\n  });\n  it('should re-bind error triggers after a reset (select)', () => {\n    $('body').append('<select id=\"element\" required>' +\n      '<option value=\"\">Choose</option>' +\n      '<option value=\"foo\">foo</option>' +\n      '<option value=\"bar\">bar</option>' +\n    '</select>');\n    var parsleyInstance = $('#element').parsley();\n    parsleyInstance.validate();\n    parsleyInstance.reset();\n    parsleyInstance.validate();\n    expect($('ul#parsley-id-' + parsleyInstance.__id__ + ' li').length).to.be(1);\n    $('#element option[value=\"foo\"]').prop('selected', true);\n    $('#element').trigger('input');\n    expect($('ul#parsley-id-' + parsleyInstance.__id__ + ' li').length).to.be(0);\n  });\n  it('should re-bind custom triggers after a reset', () => {\n    $('body').append('<input type=\"text\" id=\"element\" required data-parsley-trigger=\"focusout\" />');\n    var parsleyInstance = $('#element').parsley();\n    parsleyInstance.validate();\n    parsleyInstance.reset();\n    $('#element').trigger('focusout');\n    expect($('ul#parsley-id-' + parsleyInstance.__id__ + ' li').length).to.be(1);\n  });\n  it('should handle custom error message for validators with compound names', () => {\n    $('body').append('<input type=\"text\" value=\"1\" id=\"element\" data-parsley-custom-validator=\"2\" data-parsley-custom-validator-message=\"custom-validator error\"/>');\n    window.Parsley.addValidator('customValidator', (value, requirement) => {\n      return requirement === value;\n    }, 32);\n    var parsleyField = $('#element').psly();\n    parsleyField.validate();\n    expect($('ul#parsley-id-' + parsleyField.__id__ + ' li').text()).to.be('custom-validator error');\n    window.Parsley.removeValidator('customValidator');\n  });\n  it('should handle custom error messages returned from custom validators', () => {\n    $('body').append('<input type=\"text\" value=\"1\" id=\"element\" data-parsley-custom-validator=\"2\" data-parsley-custom-validator-message=\"custom-validator error\"/>');\n    window.Parsley.addValidator('customValidator', (value, requirement) => {\n      return $.Deferred().reject(\"Hey, this ain't good at all\").promise();\n    }, 32);\n    var parsleyField = $('#element').psly();\n    parsleyField.validate();\n    expect($(`ul#parsley-id-${parsleyField.__id__} li`).text()).to.be(\"Hey, this ain't good at all\");\n    window.Parsley.removeValidator('customValidator');\n  });\n  it('should run before events are fired', () => {\n    $('body').append('<input type=\"text\" id=\"element\" required/>');\n    var parsley = $('#element').parsley().on('field:validated', () => {\n      expect($('.parsley-errors-list')).to.have.length(1);\n    });\n    parsley.validate();\n  });\n\n  afterEach(() => {\n    $('#element, .parsley-errors-list').remove();\n  });\n});\n"
  },
  {
    "path": "test/unit/utils.js",
    "content": "import $ from 'jquery';\nimport Utils from '../../src/parsley/utils';\n\ndescribe('Utils', () => {\n  it('should warn when using the old global ParsleyUtils', () => {\n    expectWarning(() => {\n      expect(window.ParsleyUtils.deserializeValue('true')).to.be(true);\n    });\n  });\n  it('should have a proper deserializeValue() function', () => {\n    expect(Utils.deserializeValue('true')).to.be(true);\n    expect(Utils.deserializeValue('1')).to.be(1);\n    expect(Utils.deserializeValue('[\"foo\", \"bar\"]')).to.be.an('array');\n    expect(Utils.deserializeValue('{\"foo\": \"bar\"}')).to.be.an('object');\n  });\n  it('should have a proper camelize() function', () => {\n    expect(Utils.camelize('foo-bar')).to.be('fooBar');\n    expect(Utils.camelize('foo-bar-baz')).to.be('fooBarBaz');\n    expect(Utils.camelize('foo-bAr-baz')).to.be('fooBArBaz');\n  });\n  it('should have a proper dasherize() function', () => {\n    expect(Utils.dasherize('fooBar')).to.be('foo-bar');\n    expect(Utils.dasherize('fooBarBaz')).to.be('foo-bar-baz');\n    expect(Utils.dasherize('fooBArBaz')).to.be('foo-b-ar-baz');\n  });\n  it('should have a proper attr() function', () => {\n    var element = {\n      attributes: [\n        {\n          specified: true,\n          name: \"data-parsley-foo\",\n          value: \"bar\"\n        },\n        {\n          specified: true,\n          name: \"parsley-foo\",\n          value: \"baz\"\n        },\n        {\n          specified: true,\n          name: \"data-parsley-bar\",\n          value: \"[0, 42]\"\n        },\n        {\n          specified: false,\n          name: \"data-parsley-foo\",\n          value: \"bar\"\n        },\n        {\n          foo: \"bar\"\n        }\n      ]\n    };\n    var attr = Utils.attr(element, 'data-parsley-');\n\n    expect(attr).to.eql({'foo': 'bar', 'bar': [0, 42]});\n  });\n  it('should have a proper attr() function that rewrites a given object', () => {\n    var obj = Utils.objectCreate({foo: 'x', fox: 'trot'});\n    obj.deleteMe = 'please';\n    var $element = $('<b data-parsley-foo=\"a\" data-parsley-bar=\"[0, 42]\" parsley-baz=\"baz\">');\n\n    Utils.attr($element[0], 'data-parsley-', obj);\n\n    expect(obj).to.eql({foo: \"a\", bar: [0, 42]});\n    expect(obj.fox).to.eql('trot');\n  });\n\n  it('should have a checkAttr feature', () => {\n    var element = $('<span data-parsley-required-message=\"foo\" data-parsley-validate=\"true\">')[0];\n    expect(Utils.checkAttr(element, 'data-parsley-', 'required')).to.be(false);\n    expect(Utils.checkAttr(element, 'data-parsley-', 'required-message')).to.be(true);\n    expect(Utils.checkAttr(element, 'data-parsley-', 'validate')).to.be(true);\n  });\n\n  describe('namespaceEvents', () => {\n    var itMaps = (what, toWhat) => {\n      it(`maps '${what}' to ''`, () => {\n        expect(Utils.namespaceEvents(what, 'ns')).to.eql(toWhat);\n      });\n    };\n    itMaps('foo', 'foo.ns');\n    for (var evt of ['', '  ', false, null, undefined]) {\n      itMaps(evt, '');\n    }\n    itMaps('   foo    bar   ', 'foo.ns bar.ns');\n  });\n\n  describe('parse', () => {\n    describe('date', () => {\n      it('returns null for invalid dates', () => {\n        expect(Utils.parse.date('1972-13-02')).to.be.null;\n        expect(Utils.parse.date('1973-02-29')).to.be.null;\n        expect(Utils.parse.date('72-01-06')).to.be.null;\n        expect(Utils.parse.date('1972/01/06')).to.be.null;\n        expect(Utils.parse.date('1972-01-6')).to.be.null;\n        expect(Utils.parse.date('1972-1-06')).to.be.null;\n        expect(Utils.parse.date('  1972-01 -06  ')).to.be.null;\n      });\n      it('returns a date for strings of form YYYY/MM/DD', () => {\n        expect(Utils.parse.date('1972-01-06')).to.eql(new Date('1972/01/06'));\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "test/unit/validator.js",
    "content": "import Validator from '../../src/parsley/validator';\n\ndescribe('Validator', () => {\n  var testParsing = function(type, input, output, extraOptions) {\n    it(`parses ${type} requirements`, () => {\n      var c = new Validator({requirementType: type});\n      expect(c.parseRequirements(input, extraOptions)).to.eql(output);\n    });\n  };\n\n  testParsing('integer', '42', [42]);\n  testParsing('number', '4.2', [4.2]);\n  testParsing('string', '42', ['42']);\n  testParsing(['number', 'string'], '[4.2, 4.2]', [4.2, '4.2']);\n  testParsing({\n      '': 'number',\n      'foo': 'string',\n      'bar': 'string'\n    }, '4.2',\n    [4.2, {foo: 'FOO', bar: 'BAR'}],\n    value => { return value.toUpperCase(); }\n  );\n});\n"
  },
  {
    "path": "test/unit/validator_registry.js",
    "content": "import $ from 'jquery';\nimport Validator from '../../src/parsley/validator';\nimport ValidatorRegistry from '../../src/parsley/validator_registry';\nimport Parsley from '../../src/parsley';\nimport '../../src/i18n/fr';\n\ndescribe('ValidatorRegistry', () => {\n  var validatorRegistry = Parsley._validatorRegistry;\n  let instance = $('<input>').parsley();\n\n  var expectValidation = function(value, name, requirements, extra = {}) {\n    var validatorSpec = validatorRegistry.validators[name];\n    var validator = new Validator(validatorSpec);\n    var argList = validator.parseRequirements(requirements, key => { return extra[key]; });\n    return expect(validator.validate(value, ...argList, instance));\n  };\n\n  afterEach(() => {\n    Parsley.setLocale('en');\n  });\n\n  it('should be a function', () => {\n    expect(ValidatorRegistry).to.be.a('function');\n  });\n  it('should bind global config validators if given in constructor', () => {\n    $.extend(true, Parsley.options, {\n      validators: {\n        foo: {fn: () => {}, priority: 42},\n        bar: {fn: () => {}, priority: 12}\n      }\n    });\n    var validator = new ValidatorRegistry(Parsley.options.validators);\n    expect(validator.validators).to.have.key('foo');\n    expect(validator.validators).to.have.key('bar');\n    expect(validatorRegistry.validators).not.to.have.key('foo');\n    delete Parsley.options.validators.foo;\n    delete Parsley.options.validators.bar;\n  });\n  it('should have a required validator', () => {\n    expectValidation('', 'required').not.to.be(true);\n    expectValidation('foo', 'required').to.be(true);\n  });\n  it('should have a notblank validator', () => {\n    expectValidation(' ', 'notblank').not.to.be(true);\n    expectValidation('foo', 'notblank').to.be(true);\n  });\n  it('should have a type=\"email\" validator', () => {\n    expectValidation('',                    'type', 'email').to.be(true);\n    expectValidation('foo',                 'type', 'email').not.to.be(true);\n    expectValidation('foo@bar.y',           'type', 'email').not.to.be(true);\n    expectValidation('foo@bar.y.zz',        'type', 'email').to.be(true);\n    expectValidation('foo@bar.baz',         'type', 'email').to.be(true);\n    expectValidation('foo+bar@bar.baz',     'type', 'email').to.be(true);\n    expectValidation('foo.bar@bar.baz',     'type', 'email').to.be(true);\n    expectValidation('foo.bar@bar.com.ext', 'type', 'email').to.be(true);\n    expectValidation('foo@bar..tt.com',     'type', 'email').to.be(false);\n  });\n  it('should have a type=\"date\" validator', () => {\n    expectValidation('',                    'type', 'date').to.be(true);\n    expectValidation('foo',                 'type', 'date').not.to.be(true);\n    expectValidation('12',                  'type', 'date').not.to.be(true);\n    expectValidation('2001-01-30',          'type', 'date').to.be(true);\n    expectValidation('2001-02-30',          'type', 'date').not.to.be(true);\n    expectValidation('2001-30-01',          'type', 'date').not.to.be(true);\n  });\n  it('should have a min validator', () => {\n    expectValidation('',    'min',6).to.be(true);\n    expectValidation('0',   'min',6).not.to.be(true);\n    expectValidation('foo', 'min',6).not.to.be(true);\n    expectValidation('1',   'min',6).not.to.be(true);\n    expectValidation('6',   'min',6).to.be(true);\n    expectValidation('10',  'min',6).to.be(true);\n    $('body').append('<input type=\"text\" id=\"element\" value=\"7\" min=\"2\" />');\n    expect($('#element').parsley().isValid()).to.be(true);\n  });\n  it('should have a max validator', () => {\n    expectValidation('',    'max', 10).to.be(true);\n    expectValidation('0',   'max', -3).not.to.be(true);\n    expectValidation('foo', 'max', 10).not.to.be(true);\n    expectValidation('1',   'max', 10).to.be(true);\n    expectValidation('1',   'max', '10').to.be(true);\n    expectValidation('10',  'max', 10).to.be(true);\n    expectValidation('17',  'max', 10).not.to.be(true);\n    $('body').append('<input type=\"text\" id=\"element\" value=\"7\" max=\"20\" />');\n    expect($('#element').parsley().isValid()).to.be(true);\n  });\n  it('should have a range validator', () => {\n    expectValidation('1',  'range', [5, 10]).not.to.be(true);\n    expectValidation('7',  'range', [5, 10]).to.be(true);\n    expectValidation('17', 'range', [5, 10]).not.to.be(true);\n    $('body').append('<input type=\"text\" id=\"element\" value=\"7\" max=\"20\" min=\"2\" />');\n    expect($('#element').parsley().isValid()).to.be(true);\n\n    $('#element').remove();\n    $('body').append('<input type=\"range\" id=\"element\" value=\"7\" max=\"20\" min=\"2\" />');\n    expect($('#element').parsley().isValid()).to.be(true);\n  });\n  it('should have a type=\"number\" validator', () => {\n    expectValidation('foo',       'type', 'number').not.to.be(true);\n    expectValidation('-',         'type', 'number').not.to.be(true);\n    expectValidation('1',         'type', 'number').to.be(true);\n    expectValidation('1.5',       'type', 'number', {step: 'any'}).to.be(true);\n    expectValidation('-1.5',      'type', 'number', {step: 'any'}).to.be(true);\n    expectValidation('1500.642',  'type', 'number', {step: 'any'}).to.be(true);\n    expectValidation('0.5',       'type', 'number', {step: 'any'}).to.be(true);\n    expectValidation('.5',        'type', 'number', {step: 'any'}).to.be(true);\n  });\n  it('should have a type=\"digits\" validator', () => {\n    expectValidation('foo',       'type', 'digits').not.to.be(true);\n    expectValidation('1',         'type', 'digits').to.be(true);\n    expectValidation('-1',        'type', 'digits').not.to.be(true);\n    expectValidation('1.5',       'type', 'digits').not.to.be(true);\n    expectValidation('-1.5',      'type', 'digits').not.to.be(true);\n    expectValidation('1,500.642', 'type', 'digits').not.to.be(true);\n  });\n  it('should have a type=\"integer\" validator', () => {\n    expectValidation('foo',  'type', 'integer').not.to.be(true);\n    expectValidation('1',    'type', 'integer').to.be(true);\n    expectValidation('-1',   'type', 'integer').to.be(true);\n    expectValidation('1.5',  'type', 'integer').not.to.be(true);\n    expectValidation('-1.5', 'type', 'integer').not.to.be(true);\n  });\n  it('should have a type=\"alphanum\" validator', () => {\n    expectValidation('foo',     'type', 'alphanum').to.be(true);\n    expectValidation('foo bar', 'type', 'alphanum').not.to.be(true);\n    expectValidation('foo$',    'type', 'alphanum').not.to.be(true);\n    $('body').append('<input data-parsley-type=\"alphanum\" id=\"element\" value=\"v4kRRyhYvo0P\" />');\n    expect($('#element').parsley().isValid()).to.be(true);\n  });\n  it('should have a type=\"url\" validator', () => {\n    expectValidation('foo',                        'type', 'url').not.to.be(true);\n    expectValidation('foo bar',                    'type', 'url').not.to.be(true);\n    expectValidation('http://',                    'type', 'url').not.to.be(true);\n    expectValidation('foo.bar',                    'type', 'url').to.be(true);\n    expectValidation('www.foo.bar',                'type', 'url').to.be(true);\n    expectValidation('http://www.foo.bar',         'type', 'url').to.be(true);\n    expectValidation('https://www.foo.bar',        'type', 'url').to.be(true);\n    expectValidation('http://192.168.1.1/foo/bar', 'type', 'url').to.be(true);\n  });\n  it('should have a pattern validator', () => {\n    expectValidation('a', 'pattern','[a-z]+'   ).to.be(true);\n    expectValidation('A', 'pattern','[a-z]+'   ).not.to.be(true);\n    expectValidation('a', 'pattern','/[a-z]+/' ).to.be(true);\n    expectValidation('A', 'pattern','/[a-z]+/' ).not.to.be(true);\n    expectValidation('a', 'pattern','/[a-z]+/i').to.be(true);\n    expectValidation('A', 'pattern','/[a-z]+/i').to.be(true);\n  });\n  it('should have a pattern validator that behaves as the standard when not of the form /pattern/flag', () => {\n    expectValidation('aa', 'pattern', '[a-z]{1,2}').to.be(true);\n    expectValidation('aaa', 'pattern', '[a-z]{1,2}').not.to.be(true);\n    expectValidation('aa',  'pattern', '^[a-z]{2}$').to.be(true);\n  });\n  it('should have a pattern validator that extends the standard for form /pattern/flag', () => {\n    expectValidation('zAz', 'pattern', '/a/i').to.be(true);\n  });\n  it('should have a length validator', () => {\n    expectValidation('foobar',    'length', [3, 9]).to.be(true);\n    expectValidation('foo',       'length', [4, 9]).not.to.be(true);\n    expectValidation('foobarbaz', 'length', [3, 8]).not.to.be(true);\n  });\n  it('should have a minlength validator', () => {\n    expectValidation('foo', 'minlength', 3).to.be(true);\n    expectValidation('fo',  'minlength', 3).not.to.be(true);\n    $('body').append('<input type=\"text\" id=\"element\" value=\"foo\" data-parsley-minlength=\"2\" />');\n    expect($('#element').parsley().isValid()).to.be(true);\n  });\n  it('should have a maxlength validator', () => {\n    expectValidation('foo',    'maxlength', 3).to.be(true);\n    expectValidation('foobar', 'maxlength', 3).not.to.be(true);\n    $('body').append('<input type=\"text\" id=\"element\" value=\"foo\" data-parsley-maxlength=\"10\" />');\n    expect($('#element').parsley().isValid()).to.be(true);\n  });\n  it('should have a check validator', () => {\n    expectValidation(['foo', 'bar', 'baz'],               'check', [3, 5]).to.be(true);\n    expectValidation(['foo', 'bar', 'baz', 'qux', 'bux'], 'check', [3, 4]).not.to.be(true);\n    expectValidation(['foo', 'bar'],                      'check', [3, 5]).not.to.be(true);\n  });\n  it('should have a mincheck validator', () => {\n    expectValidation(['foo', 'bar', 'baz'], 'mincheck', 3).to.be(true);\n    expectValidation(['foo', 'bar'],        'mincheck', 3).not.to.be(true);\n  });\n  it('should have a maxcheck validator', () => {\n    expectValidation(['foo', 'bar', 'baz'],        'maxcheck', 3).to.be(true);\n    expectValidation(['foo', 'bar', 'baz', 'qux'], 'maxcheck', 3).not.to.be(true);\n  });\n  it('should have an equalto validator', () => {\n    expectValidation('',    'equalto', 'foo').to.be(true);\n    expectValidation('bar', 'equalto', 'foo').not.to.be(true);\n    expectValidation('foo', 'equalto', 'foo').to.be(true);\n    $('body').append('<input type=\"text\" id=\"element\" data-parsley-equalto=\"#equalto\" required /><input type=\"text\" id=\"equalto\" value=\"foo\" />');\n    expect($('#element').psly().isValid()).to.be(false);\n    $('#element').val('fo');\n    expect($('#element').psly().isValid()).to.be(false);\n    $('#element').val('foo');\n    expect($('#element').psly().isValid()).to.be(true);\n    $('#equalto').remove();\n  });\n  it('should have a euvatin validator', () => {\n    expectValidation('foo', 'euvatin').not.to.be(true);\n    expectValidation('AA1',   'euvatin').not.to.be(true);\n    expectValidation('AA12',   'euvatin').to.be(true);\n    expectValidation('AA12-34',  'euvatin').to.be(true);\n    expectValidation('AA12 3X',  'euvatin').to.be(true);\n    expectValidation('AA12.3X',  'euvatin').not.to.be(true);\n  });\n  it('should handle proper error message for validators', () => {\n    expect(validatorRegistry.getErrorMessage({name: 'length', requirements: [3, 6]})).to.be('This value length is invalid. It should be between 3 and 6 characters long.');\n    expect(validatorRegistry.getErrorMessage({name: 'notexisting'})).to.be('This value seems to be invalid.');\n  });\n  it('should handle proper error message for validators in various languages', () => {\n    validatorRegistry.setLocale('fr');\n    expect(validatorRegistry.getErrorMessage({name: 'length', requirements: [3, 6]})).to.be('Cette valeur doit contenir entre 3 et 6 caractères.');\n    expect(validatorRegistry.getErrorMessage({name: 'notexisting'})).to.be('Cette valeur semble non valide.');\n  });\n\n  it('should not break for an incomplete language', () => {\n    validatorRegistry.addCatalog('klingon', {}, true);\n    expect(validatorRegistry.getErrorMessage({name: 'type', requirements: 'email'})).to.be('This value seems to be invalid.');\n    expect(validatorRegistry.getErrorMessage({name: 'length', requirements: [3, 6]})).to.be('This value seems to be invalid.');\n  });\n\n  afterEach(() => {\n    $('#element').remove();\n  });\n\n  it('should warn if a custom validator has a reserved name', () => {\n    $.extend(true, Parsley.options, {\n      validators: {\n        excluded: {fn: () => {}, priority: 42},\n      }\n    });\n\n    expectWarning(() => {\n      var validatorRegistry = new ValidatorRegistry(Parsley.options.validators);\n    });\n    delete Parsley.options.validators.excluded;\n  });\n\n  it('should warn when adding an already defined validator', () => {\n    validatorRegistry.addValidator('foo', $.noop);\n    expectWarning(() => {\n      validatorRegistry.addValidator('foo', $.noop);\n    });\n    validatorRegistry.removeValidator('foo');\n  });\n\n  it('should warn when updating or deleting a custom validator not already defined', () => {\n    expectWarning(() => {\n      validatorRegistry.updateValidator('foo', () => {});\n    });\n    validatorRegistry.removeValidator('foo');\n  });\n\n  it('should warn when updating or deleting a custom validator not already defined', () => {\n    expectWarning(() => {\n      validatorRegistry.removeValidator('foo');\n    });\n  });\n\n  it('should provide deprecated access through Validator for compatibility', () => {\n    window.Parsley.formatMessage('foo', 'bar');\n    expectWarning(() => {\n      window.ParsleyValidator.formatMessage('foo', 'bar');\n    });\n  });\n\n  it('should provide two ways to add error messages', () => {\n    window.Parsley.addValidator('testMessage', {\n      validateString: $.noop,\n      messages: {\n        en: 'Not good at all',\n        fr: 'Très nul'\n      }\n    });\n    window.Parsley.addMessage('es', 'testMessage', 'Muy malo');\n    expect(window.Parsley.getErrorMessage({name: 'testMessage'})).to.eql('Not good at all');\n    window.Parsley.setLocale('fr');\n    expect(window.Parsley.getErrorMessage({name: 'testMessage'})).to.eql('Très nul');\n    window.Parsley.setLocale('es');\n    expect(window.Parsley.getErrorMessage({name: 'testMessage'})).to.eql('Muy malo');\n    window.Parsley.setLocale('en');\n  });\n\n  it('can return the existence of a validator', () => {\n    expect(window.Parsley.hasValidator('required')).to.be(true);\n    expect(window.Parsley.hasValidator('deriuqer')).to.be(false);\n  });\n\n});\n"
  },
  {
    "path": "tools/mocha_options.js",
    "content": "export default {\n  globals: [\n    \"$\",\n    \"stub\",\n    \"spy\",\n    \"expect\",\n    \"expectWarning\",\n  ],\n};\n"
  },
  {
    "path": "tools/rollup_options.js",
    "content": "import babel from 'rollup-plugin-babel';\nimport replace from 'rollup-plugin-replace';\nimport manifest  from '../package.json';\nimport fs  from 'fs';\nimport moment  from 'moment';\n\nconst project = 'parsley';\n\nconst banner = fs.readFileSync('src/header.js', 'utf8')\n  .replace('VERSION', manifest.version)\n  .replace('NOW', moment().format('ddd, MMM Do YYYY, h:mm a'));\n\nfunction rollupOptions({\n  input=`./src/${project}.js`,\n  suffix='',\n  file=`./dist/${project}${suffix}.js`,\n  extraPlugins=[],\n}) {\n  return {\n    input,\n    external: ['jquery'],\n    plugins: [\n      replace({ VERSION: manifest.version }),\n      babel(),\n      ...extraPlugins\n    ],\n    output: {\n      file,\n      format: 'umd',\n      banner: banner,\n      name: project,\n      sourcemap: true,\n      globals: { jquery: 'jQuery' },\n      interop: false,\n    }\n  };\n}\n\nexport {rollupOptions};\n"
  }
]