[
  {
    "path": ".babelrc",
    "content": "{\n  \"presets\": [\"es2015\"],\n  \"plugins\": [\"babel-plugin-add-module-exports\"]\n}"
  },
  {
    "path": ".codeclimate.yml",
    "content": "engines:\n  eslint:\n    enabled: true\n  fixme:\n    enabled: true\nratings:\n  paths:\n  - \"src/**/*.js\"\nexclude_paths:\n- test/**/*\n- demo/**/*\n- node_modules/**/*\n"
  },
  {
    "path": ".editorconfig",
    "content": "# editorconfig.org\nroot = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n\n[*.md]\ntrim_trailing_whitespace = false\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: [needim]\npatreon: needim\nko_fi: needim\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "content": "> **_Noty version_**: ..... \n> **_Browser_**: .....\n> **_OS_**: .....\n> **_jsFiddle link (if available)_**: .....\n----------\n"
  },
  {
    "path": ".gitignore",
    "content": "child/\n\n.DS_Store\n\n.idea/\n\nnode_modules/\n_SpecRunner.html\n/.vscode/\nyarn.lock\n.nyc_output\ncoverage\nmanifest.json\nservice-worker.js\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: node_js\nnode_js:\n  - \"7\"\nbranches:\n  only:\n    - master\n"
  },
  {
    "path": "Gruntfile.js",
    "content": "module.exports = function (grunt) {\n  'use strict'\n\n  grunt.initConfig({\n    pkg: grunt.file.readJSON('package.json'),\n    usebanner: {\n      taskName: {\n        options: {\n          position: 'top',\n          banner: '/* \\n  @package NOTY - Dependency-free notification library \\n' +\n          '  @version version: <%= pkg.version %> \\n' +\n          '  @contributors https://github.com/needim/noty/graphs/contributors \\n' +\n          '  @documentation Examples and Documentation - https://ned.im/noty \\n' +\n          '  @license Licensed under the MIT licenses: http://www.opensource.org/licenses/mit-license.php \\n*/\\n',\n          linebreak: true\n        },\n        files: {\n          src: ['lib/noty.js', 'lib/noty.min.js']\n        }\n      }\n    },\n    qunit: {\n      options: {\n        inject: 'test/unit/phantom.js'\n      },\n      files: 'test/index.html'\n    },\n    connect: {\n      server: {\n        options: {\n          port: 3000,\n          base: '.'\n        }\n      }\n    },\n    sass: {\n      dist: {\n        options: {\n          style: 'expanded',\n          sourcemap: 'file'\n        },\n        files: [{\n          expand: true,\n          cwd: 'src/themes',\n          src: ['*.scss'],\n          dest: 'lib/themes',\n          ext: '.css'\n        }]\n      }\n    },\n    curl: {\n      builds: {\n        src: {\n          url: 'https://www.browserstack.com/automate/builds.json',\n          auth: {\n            user: process.env.BROWSERSTACK_USERNAME,\n            pass: process.env.BROWSERSTACK_KEY\n          }\n        },\n        dest: 'browserstack-builds.json'\n      },\n      session: {\n        src: {\n          url: 'https://www.browserstack.com/automate/builds/' + grunt.file.readJSON('browserstack-builds.json')[0]['automation_build']['hashed_id'] + '/sessions.json',\n          auth: {\n            user: process.env.BROWSERSTACK_USERNAME,\n            pass: process.env.BROWSERSTACK_KEY\n          }\n        },\n        dest: 'browserstack-session.json'\n      }\n    }\n  })\n\n  require('load-grunt-tasks')(grunt)\n\n  grunt.registerTask('bs-create-md', function () {\n    const session = grunt.file.readJSON('browserstack-session.json')\n    const file = 'docs/browsers.md'\n    let contents = '!> This data is provided by BrowserStack Automate \\n\\n\\n'\n\n    contents += `#### ${session[0].automation_session.build_name} \\n\\n`\n    contents += '| OS | Browser | Result | Details | \\n'\n    contents += '| --- | --- | --- | --- | \\n'\n\n    session.forEach(function (s) {\n      grunt.log.writeln(s.automation_session.hashed_id)\n      contents += `| ${s.automation_session.os} ${s.automation_session.os_version} | ${s.automation_session.browser} ${s.automation_session.browser_version}  | ${s.automation_session.status} | [view](${s.automation_session.public_url}) |`\n      contents += '\\n'\n    })\n\n    grunt.file.write(file, contents)\n  })\n\n  grunt.registerTask('browserstack-md', ['curl:builds', 'curl:session', 'bs-create-md'])\n  grunt.registerTask('banner', 'usebanner')\n  grunt.registerTask('test', 'qunit')\n  grunt.registerTask('saucelabs', ['qunit', 'connect', 'saucelabs-qunit'])\n  grunt.registerTask('default', ['test'])\n  grunt.registerTask('themes', ['sass'])\n}\n"
  },
  {
    "path": "LICENSE.txt",
    "content": "Copyright (c) 2012 Nedim Arabacı\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."
  },
  {
    "path": "README.markdown",
    "content": "# DEPRECATED\n\n<p>\n   This repository is no longer supported, please consider using alternatives.\n</p>\n\n[![No Maintenance Intended](http://unmaintained.tech/badge.svg)](http://unmaintained.tech/)\n\n<p align=\"center\">\n  <a href=\"https://ned.im/noty?ref=readme\">\n    <img src=\"https://ned.im/noty/_media/noty-v3-logo.png\" width=200 height=70>\n  </a>\n\n  <p align=\"center\">\n    Dependency-free notification library.\n    <br>\n    <a href=\"https://ned.im/noty\"><strong>Documentation &raquo;</strong></a>\n  </p>\n\n  <p align=\"center\">\n    <a href=\"https://github.com/needim/noty/releases\"><img src=\"https://img.shields.io/github/release/needim/noty.svg\" alt=\"GitHub release\"></a>\n    <a href=\"https://bower.io/\"><img src=\"https://img.shields.io/bower/v/noty.svg\" alt=\"Bower version\"></a>\n    <a href=\"https://www.npmjs.com/package/noty\"><img src=\"https://img.shields.io/npm/v/noty.svg\" alt=\"NPM version\"></a>\n    <a href=\"https://packagist.org/packages/needim/noty\"><img src=\"https://img.shields.io/packagist/v/needim/noty.svg\" alt=\"Packagist version\"></a>\n    <a href=\"https://cdnjs.com/libraries/noty\"><img src=\"https://img.shields.io/cdnjs/v/noty.svg\" alt=\"CDNJS version\"></a>\n    <br>\n    <img src=\"https://img.shields.io/david/needim/noty.svg\" alt=\"Dependencies\">\n    <img src=\"https://img.shields.io/david/dev/needim/noty.svg\" alt=\"Dev Dependencies\">\n    <br>\n    <a href=\"https://travis-ci.org/needim/noty\"><img src=\"https://img.shields.io/travis/needim/noty/master.svg\" alt=\"Travis\"></a>\n    <a href=\"https://www.npmjs.com/package/noty\"><img src=\"https://img.shields.io/npm/dm/noty.svg?label=npm%20downloads\" alt=\"NPM Downloads\"></a>\n    <a href=\"https://github.com/needim/noty/graphs/contributors\"><img src=\"https://img.shields.io/github/contributors/needim/noty.svg\" alt=\"Contributors\"></a>\n  </p>\n</p>\n\n<br>\n\n## Hi\n\n**NOTY** is a notification library that makes it easy to create **alert** - **success** - **error** - **warning** - **information** - **confirmation** messages as an alternative the standard alert dialog.\n\nThe notifications can be positioned at the;\n**top** - **topLeft** - **topCenter** - **topRight** - **center** - **centerLeft** - **centerRight** - **bottom** - **bottomLeft** - **bottomCenter** - **bottomRight**\n\nThere are lots of other options in the API to customise the text, animation, buttons and much more.\n\nIt also has various callbacks for the buttons, opening closing the notifications and queue control.\n\n---\n\n### Features\n\n- [x] Dependency-free\n- [x] Web Push Notifications with Service Worker support\n- [x] UMD\n- [x] Named queue system\n- [x] Has 11 layouts, 5 notification styles, 5+ themes\n- [x] Custom container (inline notifications)\n- [x] Confirm notifications\n- [x] TTL\n- [x] Progress bar indicator for timed notifications\n- [x] Supports css animations, [animate.css](https://github.com/daneden/animate.css), [mojs](https://github.com/legomushroom/mojs), [bounce.js](https://github.com/tictail/bounce.js), [velocity](https://github.com/julianshapiro/velocity) and other animation libraries\n- [x] 2 close options: click, button\n- [x] API & Callbacks\n- [x] Custom templating\n- [x] Document visibility control (blur, focus)\n\n### Documentation\n\nDocumentation and examples are here: <http://ned.im/noty>\n\n---\n\n##### Basic Usage\n\n```js\nimport Noty from \"noty\";\n\nnew Noty({\n  text: \"Notification text\"\n}).show();\n\n// or\n\nconst Noty = require(\"noty\");\n\nnew Noty({\n  text: \"Notification text\"\n}).show();\n```\n\n##### Development\n\n```console\n$ npm run dev\n$ npm test\n$ npm run build\n$ npm run browserstack\n$ npm run serve-docs\n```\n\n##### Development environment\n\n- [x] Standard\n- [x] Prettier\n- [x] ES6 & Babel & Webpack\n- [x] Sass\n- [x] Autoprefixer\n- [x] QUnit\n- [x] BrowserStack\n- [x] Pre-commit tests\n- [x] Travis CI\n\n[![JavaScript Style Guide](https://cdn.rawgit.com/feross/standard/master/badge.svg)](https://github.com/feross/standard)\n"
  },
  {
    "path": "bower.json",
    "content": "{\n  \"name\": \"noty\",\n  \"description\": \"Noty - Notification library\",\n  \"license\": \"MIT\",\n  \"homepage\": \"http://ned.im/noty\",\n  \"main\": \"lib/noty.js\",\n  \"keywords\": [\n    \"noty\",\n    \"notification\",\n    \"alert\",\n    \"confirmation\"\n  ],\n  \"ignore\": [\n    \"node_modules\",\n    \"tests\"\n  ],\n  \"authors\": [\n    \"Nedim Arabacı <nedimarabaci@gmail.com>\"\n  ]\n}\n"
  },
  {
    "path": "browserstack-builds.json",
    "content": "[{\"automation_build\":{\"name\":\"Local run  2017 07 27T17:31:03.314Z\",\"duration\":null,\"status\":\"done\",\"hashed_id\":\"7d2483377687d162b9bc20fcaf3cb1bfb8f5bec0\"}},{\"automation_build\":{\"name\":\"Local run  2017 07 27T16:47:55.918Z\",\"duration\":null,\"status\":\"done\",\"hashed_id\":\"31f78fc1bfbe5c32506ca9c3acd06182f45314ed\"}},{\"automation_build\":{\"name\":\"Local run  2017 07 27T16:41:51.361Z\",\"duration\":null,\"status\":\"done\",\"hashed_id\":\"7bba6ab979ebd503c9cdccaf58d385f2b878fbce\"}},{\"automation_build\":{\"name\":\"Local run  2017 07 27T16:38:09.816Z\",\"duration\":null,\"status\":\"done\",\"hashed_id\":\"3a9b655e94c3a6a9e755036df49e9896c14b6f9c\"}},{\"automation_build\":{\"name\":\"Local run  2017 07 27T16:37:04.214Z\",\"duration\":null,\"status\":\"done\",\"hashed_id\":\"c66c5b2a11cc1ee6644d1fa2e9f6eff7a6a0cbec\"}},{\"automation_build\":{\"name\":\"Local run  2017 07 27T15:24:14.586Z\",\"duration\":null,\"status\":\"done\",\"hashed_id\":\"715319d73cd4103da0a40c2a06b7a66b1bfc6d6d\"}}]"
  },
  {
    "path": "browserstack-session.json",
    "content": "[\n  {\n    \"automation_session\": {\n      \"name\": null,\n      \"duration\": 48,\n      \"os\": \"Windows\",\n      \"os_version\": \"10\",\n      \"browser_version\": \"46.0\",\n      \"browser\": \"opera\",\n      \"device\": null,\n      \"status\": \"done\",\n      \"hashed_id\": \"c259644238854e4628696d8cfea9482b96a78a07\",\n      \"reason\": null,\n      \"build_name\": \"Local run  2017 07 27T17:31:03.314Z\",\n      \"project_name\": \"noty\",\n      \"logs\": \"https://www.browserstack.com/automate/builds/7d2483377687d162b9bc20fcaf3cb1bfb8f5bec0/sessions/c259644238854e4628696d8cfea9482b96a78a07/logs\",\n      \"browser_url\": \"https://www.browserstack.com/automate/builds/7d2483377687d162b9bc20fcaf3cb1bfb8f5bec0/sessions/c259644238854e4628696d8cfea9482b96a78a07\",\n      \"public_url\": \"https://www.browserstack.com/automate/builds/7d2483377687d162b9bc20fcaf3cb1bfb8f5bec0/sessions/c259644238854e4628696d8cfea9482b96a78a07?auth_token=f87c9cb1ab62bb7b85af973cc2a1b03bd9d35fbc6a9e38b716fe38b01c4c3480\",\n      \"video_url\": \"https://www.browserstack.com/s3-upload/bs-video-logs-euw/s3-eu-west-1/c259644238854e4628696d8cfea9482b96a78a07/video-c259644238854e4628696d8cfea9482b96a78a07.mp4?AWSAccessKeyId=AKIAIN2TCEEW2SVRV5JA\\u0026Expires=1509231864\\u0026Signature=L9qIjHCc4zQU%2BuRTWn3EFgmyHhQ%3D\\u0026response-content-type=video%2Fmp4\",\n      \"browser_console_logs_url\": \"https://www.browserstack.com/s3-upload/bs-selenium-logs-euw/s3-eu-west-1/c259644238854e4628696d8cfea9482b96a78a07/c259644238854e4628696d8cfea9482b96a78a07-console-logs.txt?AWSAccessKeyId=AKIAIN2TCEEW2SVRV5JA\\u0026Expires=1509231864\\u0026Signature=IkOSopxHZ4nSX6QGOtkxYa%2FSp5Y%3D\\u0026response-content-type=text%2Fplain\",\n      \"har_logs_url\": \"https://www.browserstack.com/s3-upload/bs-video-logs-euw/s3-eu-west-1/c259644238854e4628696d8cfea9482b96a78a07/c259644238854e4628696d8cfea9482b96a78a07-har-logs.txt?AWSAccessKeyId=AKIAIN2TCEEW2SVRV5JA\\u0026Expires=1509231864\\u0026Signature=AW4U9XEaaZxPLERvua8%2FLQlnvY0%3D\"\n    }\n  },\n  {\n    \"automation_session\": {\n      \"name\": null,\n      \"duration\": 54,\n      \"os\": \"Windows\",\n      \"os_version\": \"10\",\n      \"browser_version\": \"59.0\",\n      \"browser\": \"chrome\",\n      \"device\": null,\n      \"status\": \"done\",\n      \"hashed_id\": \"dc87007925cb5729ac8aa2a6136aab1fb6808cc1\",\n      \"reason\": null,\n      \"build_name\": \"Local run  2017 07 27T17:31:03.314Z\",\n      \"project_name\": \"noty\",\n      \"logs\": \"https://www.browserstack.com/automate/builds/7d2483377687d162b9bc20fcaf3cb1bfb8f5bec0/sessions/dc87007925cb5729ac8aa2a6136aab1fb6808cc1/logs\",\n      \"browser_url\": \"https://www.browserstack.com/automate/builds/7d2483377687d162b9bc20fcaf3cb1bfb8f5bec0/sessions/dc87007925cb5729ac8aa2a6136aab1fb6808cc1\",\n      \"public_url\": \"https://www.browserstack.com/automate/builds/7d2483377687d162b9bc20fcaf3cb1bfb8f5bec0/sessions/dc87007925cb5729ac8aa2a6136aab1fb6808cc1?auth_token=04d2d0b39bcdbb76153ee28e3acf67099ecbd9a093c6176df9ad892c083663c6\",\n      \"video_url\": \"https://www.browserstack.com/s3-upload/bs-video-logs-euw/s3-eu-west-1/dc87007925cb5729ac8aa2a6136aab1fb6808cc1/video-dc87007925cb5729ac8aa2a6136aab1fb6808cc1.mp4?AWSAccessKeyId=AKIAIN2TCEEW2SVRV5JA\\u0026Expires=1509231864\\u0026Signature=A6DNc457B5vqFNxOvP6B%2F0tCYZk%3D\\u0026response-content-type=video%2Fmp4\",\n      \"browser_console_logs_url\": \"https://www.browserstack.com/s3-upload/bs-selenium-logs-euw/s3-eu-west-1/dc87007925cb5729ac8aa2a6136aab1fb6808cc1/dc87007925cb5729ac8aa2a6136aab1fb6808cc1-console-logs.txt?AWSAccessKeyId=AKIAIN2TCEEW2SVRV5JA\\u0026Expires=1509231864\\u0026Signature=yz1BugMpwOrl2h9i84A6BQtr7Cs%3D\\u0026response-content-type=text%2Fplain\",\n      \"har_logs_url\": \"https://www.browserstack.com/s3-upload/bs-video-logs-euw/s3-eu-west-1/dc87007925cb5729ac8aa2a6136aab1fb6808cc1/dc87007925cb5729ac8aa2a6136aab1fb6808cc1-har-logs.txt?AWSAccessKeyId=AKIAIN2TCEEW2SVRV5JA\\u0026Expires=1509231864\\u0026Signature=kaUFdYGXBcjY5ZxokYZ7cYjhGpk%3D\"\n    }\n  },\n  {\n    \"automation_session\": {\n      \"name\": null,\n      \"duration\": 45,\n      \"os\": \"OS X\",\n      \"os_version\": \"El Capitan\",\n      \"browser_version\": \"9.1\",\n      \"browser\": \"safari\",\n      \"device\": null,\n      \"status\": \"done\",\n      \"hashed_id\": \"0c60211cab5840456ac824443e3be99b195597b5\",\n      \"reason\": null,\n      \"build_name\": \"Local run  2017 07 27T17:31:03.314Z\",\n      \"project_name\": \"noty\",\n      \"logs\": \"https://www.browserstack.com/automate/builds/7d2483377687d162b9bc20fcaf3cb1bfb8f5bec0/sessions/0c60211cab5840456ac824443e3be99b195597b5/logs\",\n      \"browser_url\": \"https://www.browserstack.com/automate/builds/7d2483377687d162b9bc20fcaf3cb1bfb8f5bec0/sessions/0c60211cab5840456ac824443e3be99b195597b5\",\n      \"public_url\": \"https://www.browserstack.com/automate/builds/7d2483377687d162b9bc20fcaf3cb1bfb8f5bec0/sessions/0c60211cab5840456ac824443e3be99b195597b5?auth_token=9daf8b81531fe858108d9d76317b171c7dca69dee3ac3a25e065810fd353b837\",\n      \"video_url\": \"https://www.browserstack.com/s3-upload/bs-video-logs-euw/s3-eu-west-1/0c60211cab5840456ac824443e3be99b195597b5/video-0c60211cab5840456ac824443e3be99b195597b5.mp4?AWSAccessKeyId=AKIAIN2TCEEW2SVRV5JA\\u0026Expires=1509231864\\u0026Signature=p32SrCXGkJ15m79Gvxq86P1tzXU%3D\\u0026response-content-type=video%2Fmp4\",\n      \"browser_console_logs_url\": \"https://www.browserstack.com/s3-upload/bs-selenium-logs-euw/s3-eu-west-1/0c60211cab5840456ac824443e3be99b195597b5/0c60211cab5840456ac824443e3be99b195597b5-console-logs.txt?AWSAccessKeyId=AKIAIN2TCEEW2SVRV5JA\\u0026Expires=1509231864\\u0026Signature=E6AhIFzy%2FHX5QD6%2BUd1T8WPWhXY%3D\\u0026response-content-type=text%2Fplain\",\n      \"har_logs_url\": \"https://www.browserstack.com/s3-upload/bs-video-logs-euw/s3-eu-west-1/0c60211cab5840456ac824443e3be99b195597b5/0c60211cab5840456ac824443e3be99b195597b5-har-logs.txt?AWSAccessKeyId=AKIAIN2TCEEW2SVRV5JA\\u0026Expires=1509231864\\u0026Signature=CIaBXl9nhoeip5EEktV5Rqrg7vI%3D\"\n    }\n  },\n  {\n    \"automation_session\": {\n      \"name\": null,\n      \"duration\": 50,\n      \"os\": \"Windows\",\n      \"os_version\": \"10\",\n      \"browser_version\": \"54.0\",\n      \"browser\": \"firefox\",\n      \"device\": null,\n      \"status\": \"done\",\n      \"hashed_id\": \"336cf3a8db5363d7683f01392d4d328fce18838a\",\n      \"reason\": null,\n      \"build_name\": \"Local run  2017 07 27T17:31:03.314Z\",\n      \"project_name\": \"noty\",\n      \"logs\": \"https://www.browserstack.com/automate/builds/7d2483377687d162b9bc20fcaf3cb1bfb8f5bec0/sessions/336cf3a8db5363d7683f01392d4d328fce18838a/logs\",\n      \"browser_url\": \"https://www.browserstack.com/automate/builds/7d2483377687d162b9bc20fcaf3cb1bfb8f5bec0/sessions/336cf3a8db5363d7683f01392d4d328fce18838a\",\n      \"public_url\": \"https://www.browserstack.com/automate/builds/7d2483377687d162b9bc20fcaf3cb1bfb8f5bec0/sessions/336cf3a8db5363d7683f01392d4d328fce18838a?auth_token=e93ad65f77003c53f0e7392f2bbd38d56811d1d6ce4e1f9f098494caa240ef21\",\n      \"video_url\": \"https://www.browserstack.com/s3-upload/bs-video-logs-euw/s3-eu-west-1/336cf3a8db5363d7683f01392d4d328fce18838a/video-336cf3a8db5363d7683f01392d4d328fce18838a.mp4?AWSAccessKeyId=AKIAIN2TCEEW2SVRV5JA\\u0026Expires=1509231864\\u0026Signature=rJTPrYODLubpcgwCqZsW2mXo0JY%3D\\u0026response-content-type=video%2Fmp4\",\n      \"browser_console_logs_url\": \"https://www.browserstack.com/s3-upload/bs-selenium-logs-euw/s3-eu-west-1/336cf3a8db5363d7683f01392d4d328fce18838a/336cf3a8db5363d7683f01392d4d328fce18838a-console-logs.txt?AWSAccessKeyId=AKIAIN2TCEEW2SVRV5JA\\u0026Expires=1509231864\\u0026Signature=FQCd3lZU3tixlx9j0EiqqjAUnYY%3D\\u0026response-content-type=text%2Fplain\",\n      \"har_logs_url\": \"https://www.browserstack.com/s3-upload/bs-video-logs-euw/s3-eu-west-1/336cf3a8db5363d7683f01392d4d328fce18838a/336cf3a8db5363d7683f01392d4d328fce18838a-har-logs.txt?AWSAccessKeyId=AKIAIN2TCEEW2SVRV5JA\\u0026Expires=1509231864\\u0026Signature=44zYIcazKHQzvD2F%2BEmhUFjwmHg%3D\"\n    }\n  },\n  {\n    \"automation_session\": {\n      \"name\": null,\n      \"duration\": 47,\n      \"os\": \"Windows\",\n      \"os_version\": \"10\",\n      \"browser_version\": \"15.0\",\n      \"browser\": \"edge\",\n      \"device\": null,\n      \"status\": \"done\",\n      \"hashed_id\": \"a2bb1f252f478c5b5cd4fdc06158830305120ea2\",\n      \"reason\": null,\n      \"build_name\": \"Local run  2017 07 27T17:31:03.314Z\",\n      \"project_name\": \"noty\",\n      \"logs\": \"https://www.browserstack.com/automate/builds/7d2483377687d162b9bc20fcaf3cb1bfb8f5bec0/sessions/a2bb1f252f478c5b5cd4fdc06158830305120ea2/logs\",\n      \"browser_url\": \"https://www.browserstack.com/automate/builds/7d2483377687d162b9bc20fcaf3cb1bfb8f5bec0/sessions/a2bb1f252f478c5b5cd4fdc06158830305120ea2\",\n      \"public_url\": \"https://www.browserstack.com/automate/builds/7d2483377687d162b9bc20fcaf3cb1bfb8f5bec0/sessions/a2bb1f252f478c5b5cd4fdc06158830305120ea2?auth_token=c75ad2904602c489145eaf2ce18b8f5723a843cb6c8dcc62a60982dc6109ef27\",\n      \"video_url\": \"https://www.browserstack.com/s3-upload/bs-video-logs-euw/s3-eu-west-1/a2bb1f252f478c5b5cd4fdc06158830305120ea2/video-a2bb1f252f478c5b5cd4fdc06158830305120ea2.mp4?AWSAccessKeyId=AKIAIN2TCEEW2SVRV5JA\\u0026Expires=1509231864\\u0026Signature=7Jf1rpd9%2FUvHyI3wSIwdYBsD1JE%3D\\u0026response-content-type=video%2Fmp4\",\n      \"browser_console_logs_url\": \"https://www.browserstack.com/s3-upload/bs-selenium-logs-euw/s3-eu-west-1/a2bb1f252f478c5b5cd4fdc06158830305120ea2/a2bb1f252f478c5b5cd4fdc06158830305120ea2-console-logs.txt?AWSAccessKeyId=AKIAIN2TCEEW2SVRV5JA\\u0026Expires=1509231864\\u0026Signature=4soYSJ2wA1By7Oohu8047VYYE30%3D\\u0026response-content-type=text%2Fplain\",\n      \"har_logs_url\": \"https://www.browserstack.com/s3-upload/bs-video-logs-euw/s3-eu-west-1/a2bb1f252f478c5b5cd4fdc06158830305120ea2/a2bb1f252f478c5b5cd4fdc06158830305120ea2-har-logs.txt?AWSAccessKeyId=AKIAIN2TCEEW2SVRV5JA\\u0026Expires=1509231864\\u0026Signature=a%2BVdRuZNZPDx%2BqOg90n3WzIP8lU%3D\"\n    }\n  },\n  {\n    \"automation_session\": {\n      \"name\": null,\n      \"duration\": 30,\n      \"os\": \"Windows\",\n      \"os_version\": \"8\",\n      \"browser_version\": \"10.0\",\n      \"browser\": \"ie\",\n      \"device\": null,\n      \"status\": \"done\",\n      \"hashed_id\": \"d85b895f81c51f9cd5c72c225c9f155b331902c6\",\n      \"reason\": null,\n      \"build_name\": \"Local run  2017 07 27T17:31:03.314Z\",\n      \"project_name\": \"noty\",\n      \"logs\": \"https://www.browserstack.com/automate/builds/7d2483377687d162b9bc20fcaf3cb1bfb8f5bec0/sessions/d85b895f81c51f9cd5c72c225c9f155b331902c6/logs\",\n      \"browser_url\": \"https://www.browserstack.com/automate/builds/7d2483377687d162b9bc20fcaf3cb1bfb8f5bec0/sessions/d85b895f81c51f9cd5c72c225c9f155b331902c6\",\n      \"public_url\": \"https://www.browserstack.com/automate/builds/7d2483377687d162b9bc20fcaf3cb1bfb8f5bec0/sessions/d85b895f81c51f9cd5c72c225c9f155b331902c6?auth_token=bd85550ce628686d6485062a32cc869abf2dcb7a2b9862b3884ebc7d4283d344\",\n      \"video_url\": \"https://www.browserstack.com/s3-upload/bs-video-logs-euw/s3-eu-west-1/d85b895f81c51f9cd5c72c225c9f155b331902c6/video-d85b895f81c51f9cd5c72c225c9f155b331902c6.mp4?AWSAccessKeyId=AKIAIN2TCEEW2SVRV5JA\\u0026Expires=1509231864\\u0026Signature=TZYrsY8GWzdcXP0IrAvQ2LisTQQ%3D\\u0026response-content-type=video%2Fmp4\",\n      \"browser_console_logs_url\": \"https://www.browserstack.com/s3-upload/bs-selenium-logs-euw/s3-eu-west-1/d85b895f81c51f9cd5c72c225c9f155b331902c6/d85b895f81c51f9cd5c72c225c9f155b331902c6-console-logs.txt?AWSAccessKeyId=AKIAIN2TCEEW2SVRV5JA\\u0026Expires=1509231864\\u0026Signature=yQkCo8qp1BkJU5tXN%2FgEZaGjTzU%3D\\u0026response-content-type=text%2Fplain\",\n      \"har_logs_url\": \"https://www.browserstack.com/s3-upload/bs-video-logs-euw/s3-eu-west-1/d85b895f81c51f9cd5c72c225c9f155b331902c6/d85b895f81c51f9cd5c72c225c9f155b331902c6-har-logs.txt?AWSAccessKeyId=AKIAIN2TCEEW2SVRV5JA\\u0026Expires=1509231864\\u0026Signature=LIp46ukF%2FZunjjONYzweREZP73s%3D\"\n    }\n  }\n]\n"
  },
  {
    "path": "browserstack.json",
    "content": "{\n  \"test_framework\": \"qunit\",\n  \"test_path\": \"test/index.html\",\n  \"browsers\": [\n    {\n      \"browser\": \"ie\",\n      \"browser_version\": \"10\",\n      \"os\": \"Windows\",\n      \"os_version\": \"8\"\n    },\n    {\n      \"browser\": \"edge\",\n      \"browser_version\": \"latest\",\n      \"os\": \"Windows\",\n      \"os_version\": \"10\"\n    },\n    {\n      \"browser\": \"firefox\",\n      \"browser_version\": \"latest\",\n      \"os\": \"Windows\",\n      \"os_version\": \"10\"\n    },\n    {\n      \"browser\": \"chrome\",\n      \"browser_version\": \"latest\",\n      \"os\": \"Windows\",\n      \"os_version\": \"10\"\n    },\n    {\n      \"browser\": \"opera\",\n      \"browser_version\": \"latest\",\n      \"os\": \"Windows\",\n      \"os_version\": \"10\"\n    },\n    {\n      \"browser\": \"safari\",\n      \"browser_version\": \"latest\",\n      \"os\": \"OS X\",\n      \"os_version\": \"El Capitan\"\n    }\n  ]\n}\n"
  },
  {
    "path": "composer.json",
    "content": "{\n\t\"name\": \"needim/noty\",\n\t\"description\": \"Noty is a library that makes it easy to create alert - success - error - warning - information - confirmation messages as an alternative the standard alert dialog.\",\n\t\"type\": \"library\",\n\t\"license\": \"MIT\",\n\t\"homepage\": \"http://ned.im/noty\",\n\t\"keywords\": [\n\t\t\"noty\",\n\t\t\"notification\"\n\t],\n\t\"authors\": [\n\t\t{\n\t\t\t\"name\": \"Nedim Arabaci\",\n\t\t\t\"homepage\": \"http://ned.im\",\n\t\t\t\"role\": \"Developer\"\n\t\t}\n\t],\n\t\"minimum-stability\": \"dev\"\n}\n"
  },
  {
    "path": "demo/animate.css",
    "content": "@charset \"UTF-8\";\n\n/*!\n * animate.css -http://daneden.me/animate\n * Version - 3.5.1\n * Licensed under the MIT license - http://opensource.org/licenses/MIT\n *\n * Copyright (c) 2016 Daniel Eden\n */\n\n.animated {\n  -webkit-animation-duration: 1s;\n  animation-duration: 1s;\n  -webkit-animation-fill-mode: both;\n  animation-fill-mode: both;\n}\n\n.animated.infinite {\n  -webkit-animation-iteration-count: infinite;\n  animation-iteration-count: infinite;\n}\n\n.animated.hinge {\n  -webkit-animation-duration: 2s;\n  animation-duration: 2s;\n}\n\n.animated.flipOutX,\n.animated.flipOutY,\n.animated.bounceIn,\n.animated.bounceOut {\n  -webkit-animation-duration: .75s;\n  animation-duration: .75s;\n}\n\n@-webkit-keyframes bounce {\n  from, 20%, 53%, 80%, to {\n    -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    -webkit-transform: translate3d(0,0,0);\n    transform: translate3d(0,0,0);\n  }\n\n  40%, 43% {\n    -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n    animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n    -webkit-transform: translate3d(0, -30px, 0);\n    transform: translate3d(0, -30px, 0);\n  }\n\n  70% {\n    -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n    animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n    -webkit-transform: translate3d(0, -15px, 0);\n    transform: translate3d(0, -15px, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(0,-4px,0);\n    transform: translate3d(0,-4px,0);\n  }\n}\n\n@keyframes bounce {\n  from, 20%, 53%, 80%, to {\n    -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    -webkit-transform: translate3d(0,0,0);\n    transform: translate3d(0,0,0);\n  }\n\n  40%, 43% {\n    -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n    animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n    -webkit-transform: translate3d(0, -30px, 0);\n    transform: translate3d(0, -30px, 0);\n  }\n\n  70% {\n    -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n    animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n    -webkit-transform: translate3d(0, -15px, 0);\n    transform: translate3d(0, -15px, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(0,-4px,0);\n    transform: translate3d(0,-4px,0);\n  }\n}\n\n.bounce {\n  -webkit-animation-name: bounce;\n  animation-name: bounce;\n  -webkit-transform-origin: center bottom;\n  transform-origin: center bottom;\n}\n\n@-webkit-keyframes flash {\n  from, 50%, to {\n    opacity: 1;\n  }\n\n  25%, 75% {\n    opacity: 0;\n  }\n}\n\n@keyframes flash {\n  from, 50%, to {\n    opacity: 1;\n  }\n\n  25%, 75% {\n    opacity: 0;\n  }\n}\n\n.flash {\n  -webkit-animation-name: flash;\n  animation-name: flash;\n}\n\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n\n@-webkit-keyframes pulse {\n  from {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n\n  50% {\n    -webkit-transform: scale3d(1.05, 1.05, 1.05);\n    transform: scale3d(1.05, 1.05, 1.05);\n  }\n\n  to {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n\n@keyframes pulse {\n  from {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n\n  50% {\n    -webkit-transform: scale3d(1.05, 1.05, 1.05);\n    transform: scale3d(1.05, 1.05, 1.05);\n  }\n\n  to {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n\n.pulse {\n  -webkit-animation-name: pulse;\n  animation-name: pulse;\n}\n\n@-webkit-keyframes rubberBand {\n  from {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n\n  30% {\n    -webkit-transform: scale3d(1.25, 0.75, 1);\n    transform: scale3d(1.25, 0.75, 1);\n  }\n\n  40% {\n    -webkit-transform: scale3d(0.75, 1.25, 1);\n    transform: scale3d(0.75, 1.25, 1);\n  }\n\n  50% {\n    -webkit-transform: scale3d(1.15, 0.85, 1);\n    transform: scale3d(1.15, 0.85, 1);\n  }\n\n  65% {\n    -webkit-transform: scale3d(.95, 1.05, 1);\n    transform: scale3d(.95, 1.05, 1);\n  }\n\n  75% {\n    -webkit-transform: scale3d(1.05, .95, 1);\n    transform: scale3d(1.05, .95, 1);\n  }\n\n  to {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n\n@keyframes rubberBand {\n  from {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n\n  30% {\n    -webkit-transform: scale3d(1.25, 0.75, 1);\n    transform: scale3d(1.25, 0.75, 1);\n  }\n\n  40% {\n    -webkit-transform: scale3d(0.75, 1.25, 1);\n    transform: scale3d(0.75, 1.25, 1);\n  }\n\n  50% {\n    -webkit-transform: scale3d(1.15, 0.85, 1);\n    transform: scale3d(1.15, 0.85, 1);\n  }\n\n  65% {\n    -webkit-transform: scale3d(.95, 1.05, 1);\n    transform: scale3d(.95, 1.05, 1);\n  }\n\n  75% {\n    -webkit-transform: scale3d(1.05, .95, 1);\n    transform: scale3d(1.05, .95, 1);\n  }\n\n  to {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n\n.rubberBand {\n  -webkit-animation-name: rubberBand;\n  animation-name: rubberBand;\n}\n\n@-webkit-keyframes shake {\n  from, to {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n\n  10%, 30%, 50%, 70%, 90% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n\n  20%, 40%, 60%, 80% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n}\n\n@keyframes shake {\n  from, to {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n\n  10%, 30%, 50%, 70%, 90% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n\n  20%, 40%, 60%, 80% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n}\n\n.shake {\n  -webkit-animation-name: shake;\n  animation-name: shake;\n}\n\n@-webkit-keyframes headShake {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n\n  6.5% {\n    -webkit-transform: translateX(-6px) rotateY(-9deg);\n    transform: translateX(-6px) rotateY(-9deg);\n  }\n\n  18.5% {\n    -webkit-transform: translateX(5px) rotateY(7deg);\n    transform: translateX(5px) rotateY(7deg);\n  }\n\n  31.5% {\n    -webkit-transform: translateX(-3px) rotateY(-5deg);\n    transform: translateX(-3px) rotateY(-5deg);\n  }\n\n  43.5% {\n    -webkit-transform: translateX(2px) rotateY(3deg);\n    transform: translateX(2px) rotateY(3deg);\n  }\n\n  50% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n\n@keyframes headShake {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n\n  6.5% {\n    -webkit-transform: translateX(-6px) rotateY(-9deg);\n    transform: translateX(-6px) rotateY(-9deg);\n  }\n\n  18.5% {\n    -webkit-transform: translateX(5px) rotateY(7deg);\n    transform: translateX(5px) rotateY(7deg);\n  }\n\n  31.5% {\n    -webkit-transform: translateX(-3px) rotateY(-5deg);\n    transform: translateX(-3px) rotateY(-5deg);\n  }\n\n  43.5% {\n    -webkit-transform: translateX(2px) rotateY(3deg);\n    transform: translateX(2px) rotateY(3deg);\n  }\n\n  50% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n\n.headShake {\n  -webkit-animation-timing-function: ease-in-out;\n  animation-timing-function: ease-in-out;\n  -webkit-animation-name: headShake;\n  animation-name: headShake;\n}\n\n@-webkit-keyframes swing {\n  20% {\n    -webkit-transform: rotate3d(0, 0, 1, 15deg);\n    transform: rotate3d(0, 0, 1, 15deg);\n  }\n\n  40% {\n    -webkit-transform: rotate3d(0, 0, 1, -10deg);\n    transform: rotate3d(0, 0, 1, -10deg);\n  }\n\n  60% {\n    -webkit-transform: rotate3d(0, 0, 1, 5deg);\n    transform: rotate3d(0, 0, 1, 5deg);\n  }\n\n  80% {\n    -webkit-transform: rotate3d(0, 0, 1, -5deg);\n    transform: rotate3d(0, 0, 1, -5deg);\n  }\n\n  to {\n    -webkit-transform: rotate3d(0, 0, 1, 0deg);\n    transform: rotate3d(0, 0, 1, 0deg);\n  }\n}\n\n@keyframes swing {\n  20% {\n    -webkit-transform: rotate3d(0, 0, 1, 15deg);\n    transform: rotate3d(0, 0, 1, 15deg);\n  }\n\n  40% {\n    -webkit-transform: rotate3d(0, 0, 1, -10deg);\n    transform: rotate3d(0, 0, 1, -10deg);\n  }\n\n  60% {\n    -webkit-transform: rotate3d(0, 0, 1, 5deg);\n    transform: rotate3d(0, 0, 1, 5deg);\n  }\n\n  80% {\n    -webkit-transform: rotate3d(0, 0, 1, -5deg);\n    transform: rotate3d(0, 0, 1, -5deg);\n  }\n\n  to {\n    -webkit-transform: rotate3d(0, 0, 1, 0deg);\n    transform: rotate3d(0, 0, 1, 0deg);\n  }\n}\n\n.swing {\n  -webkit-transform-origin: top center;\n  transform-origin: top center;\n  -webkit-animation-name: swing;\n  animation-name: swing;\n}\n\n@-webkit-keyframes tada {\n  from {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n\n  10%, 20% {\n    -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);\n  }\n\n  30%, 50%, 70%, 90% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n  }\n\n  40%, 60%, 80% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n  }\n\n  to {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n\n@keyframes tada {\n  from {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n\n  10%, 20% {\n    -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);\n  }\n\n  30%, 50%, 70%, 90% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n  }\n\n  40%, 60%, 80% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n  }\n\n  to {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n\n.tada {\n  -webkit-animation-name: tada;\n  animation-name: tada;\n}\n\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n\n@-webkit-keyframes wobble {\n  from {\n    -webkit-transform: none;\n    transform: none;\n  }\n\n  15% {\n    -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n    transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n  }\n\n  30% {\n    -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n    transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n  }\n\n  45% {\n    -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n    transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n  }\n\n  60% {\n    -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n    transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n  }\n\n  75% {\n    -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n    transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n  }\n\n  to {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes wobble {\n  from {\n    -webkit-transform: none;\n    transform: none;\n  }\n\n  15% {\n    -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n    transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n  }\n\n  30% {\n    -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n    transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n  }\n\n  45% {\n    -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n    transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n  }\n\n  60% {\n    -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n    transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n  }\n\n  75% {\n    -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n    transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n  }\n\n  to {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.wobble {\n  -webkit-animation-name: wobble;\n  animation-name: wobble;\n}\n\n@-webkit-keyframes jello {\n  from, 11.1%, to {\n    -webkit-transform: none;\n    transform: none;\n  }\n\n  22.2% {\n    -webkit-transform: skewX(-12.5deg) skewY(-12.5deg);\n    transform: skewX(-12.5deg) skewY(-12.5deg);\n  }\n\n  33.3% {\n    -webkit-transform: skewX(6.25deg) skewY(6.25deg);\n    transform: skewX(6.25deg) skewY(6.25deg);\n  }\n\n  44.4% {\n    -webkit-transform: skewX(-3.125deg) skewY(-3.125deg);\n    transform: skewX(-3.125deg) skewY(-3.125deg);\n  }\n\n  55.5% {\n    -webkit-transform: skewX(1.5625deg) skewY(1.5625deg);\n    transform: skewX(1.5625deg) skewY(1.5625deg);\n  }\n\n  66.6% {\n    -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg);\n    transform: skewX(-0.78125deg) skewY(-0.78125deg);\n  }\n\n  77.7% {\n    -webkit-transform: skewX(0.390625deg) skewY(0.390625deg);\n    transform: skewX(0.390625deg) skewY(0.390625deg);\n  }\n\n  88.8% {\n    -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg);\n    transform: skewX(-0.1953125deg) skewY(-0.1953125deg);\n  }\n}\n\n@keyframes jello {\n  from, 11.1%, to {\n    -webkit-transform: none;\n    transform: none;\n  }\n\n  22.2% {\n    -webkit-transform: skewX(-12.5deg) skewY(-12.5deg);\n    transform: skewX(-12.5deg) skewY(-12.5deg);\n  }\n\n  33.3% {\n    -webkit-transform: skewX(6.25deg) skewY(6.25deg);\n    transform: skewX(6.25deg) skewY(6.25deg);\n  }\n\n  44.4% {\n    -webkit-transform: skewX(-3.125deg) skewY(-3.125deg);\n    transform: skewX(-3.125deg) skewY(-3.125deg);\n  }\n\n  55.5% {\n    -webkit-transform: skewX(1.5625deg) skewY(1.5625deg);\n    transform: skewX(1.5625deg) skewY(1.5625deg);\n  }\n\n  66.6% {\n    -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg);\n    transform: skewX(-0.78125deg) skewY(-0.78125deg);\n  }\n\n  77.7% {\n    -webkit-transform: skewX(0.390625deg) skewY(0.390625deg);\n    transform: skewX(0.390625deg) skewY(0.390625deg);\n  }\n\n  88.8% {\n    -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg);\n    transform: skewX(-0.1953125deg) skewY(-0.1953125deg);\n  }\n}\n\n.jello {\n  -webkit-animation-name: jello;\n  animation-name: jello;\n  -webkit-transform-origin: center;\n  transform-origin: center;\n}\n\n@-webkit-keyframes bounceIn {\n  from, 20%, 40%, 60%, 80%, to {\n    -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(.3, .3, .3);\n    transform: scale3d(.3, .3, .3);\n  }\n\n  20% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n\n  40% {\n    -webkit-transform: scale3d(.9, .9, .9);\n    transform: scale3d(.9, .9, .9);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.03, 1.03, 1.03);\n    transform: scale3d(1.03, 1.03, 1.03);\n  }\n\n  80% {\n    -webkit-transform: scale3d(.97, .97, .97);\n    transform: scale3d(.97, .97, .97);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n\n@keyframes bounceIn {\n  from, 20%, 40%, 60%, 80%, to {\n    -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(.3, .3, .3);\n    transform: scale3d(.3, .3, .3);\n  }\n\n  20% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n\n  40% {\n    -webkit-transform: scale3d(.9, .9, .9);\n    transform: scale3d(.9, .9, .9);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.03, 1.03, 1.03);\n    transform: scale3d(1.03, 1.03, 1.03);\n  }\n\n  80% {\n    -webkit-transform: scale3d(.97, .97, .97);\n    transform: scale3d(.97, .97, .97);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n\n.bounceIn {\n  -webkit-animation-name: bounceIn;\n  animation-name: bounceIn;\n}\n\n@-webkit-keyframes bounceInDown {\n  from, 60%, 75%, 90%, to {\n    -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -3000px, 0);\n    transform: translate3d(0, -3000px, 0);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 25px, 0);\n    transform: translate3d(0, 25px, 0);\n  }\n\n  75% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(0, 5px, 0);\n    transform: translate3d(0, 5px, 0);\n  }\n\n  to {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes bounceInDown {\n  from, 60%, 75%, 90%, to {\n    -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -3000px, 0);\n    transform: translate3d(0, -3000px, 0);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 25px, 0);\n    transform: translate3d(0, 25px, 0);\n  }\n\n  75% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(0, 5px, 0);\n    transform: translate3d(0, 5px, 0);\n  }\n\n  to {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.bounceInDown {\n  -webkit-animation-name: bounceInDown;\n  animation-name: bounceInDown;\n}\n\n@-webkit-keyframes bounceInLeft {\n  from, 60%, 75%, 90%, to {\n    -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-3000px, 0, 0);\n    transform: translate3d(-3000px, 0, 0);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(25px, 0, 0);\n    transform: translate3d(25px, 0, 0);\n  }\n\n  75% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(5px, 0, 0);\n    transform: translate3d(5px, 0, 0);\n  }\n\n  to {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes bounceInLeft {\n  from, 60%, 75%, 90%, to {\n    -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-3000px, 0, 0);\n    transform: translate3d(-3000px, 0, 0);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(25px, 0, 0);\n    transform: translate3d(25px, 0, 0);\n  }\n\n  75% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(5px, 0, 0);\n    transform: translate3d(5px, 0, 0);\n  }\n\n  to {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.bounceInLeft {\n  -webkit-animation-name: bounceInLeft;\n  animation-name: bounceInLeft;\n}\n\n@-webkit-keyframes bounceInRight {\n  from, 60%, 75%, 90%, to {\n    -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(3000px, 0, 0);\n    transform: translate3d(3000px, 0, 0);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(-25px, 0, 0);\n    transform: translate3d(-25px, 0, 0);\n  }\n\n  75% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(-5px, 0, 0);\n    transform: translate3d(-5px, 0, 0);\n  }\n\n  to {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes bounceInRight {\n  from, 60%, 75%, 90%, to {\n    -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(3000px, 0, 0);\n    transform: translate3d(3000px, 0, 0);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(-25px, 0, 0);\n    transform: translate3d(-25px, 0, 0);\n  }\n\n  75% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(-5px, 0, 0);\n    transform: translate3d(-5px, 0, 0);\n  }\n\n  to {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.bounceInRight {\n  -webkit-animation-name: bounceInRight;\n  animation-name: bounceInRight;\n}\n\n@-webkit-keyframes bounceInUp {\n  from, 60%, 75%, 90%, to {\n    -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 3000px, 0);\n    transform: translate3d(0, 3000px, 0);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n\n  75% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(0, -5px, 0);\n    transform: translate3d(0, -5px, 0);\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n\n@keyframes bounceInUp {\n  from, 60%, 75%, 90%, to {\n    -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 3000px, 0);\n    transform: translate3d(0, 3000px, 0);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n\n  75% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(0, -5px, 0);\n    transform: translate3d(0, -5px, 0);\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n\n.bounceInUp {\n  -webkit-animation-name: bounceInUp;\n  animation-name: bounceInUp;\n}\n\n@-webkit-keyframes bounceOut {\n  20% {\n    -webkit-transform: scale3d(.9, .9, .9);\n    transform: scale3d(.9, .9, .9);\n  }\n\n  50%, 55% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: scale3d(.3, .3, .3);\n    transform: scale3d(.3, .3, .3);\n  }\n}\n\n@keyframes bounceOut {\n  20% {\n    -webkit-transform: scale3d(.9, .9, .9);\n    transform: scale3d(.9, .9, .9);\n  }\n\n  50%, 55% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: scale3d(.3, .3, .3);\n    transform: scale3d(.3, .3, .3);\n  }\n}\n\n.bounceOut {\n  -webkit-animation-name: bounceOut;\n  animation-name: bounceOut;\n}\n\n@-webkit-keyframes bounceOutDown {\n  20% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n\n  40%, 45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n\n@keyframes bounceOutDown {\n  20% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n\n  40%, 45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n\n.bounceOutDown {\n  -webkit-animation-name: bounceOutDown;\n  animation-name: bounceOutDown;\n}\n\n@-webkit-keyframes bounceOutLeft {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(20px, 0, 0);\n    transform: translate3d(20px, 0, 0);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n\n@keyframes bounceOutLeft {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(20px, 0, 0);\n    transform: translate3d(20px, 0, 0);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n\n.bounceOutLeft {\n  -webkit-animation-name: bounceOutLeft;\n  animation-name: bounceOutLeft;\n}\n\n@-webkit-keyframes bounceOutRight {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(-20px, 0, 0);\n    transform: translate3d(-20px, 0, 0);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n\n@keyframes bounceOutRight {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(-20px, 0, 0);\n    transform: translate3d(-20px, 0, 0);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n\n.bounceOutRight {\n  -webkit-animation-name: bounceOutRight;\n  animation-name: bounceOutRight;\n}\n\n@-webkit-keyframes bounceOutUp {\n  20% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n\n  40%, 45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 20px, 0);\n    transform: translate3d(0, 20px, 0);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n\n@keyframes bounceOutUp {\n  20% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n\n  40%, 45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 20px, 0);\n    transform: translate3d(0, 20px, 0);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n\n.bounceOutUp {\n  -webkit-animation-name: bounceOutUp;\n  animation-name: bounceOutUp;\n}\n\n@-webkit-keyframes fadeIn {\n  from {\n    opacity: 0;\n  }\n\n  to {\n    opacity: 1;\n  }\n}\n\n@keyframes fadeIn {\n  from {\n    opacity: 0;\n  }\n\n  to {\n    opacity: 1;\n  }\n}\n\n.fadeIn {\n  -webkit-animation-name: fadeIn;\n  animation-name: fadeIn;\n}\n\n@-webkit-keyframes fadeInDown {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes fadeInDown {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.fadeInDown {\n  -webkit-animation-name: fadeInDown;\n  animation-name: fadeInDown;\n}\n\n@-webkit-keyframes fadeInDownBig {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes fadeInDownBig {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.fadeInDownBig {\n  -webkit-animation-name: fadeInDownBig;\n  animation-name: fadeInDownBig;\n}\n\n@-webkit-keyframes fadeInLeft {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes fadeInLeft {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.fadeInLeft {\n  -webkit-animation-name: fadeInLeft;\n  animation-name: fadeInLeft;\n}\n\n@-webkit-keyframes fadeInLeftBig {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes fadeInLeftBig {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.fadeInLeftBig {\n  -webkit-animation-name: fadeInLeftBig;\n  animation-name: fadeInLeftBig;\n}\n\n@-webkit-keyframes fadeInRight {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes fadeInRight {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.fadeInRight {\n  -webkit-animation-name: fadeInRight;\n  animation-name: fadeInRight;\n}\n\n@-webkit-keyframes fadeInRightBig {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes fadeInRightBig {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.fadeInRightBig {\n  -webkit-animation-name: fadeInRightBig;\n  animation-name: fadeInRightBig;\n}\n\n@-webkit-keyframes fadeInUp {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes fadeInUp {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.fadeInUp {\n  -webkit-animation-name: fadeInUp;\n  animation-name: fadeInUp;\n}\n\n@-webkit-keyframes fadeInUpBig {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes fadeInUpBig {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.fadeInUpBig {\n  -webkit-animation-name: fadeInUpBig;\n  animation-name: fadeInUpBig;\n}\n\n@-webkit-keyframes fadeOut {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n  }\n}\n\n@keyframes fadeOut {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n  }\n}\n\n.fadeOut {\n  -webkit-animation-name: fadeOut;\n  animation-name: fadeOut;\n}\n\n@-webkit-keyframes fadeOutDown {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n}\n\n@keyframes fadeOutDown {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n}\n\n.fadeOutDown {\n  -webkit-animation-name: fadeOutDown;\n  animation-name: fadeOutDown;\n}\n\n@-webkit-keyframes fadeOutDownBig {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n\n@keyframes fadeOutDownBig {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n\n.fadeOutDownBig {\n  -webkit-animation-name: fadeOutDownBig;\n  animation-name: fadeOutDownBig;\n}\n\n@-webkit-keyframes fadeOutLeft {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n}\n\n@keyframes fadeOutLeft {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n}\n\n.fadeOutLeft {\n  -webkit-animation-name: fadeOutLeft;\n  animation-name: fadeOutLeft;\n}\n\n@-webkit-keyframes fadeOutLeftBig {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n\n@keyframes fadeOutLeftBig {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n\n.fadeOutLeftBig {\n  -webkit-animation-name: fadeOutLeftBig;\n  animation-name: fadeOutLeftBig;\n}\n\n@-webkit-keyframes fadeOutRight {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n}\n\n@keyframes fadeOutRight {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n}\n\n.fadeOutRight {\n  -webkit-animation-name: fadeOutRight;\n  animation-name: fadeOutRight;\n}\n\n@-webkit-keyframes fadeOutRightBig {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n\n@keyframes fadeOutRightBig {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n\n.fadeOutRightBig {\n  -webkit-animation-name: fadeOutRightBig;\n  animation-name: fadeOutRightBig;\n}\n\n@-webkit-keyframes fadeOutUp {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n}\n\n@keyframes fadeOutUp {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n}\n\n.fadeOutUp {\n  -webkit-animation-name: fadeOutUp;\n  animation-name: fadeOutUp;\n}\n\n@-webkit-keyframes fadeOutUpBig {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n\n@keyframes fadeOutUpBig {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n\n.fadeOutUpBig {\n  -webkit-animation-name: fadeOutUpBig;\n  animation-name: fadeOutUpBig;\n}\n\n@-webkit-keyframes flip {\n  from {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n\n  40% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n\n  50% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n\n  80% {\n    -webkit-transform: perspective(400px) scale3d(.95, .95, .95);\n    transform: perspective(400px) scale3d(.95, .95, .95);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n\n  to {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n}\n\n@keyframes flip {\n  from {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n\n  40% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n\n  50% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n\n  80% {\n    -webkit-transform: perspective(400px) scale3d(.95, .95, .95);\n    transform: perspective(400px) scale3d(.95, .95, .95);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n\n  to {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n}\n\n.animated.flip {\n  -webkit-backface-visibility: visible;\n  backface-visibility: visible;\n  -webkit-animation-name: flip;\n  animation-name: flip;\n}\n\n@-webkit-keyframes flipInX {\n  from {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n    opacity: 0;\n  }\n\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    opacity: 1;\n  }\n\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n  }\n\n  to {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n\n@keyframes flipInX {\n  from {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n    opacity: 0;\n  }\n\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    opacity: 1;\n  }\n\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n  }\n\n  to {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n\n.flipInX {\n  -webkit-backface-visibility: visible !important;\n  backface-visibility: visible !important;\n  -webkit-animation-name: flipInX;\n  animation-name: flipInX;\n}\n\n@-webkit-keyframes flipInY {\n  from {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n    opacity: 0;\n  }\n\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    opacity: 1;\n  }\n\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n  }\n\n  to {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n\n@keyframes flipInY {\n  from {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n    opacity: 0;\n  }\n\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    opacity: 1;\n  }\n\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n  }\n\n  to {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n\n.flipInY {\n  -webkit-backface-visibility: visible !important;\n  backface-visibility: visible !important;\n  -webkit-animation-name: flipInY;\n  animation-name: flipInY;\n}\n\n@-webkit-keyframes flipOutX {\n  from {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    opacity: 0;\n  }\n}\n\n@keyframes flipOutX {\n  from {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    opacity: 0;\n  }\n}\n\n.flipOutX {\n  -webkit-animation-name: flipOutX;\n  animation-name: flipOutX;\n  -webkit-backface-visibility: visible !important;\n  backface-visibility: visible !important;\n}\n\n@-webkit-keyframes flipOutY {\n  from {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    opacity: 0;\n  }\n}\n\n@keyframes flipOutY {\n  from {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    opacity: 0;\n  }\n}\n\n.flipOutY {\n  -webkit-backface-visibility: visible !important;\n  backface-visibility: visible !important;\n  -webkit-animation-name: flipOutY;\n  animation-name: flipOutY;\n}\n\n@-webkit-keyframes lightSpeedIn {\n  from {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);\n    transform: translate3d(100%, 0, 0) skewX(-30deg);\n    opacity: 0;\n  }\n\n  60% {\n    -webkit-transform: skewX(20deg);\n    transform: skewX(20deg);\n    opacity: 1;\n  }\n\n  80% {\n    -webkit-transform: skewX(-5deg);\n    transform: skewX(-5deg);\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n\n@keyframes lightSpeedIn {\n  from {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);\n    transform: translate3d(100%, 0, 0) skewX(-30deg);\n    opacity: 0;\n  }\n\n  60% {\n    -webkit-transform: skewX(20deg);\n    transform: skewX(20deg);\n    opacity: 1;\n  }\n\n  80% {\n    -webkit-transform: skewX(-5deg);\n    transform: skewX(-5deg);\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n\n.lightSpeedIn {\n  -webkit-animation-name: lightSpeedIn;\n  animation-name: lightSpeedIn;\n  -webkit-animation-timing-function: ease-out;\n  animation-timing-function: ease-out;\n}\n\n@-webkit-keyframes lightSpeedOut {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);\n    transform: translate3d(100%, 0, 0) skewX(30deg);\n    opacity: 0;\n  }\n}\n\n@keyframes lightSpeedOut {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);\n    transform: translate3d(100%, 0, 0) skewX(30deg);\n    opacity: 0;\n  }\n}\n\n.lightSpeedOut {\n  -webkit-animation-name: lightSpeedOut;\n  animation-name: lightSpeedOut;\n  -webkit-animation-timing-function: ease-in;\n  animation-timing-function: ease-in;\n}\n\n@-webkit-keyframes rotateIn {\n  from {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, -200deg);\n    transform: rotate3d(0, 0, 1, -200deg);\n    opacity: 0;\n  }\n\n  to {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n\n@keyframes rotateIn {\n  from {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, -200deg);\n    transform: rotate3d(0, 0, 1, -200deg);\n    opacity: 0;\n  }\n\n  to {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n\n.rotateIn {\n  -webkit-animation-name: rotateIn;\n  animation-name: rotateIn;\n}\n\n@-webkit-keyframes rotateInDownLeft {\n  from {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n\n  to {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n\n@keyframes rotateInDownLeft {\n  from {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n\n  to {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n\n.rotateInDownLeft {\n  -webkit-animation-name: rotateInDownLeft;\n  animation-name: rotateInDownLeft;\n}\n\n@-webkit-keyframes rotateInDownRight {\n  from {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n\n  to {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n\n@keyframes rotateInDownRight {\n  from {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n\n  to {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n\n.rotateInDownRight {\n  -webkit-animation-name: rotateInDownRight;\n  animation-name: rotateInDownRight;\n}\n\n@-webkit-keyframes rotateInUpLeft {\n  from {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n\n  to {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n\n@keyframes rotateInUpLeft {\n  from {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n\n  to {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n\n.rotateInUpLeft {\n  -webkit-animation-name: rotateInUpLeft;\n  animation-name: rotateInUpLeft;\n}\n\n@-webkit-keyframes rotateInUpRight {\n  from {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -90deg);\n    transform: rotate3d(0, 0, 1, -90deg);\n    opacity: 0;\n  }\n\n  to {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n\n@keyframes rotateInUpRight {\n  from {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -90deg);\n    transform: rotate3d(0, 0, 1, -90deg);\n    opacity: 0;\n  }\n\n  to {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n\n.rotateInUpRight {\n  -webkit-animation-name: rotateInUpRight;\n  animation-name: rotateInUpRight;\n}\n\n@-webkit-keyframes rotateOut {\n  from {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, 200deg);\n    transform: rotate3d(0, 0, 1, 200deg);\n    opacity: 0;\n  }\n}\n\n@keyframes rotateOut {\n  from {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, 200deg);\n    transform: rotate3d(0, 0, 1, 200deg);\n    opacity: 0;\n  }\n}\n\n.rotateOut {\n  -webkit-animation-name: rotateOut;\n  animation-name: rotateOut;\n}\n\n@-webkit-keyframes rotateOutDownLeft {\n  from {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n}\n\n@keyframes rotateOutDownLeft {\n  from {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n}\n\n.rotateOutDownLeft {\n  -webkit-animation-name: rotateOutDownLeft;\n  animation-name: rotateOutDownLeft;\n}\n\n@-webkit-keyframes rotateOutDownRight {\n  from {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n\n@keyframes rotateOutDownRight {\n  from {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n\n.rotateOutDownRight {\n  -webkit-animation-name: rotateOutDownRight;\n  animation-name: rotateOutDownRight;\n}\n\n@-webkit-keyframes rotateOutUpLeft {\n  from {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n\n@keyframes rotateOutUpLeft {\n  from {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n\n.rotateOutUpLeft {\n  -webkit-animation-name: rotateOutUpLeft;\n  animation-name: rotateOutUpLeft;\n}\n\n@-webkit-keyframes rotateOutUpRight {\n  from {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 90deg);\n    transform: rotate3d(0, 0, 1, 90deg);\n    opacity: 0;\n  }\n}\n\n@keyframes rotateOutUpRight {\n  from {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 90deg);\n    transform: rotate3d(0, 0, 1, 90deg);\n    opacity: 0;\n  }\n}\n\n.rotateOutUpRight {\n  -webkit-animation-name: rotateOutUpRight;\n  animation-name: rotateOutUpRight;\n}\n\n@-webkit-keyframes hinge {\n  0% {\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n\n  20%, 60% {\n    -webkit-transform: rotate3d(0, 0, 1, 80deg);\n    transform: rotate3d(0, 0, 1, 80deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n\n  40%, 80% {\n    -webkit-transform: rotate3d(0, 0, 1, 60deg);\n    transform: rotate3d(0, 0, 1, 60deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 700px, 0);\n    transform: translate3d(0, 700px, 0);\n    opacity: 0;\n  }\n}\n\n@keyframes hinge {\n  0% {\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n\n  20%, 60% {\n    -webkit-transform: rotate3d(0, 0, 1, 80deg);\n    transform: rotate3d(0, 0, 1, 80deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n\n  40%, 80% {\n    -webkit-transform: rotate3d(0, 0, 1, 60deg);\n    transform: rotate3d(0, 0, 1, 60deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n    opacity: 1;\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 700px, 0);\n    transform: translate3d(0, 700px, 0);\n    opacity: 0;\n  }\n}\n\n.hinge {\n  -webkit-animation-name: hinge;\n  animation-name: hinge;\n}\n\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n\n@-webkit-keyframes rollIn {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n    transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n@keyframes rollIn {\n  from {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n    transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n  }\n\n  to {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n\n.rollIn {\n  -webkit-animation-name: rollIn;\n  animation-name: rollIn;\n}\n\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n\n@-webkit-keyframes rollOut {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n    transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n  }\n}\n\n@keyframes rollOut {\n  from {\n    opacity: 1;\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n    transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n  }\n}\n\n.rollOut {\n  -webkit-animation-name: rollOut;\n  animation-name: rollOut;\n}\n\n@-webkit-keyframes zoomIn {\n  from {\n    opacity: 0;\n    -webkit-transform: scale3d(.3, .3, .3);\n    transform: scale3d(.3, .3, .3);\n  }\n\n  50% {\n    opacity: 1;\n  }\n}\n\n@keyframes zoomIn {\n  from {\n    opacity: 0;\n    -webkit-transform: scale3d(.3, .3, .3);\n    transform: scale3d(.3, .3, .3);\n  }\n\n  50% {\n    opacity: 1;\n  }\n}\n\n.zoomIn {\n  -webkit-animation-name: zoomIn;\n  animation-name: zoomIn;\n}\n\n@-webkit-keyframes zoomInDown {\n  from {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);\n    transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n    transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n@keyframes zoomInDown {\n  from {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);\n    transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n    transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n.zoomInDown {\n  -webkit-animation-name: zoomInDown;\n  animation-name: zoomInDown;\n}\n\n@-webkit-keyframes zoomInLeft {\n  from {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);\n    transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);\n    transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n@keyframes zoomInLeft {\n  from {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);\n    transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);\n    transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n.zoomInLeft {\n  -webkit-animation-name: zoomInLeft;\n  animation-name: zoomInLeft;\n}\n\n@-webkit-keyframes zoomInRight {\n  from {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);\n    transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);\n    transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n@keyframes zoomInRight {\n  from {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);\n    transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);\n    transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n.zoomInRight {\n  -webkit-animation-name: zoomInRight;\n  animation-name: zoomInRight;\n}\n\n@-webkit-keyframes zoomInUp {\n  from {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);\n    transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n    transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n@keyframes zoomInUp {\n  from {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);\n    transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n    transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n.zoomInUp {\n  -webkit-animation-name: zoomInUp;\n  animation-name: zoomInUp;\n}\n\n@-webkit-keyframes zoomOut {\n  from {\n    opacity: 1;\n  }\n\n  50% {\n    opacity: 0;\n    -webkit-transform: scale3d(.3, .3, .3);\n    transform: scale3d(.3, .3, .3);\n  }\n\n  to {\n    opacity: 0;\n  }\n}\n\n@keyframes zoomOut {\n  from {\n    opacity: 1;\n  }\n\n  50% {\n    opacity: 0;\n    -webkit-transform: scale3d(.3, .3, .3);\n    transform: scale3d(.3, .3, .3);\n  }\n\n  to {\n    opacity: 0;\n  }\n}\n\n.zoomOut {\n  -webkit-animation-name: zoomOut;\n  animation-name: zoomOut;\n}\n\n@-webkit-keyframes zoomOutDown {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n    transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);\n    transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n@keyframes zoomOutDown {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n    transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);\n    transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n.zoomOutDown {\n  -webkit-animation-name: zoomOutDown;\n  animation-name: zoomOutDown;\n}\n\n@-webkit-keyframes zoomOutLeft {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);\n    transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: scale(.1) translate3d(-2000px, 0, 0);\n    transform: scale(.1) translate3d(-2000px, 0, 0);\n    -webkit-transform-origin: left center;\n    transform-origin: left center;\n  }\n}\n\n@keyframes zoomOutLeft {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);\n    transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: scale(.1) translate3d(-2000px, 0, 0);\n    transform: scale(.1) translate3d(-2000px, 0, 0);\n    -webkit-transform-origin: left center;\n    transform-origin: left center;\n  }\n}\n\n.zoomOutLeft {\n  -webkit-animation-name: zoomOutLeft;\n  animation-name: zoomOutLeft;\n}\n\n@-webkit-keyframes zoomOutRight {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);\n    transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: scale(.1) translate3d(2000px, 0, 0);\n    transform: scale(.1) translate3d(2000px, 0, 0);\n    -webkit-transform-origin: right center;\n    transform-origin: right center;\n  }\n}\n\n@keyframes zoomOutRight {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);\n    transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: scale(.1) translate3d(2000px, 0, 0);\n    transform: scale(.1) translate3d(2000px, 0, 0);\n    -webkit-transform-origin: right center;\n    transform-origin: right center;\n  }\n}\n\n.zoomOutRight {\n  -webkit-animation-name: zoomOutRight;\n  animation-name: zoomOutRight;\n}\n\n@-webkit-keyframes zoomOutUp {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n    transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);\n    transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n@keyframes zoomOutUp {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n    transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n    animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  to {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);\n    transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n.zoomOutUp {\n  -webkit-animation-name: zoomOutUp;\n  animation-name: zoomOutUp;\n}\n\n@-webkit-keyframes slideInDown {\n  from {\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n    visibility: visible;\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n\n@keyframes slideInDown {\n  from {\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n    visibility: visible;\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n\n.slideInDown {\n  -webkit-animation-name: slideInDown;\n  animation-name: slideInDown;\n}\n\n@-webkit-keyframes slideInLeft {\n  from {\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n    visibility: visible;\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n\n@keyframes slideInLeft {\n  from {\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n    visibility: visible;\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n\n.slideInLeft {\n  -webkit-animation-name: slideInLeft;\n  animation-name: slideInLeft;\n}\n\n@-webkit-keyframes slideInRight {\n  from {\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n    visibility: visible;\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n\n@keyframes slideInRight {\n  from {\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n    visibility: visible;\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n\n.slideInRight {\n  -webkit-animation-name: slideInRight;\n  animation-name: slideInRight;\n}\n\n@-webkit-keyframes slideInUp {\n  from {\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n    visibility: visible;\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n\n@keyframes slideInUp {\n  from {\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n    visibility: visible;\n  }\n\n  to {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n\n.slideInUp {\n  -webkit-animation-name: slideInUp;\n  animation-name: slideInUp;\n}\n\n@-webkit-keyframes slideOutDown {\n  from {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n\n  to {\n    visibility: hidden;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n}\n\n@keyframes slideOutDown {\n  from {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n\n  to {\n    visibility: hidden;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n}\n\n.slideOutDown {\n  -webkit-animation-name: slideOutDown;\n  animation-name: slideOutDown;\n}\n\n@-webkit-keyframes slideOutLeft {\n  from {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n\n  to {\n    visibility: hidden;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n}\n\n@keyframes slideOutLeft {\n  from {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n\n  to {\n    visibility: hidden;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n}\n\n.slideOutLeft {\n  -webkit-animation-name: slideOutLeft;\n  animation-name: slideOutLeft;\n}\n\n@-webkit-keyframes slideOutRight {\n  from {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n\n  to {\n    visibility: hidden;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n}\n\n@keyframes slideOutRight {\n  from {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n\n  to {\n    visibility: hidden;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n}\n\n.slideOutRight {\n  -webkit-animation-name: slideOutRight;\n  animation-name: slideOutRight;\n}\n\n@-webkit-keyframes slideOutUp {\n  from {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n\n  to {\n    visibility: hidden;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n}\n\n@keyframes slideOutUp {\n  from {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n\n  to {\n    visibility: hidden;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n}\n\n.slideOutUp {\n  -webkit-animation-name: slideOutUp;\n  animation-name: slideOutUp;\n}\n"
  },
  {
    "path": "demo/bouncejs/bounce.js",
    "content": "/**\n * Bounce.js 0.8.2\n * MIT license\n */\n!function(e){if(\"object\"==typeof exports)module.exports=e();else if(\"function\"==typeof define&&define.amd)define(e);else{var f;\"undefined\"!=typeof window?f=window:\"undefined\"!=typeof global?f=global:\"undefined\"!=typeof self&&(f=self),f.Bounce=e()}}(function(){var define,module,exports;return (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);throw new Error(\"Cannot find module '\"+o+\"'\")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.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(_dereq_,module,exports){\nvar Component, EasingClasses, Matrix4D;\n\nMatrix4D = _dereq_(\"../math/matrix4d\");\n\nEasingClasses = {\n  bounce: _dereq_(\"../easing/bounce\"),\n  sway: _dereq_(\"../easing/sway\"),\n  hardbounce: _dereq_(\"../easing/hardbounce\"),\n  hardsway: _dereq_(\"../easing/hardsway\")\n};\n\nComponent = (function() {\n  Component.prototype.easing = \"bounce\";\n\n  Component.prototype.duration = 1000;\n\n  Component.prototype.delay = 0;\n\n  Component.prototype.from = null;\n\n  Component.prototype.to = null;\n\n  function Component(options) {\n    options || (options = {});\n    if (options.easing != null) {\n      this.easing = options.easing;\n    }\n    if (options.duration != null) {\n      this.duration = options.duration;\n    }\n    if (options.delay != null) {\n      this.delay = options.delay;\n    }\n    if (options.from != null) {\n      this.from = options.from;\n    }\n    if (options.to != null) {\n      this.to = options.to;\n    }\n    this.easingObject = new EasingClasses[this.easing](options);\n  }\n\n  Component.prototype.calculateEase = function(ratio) {\n    return this.easingObject.calculate(ratio);\n  };\n\n  Component.prototype.getMatrix = function() {\n    return new Matrix4D().identity();\n  };\n\n  Component.prototype.getEasedMatrix = function(ratio) {\n    return this.getMatrix();\n  };\n\n  Component.prototype.serialize = function() {\n    var key, serialized, value, _ref;\n    serialized = {\n      type: this.constructor.name.toLowerCase(),\n      easing: this.easing,\n      duration: this.duration,\n      delay: this.delay,\n      from: this.from,\n      to: this.to\n    };\n    _ref = this.easingObject.serialize();\n    for (key in _ref) {\n      value = _ref[key];\n      serialized[key] = value;\n    }\n    return serialized;\n  };\n\n  return Component;\n\n})();\n\nmodule.exports = Component;\n\n\n},{\"../easing/bounce\":6,\"../easing/hardbounce\":7,\"../easing/hardsway\":8,\"../easing/sway\":10,\"../math/matrix4d\":13}],2:[function(_dereq_,module,exports){\nvar Component, Matrix4D, Rotate, Vector2D,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nMatrix4D = _dereq_(\"../math/matrix4d\");\n\nVector2D = _dereq_(\"../math/vector2d\");\n\nComponent = _dereq_(\"./index\");\n\nRotate = (function(_super) {\n  __extends(Rotate, _super);\n\n  Rotate.prototype.from = 0;\n\n  Rotate.prototype.to = 90;\n\n  function Rotate() {\n    Rotate.__super__.constructor.apply(this, arguments);\n    this.diff = this.to - this.from;\n  }\n\n  Rotate.prototype.getMatrix = function(degrees) {\n    var c, radians, s;\n    radians = (degrees / 180) * Math.PI;\n    c = Math.cos(radians);\n    s = Math.sin(radians);\n    return new Matrix4D([c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);\n  };\n\n  Rotate.prototype.getEasedMatrix = function(ratio) {\n    var easedAngle, easedRatio;\n    easedRatio = this.calculateEase(ratio);\n    easedAngle = this.from + this.diff * easedRatio;\n    return this.getMatrix(easedAngle);\n  };\n\n  return Rotate;\n\n})(Component);\n\nmodule.exports = Rotate;\n\n\n},{\"../math/matrix4d\":13,\"../math/vector2d\":14,\"./index\":1}],3:[function(_dereq_,module,exports){\nvar Component, Matrix4D, Scale, Vector2D,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nMatrix4D = _dereq_(\"../math/matrix4d\");\n\nVector2D = _dereq_(\"../math/vector2d\");\n\nComponent = _dereq_(\"./index\");\n\nScale = (function(_super) {\n  __extends(Scale, _super);\n\n  Scale.prototype.from = {\n    x: 0.5,\n    y: 0.5\n  };\n\n  Scale.prototype.to = {\n    x: 1,\n    y: 1\n  };\n\n  function Scale() {\n    Scale.__super__.constructor.apply(this, arguments);\n    this.fromVector = new Vector2D(this.from.x, this.from.y);\n    this.toVector = new Vector2D(this.to.x, this.to.y);\n    this.diff = this.toVector.clone().subtract(this.fromVector);\n  }\n\n  Scale.prototype.getMatrix = function(x, y) {\n    var z;\n    z = 1;\n    return new Matrix4D([x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1]);\n  };\n\n  Scale.prototype.getEasedMatrix = function(ratio) {\n    var easedRatio, easedVector;\n    easedRatio = this.calculateEase(ratio);\n    easedVector = this.fromVector.clone().add(this.diff.clone().multiply(easedRatio));\n    return this.getMatrix(easedVector.x, easedVector.y);\n  };\n\n  return Scale;\n\n})(Component);\n\nmodule.exports = Scale;\n\n\n},{\"../math/matrix4d\":13,\"../math/vector2d\":14,\"./index\":1}],4:[function(_dereq_,module,exports){\nvar Component, Matrix4D, Skew, Vector2D,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nMatrix4D = _dereq_(\"../math/matrix4d\");\n\nVector2D = _dereq_(\"../math/vector2d\");\n\nComponent = _dereq_(\"./index\");\n\nSkew = (function(_super) {\n  __extends(Skew, _super);\n\n  Skew.prototype.from = {\n    x: 0,\n    y: 0\n  };\n\n  Skew.prototype.to = {\n    x: 20,\n    y: 0\n  };\n\n  function Skew() {\n    Skew.__super__.constructor.apply(this, arguments);\n    this.fromVector = new Vector2D(this.from.x, this.from.y);\n    this.toVector = new Vector2D(this.to.x, this.to.y);\n    this.diff = this.toVector.clone().subtract(this.fromVector);\n  }\n\n  Skew.prototype.getMatrix = function(degreesX, degreesY) {\n    var radiansX, radiansY, tx, ty;\n    radiansX = (degreesX / 180) * Math.PI;\n    radiansY = (degreesY / 180) * Math.PI;\n    tx = Math.tan(radiansX);\n    ty = Math.tan(radiansY);\n    return new Matrix4D([1, tx, 0, 0, ty, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);\n  };\n\n  Skew.prototype.getEasedMatrix = function(ratio) {\n    var easedRatio, easedVector;\n    easedRatio = this.calculateEase(ratio);\n    easedVector = this.fromVector.clone().add(this.diff.clone().multiply(easedRatio));\n    return this.getMatrix(easedVector.x, easedVector.y);\n  };\n\n  return Skew;\n\n})(Component);\n\nmodule.exports = Skew;\n\n\n},{\"../math/matrix4d\":13,\"../math/vector2d\":14,\"./index\":1}],5:[function(_dereq_,module,exports){\nvar Component, Matrix4D, Translate, Vector2D,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nMatrix4D = _dereq_(\"../math/matrix4d\");\n\nVector2D = _dereq_(\"../math/vector2d\");\n\nComponent = _dereq_(\"./index\");\n\nTranslate = (function(_super) {\n  __extends(Translate, _super);\n\n  Translate.prototype.from = {\n    x: 0,\n    y: 0\n  };\n\n  Translate.prototype.to = {\n    x: 0,\n    y: 0\n  };\n\n  function Translate() {\n    Translate.__super__.constructor.apply(this, arguments);\n    this.fromVector = new Vector2D(this.from.x, this.from.y);\n    this.toVector = new Vector2D(this.to.x, this.to.y);\n    this.diff = this.toVector.clone().subtract(this.fromVector);\n  }\n\n  Translate.prototype.getMatrix = function(x, y) {\n    var z;\n    z = 0;\n    return new Matrix4D([1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, z, 0, 0, 0, 1]);\n  };\n\n  Translate.prototype.getEasedMatrix = function(ratio) {\n    var easedRatio, easedVector;\n    easedRatio = this.calculateEase(ratio);\n    easedVector = this.fromVector.clone().add(this.diff.clone().multiply(easedRatio));\n    return this.getMatrix(easedVector.x, easedVector.y);\n  };\n\n  return Translate;\n\n})(Component);\n\nmodule.exports = Translate;\n\n\n},{\"../math/matrix4d\":13,\"../math/vector2d\":14,\"./index\":1}],6:[function(_dereq_,module,exports){\nvar BounceEasing, Easing,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nEasing = _dereq_(\"./index\");\n\nBounceEasing = (function(_super) {\n  __extends(BounceEasing, _super);\n\n  BounceEasing.prototype.bounces = 4;\n\n  BounceEasing.prototype.stiffness = 3;\n\n  function BounceEasing(options) {\n    var threshold;\n    if (options == null) {\n      options = {};\n    }\n    BounceEasing.__super__.constructor.apply(this, arguments);\n    if (options.stiffness != null) {\n      this.stiffness = options.stiffness;\n    }\n    if (options.bounces != null) {\n      this.bounces = options.bounces;\n    }\n    this.alpha = this.stiffness / 100;\n    threshold = 0.005 / Math.pow(10, this.stiffness);\n    this.limit = Math.floor(Math.log(threshold) / -this.alpha);\n    this.omega = this.calculateOmega(this.bounces, this.limit);\n  }\n\n  BounceEasing.prototype.calculate = function(ratio) {\n    var t;\n    if (ratio >= 1) {\n      return 1;\n    }\n    t = ratio * this.limit;\n    return 1 - this.exponent(t) * this.oscillation(t);\n  };\n\n  BounceEasing.prototype.calculateOmega = function(bounces, limit) {\n    return (this.bounces + 0.5) * Math.PI / this.limit;\n  };\n\n  BounceEasing.prototype.exponent = function(t) {\n    return Math.pow(Math.E, -this.alpha * t);\n  };\n\n  BounceEasing.prototype.oscillation = function(t) {\n    return Math.cos(this.omega * t);\n  };\n\n  BounceEasing.prototype.serialize = function() {\n    return {\n      stiffness: this.stiffness,\n      bounces: this.bounces\n    };\n  };\n\n  return BounceEasing;\n\n})(Easing);\n\nmodule.exports = BounceEasing;\n\n\n},{\"./index\":9}],7:[function(_dereq_,module,exports){\nvar BounceEasing, HardBounceEasing,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nBounceEasing = _dereq_(\"./bounce\");\n\nHardBounceEasing = (function(_super) {\n  __extends(HardBounceEasing, _super);\n\n  function HardBounceEasing() {\n    return HardBounceEasing.__super__.constructor.apply(this, arguments);\n  }\n\n  HardBounceEasing.prototype.oscillation = function(t) {\n    return Math.abs(Math.cos(this.omega * t));\n  };\n\n  return HardBounceEasing;\n\n})(BounceEasing);\n\nmodule.exports = HardBounceEasing;\n\n\n},{\"./bounce\":6}],8:[function(_dereq_,module,exports){\nvar HardSwayEasing, SwayEasing,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nSwayEasing = _dereq_(\"./sway\");\n\nHardSwayEasing = (function(_super) {\n  __extends(HardSwayEasing, _super);\n\n  function HardSwayEasing() {\n    return HardSwayEasing.__super__.constructor.apply(this, arguments);\n  }\n\n  HardSwayEasing.prototype.oscillation = function(t) {\n    return Math.abs(Math.sin(this.omega * t));\n  };\n\n  return HardSwayEasing;\n\n})(SwayEasing);\n\nmodule.exports = HardSwayEasing;\n\n\n},{\"./sway\":10}],9:[function(_dereq_,module,exports){\nvar Easing, MathHelpers;\n\nMathHelpers = _dereq_(\"../math/helpers\");\n\nEasing = (function() {\n  function Easing() {}\n\n  Easing.prototype.calculate = function(ratio) {\n    return ratio;\n  };\n\n  Easing.prototype.serialize = function() {\n    return {};\n  };\n\n  Easing.prototype.findOptimalKeyPoints = function(threshold, resolution) {\n    var area, halfway, i, keyPoint, keyPoints, loops, result, values;\n    if (threshold == null) {\n      threshold = 1.0;\n    }\n    if (resolution == null) {\n      resolution = 1000;\n    }\n    keyPoints = [0];\n    values = (function() {\n      var _i, _results;\n      _results = [];\n      for (i = _i = 0; 0 <= resolution ? _i < resolution : _i > resolution; i = 0 <= resolution ? ++_i : --_i) {\n        _results.push(this.calculate(i / resolution));\n      }\n      return _results;\n    }).call(this);\n    keyPoints = keyPoints.concat(MathHelpers.findTurningPoints(values));\n    keyPoints.push(resolution - 1);\n    i = 0;\n    loops = 1000;\n    while (loops--) {\n      if (i === keyPoints.length - 1) {\n        break;\n      }\n      area = MathHelpers.areaBetweenLineAndCurve(values, keyPoints[i], keyPoints[i + 1]);\n      if (area <= threshold) {\n        i++;\n      } else {\n        halfway = Math.round(keyPoints[i] + (keyPoints[i + 1] - keyPoints[i]) / 2);\n        keyPoints.splice(i + 1, 0, halfway);\n      }\n    }\n    if (loops === 0) {\n      return [];\n    }\n    return result = (function() {\n      var _i, _len, _results;\n      _results = [];\n      for (_i = 0, _len = keyPoints.length; _i < _len; _i++) {\n        keyPoint = keyPoints[_i];\n        _results.push(keyPoint / (resolution - 1));\n      }\n      return _results;\n    })();\n  };\n\n  return Easing;\n\n})();\n\nmodule.exports = Easing;\n\n\n},{\"../math/helpers\":12}],10:[function(_dereq_,module,exports){\nvar BounceEasing, SwayEasing,\n  __hasProp = {}.hasOwnProperty,\n  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };\n\nBounceEasing = _dereq_(\"./bounce\");\n\nSwayEasing = (function(_super) {\n  __extends(SwayEasing, _super);\n\n  function SwayEasing() {\n    return SwayEasing.__super__.constructor.apply(this, arguments);\n  }\n\n  SwayEasing.prototype.calculate = function(ratio) {\n    var t;\n    if (ratio >= 1) {\n      return 0;\n    }\n    t = ratio * this.limit;\n    return this.exponent(t) * this.oscillation(t);\n  };\n\n  SwayEasing.prototype.calculateOmega = function(bounces, limit) {\n    return this.bounces * Math.PI / this.limit;\n  };\n\n  SwayEasing.prototype.oscillation = function(t) {\n    return Math.sin(this.omega * t);\n  };\n\n  return SwayEasing;\n\n})(BounceEasing);\n\nmodule.exports = SwayEasing;\n\n\n},{\"./bounce\":6}],11:[function(_dereq_,module,exports){\nvar Bounce, ComponentClasses, Matrix4D;\n\nMatrix4D = _dereq_(\"./math/matrix4d\");\n\nComponentClasses = {\n  scale: _dereq_(\"./components/scale\"),\n  rotate: _dereq_(\"./components/rotate\"),\n  translate: _dereq_(\"./components/translate\"),\n  skew: _dereq_(\"./components/skew\")\n};\n\nBounce = (function() {\n  Bounce.FPS = 30;\n\n  Bounce.counter = 1;\n\n  Bounce.prototype.components = null;\n\n  Bounce.prototype.duration = 0;\n\n  function Bounce() {\n    this.components = [];\n  }\n\n  Bounce.prototype.scale = function(options) {\n    return this.addComponent(new ComponentClasses[\"scale\"](options));\n  };\n\n  Bounce.prototype.rotate = function(options) {\n    return this.addComponent(new ComponentClasses[\"rotate\"](options));\n  };\n\n  Bounce.prototype.translate = function(options) {\n    return this.addComponent(new ComponentClasses[\"translate\"](options));\n  };\n\n  Bounce.prototype.skew = function(options) {\n    return this.addComponent(new ComponentClasses[\"skew\"](options));\n  };\n\n  Bounce.prototype.addComponent = function(component) {\n    this.components.push(component);\n    this.updateDuration();\n    return this;\n  };\n\n  Bounce.prototype.serialize = function() {\n    var component, serialized, _i, _len, _ref;\n    serialized = [];\n    _ref = this.components;\n    for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n      component = _ref[_i];\n      serialized.push(component.serialize());\n    }\n    return serialized;\n  };\n\n  Bounce.prototype.deserialize = function(serialized) {\n    var options, _i, _len;\n    for (_i = 0, _len = serialized.length; _i < _len; _i++) {\n      options = serialized[_i];\n      this.addComponent(new ComponentClasses[options.type](options));\n    }\n    return this;\n  };\n\n  Bounce.prototype.updateDuration = function() {\n    return this.duration = this.components.map(function(component) {\n      return component.duration + component.delay;\n    }).reduce(function(a, b) {\n      return Math.max(a, b);\n    });\n  };\n\n  Bounce.prototype.define = function(name) {\n    this.name = name || Bounce.generateName();\n    this.styleElement = document.createElement(\"style\");\n    this.styleElement.innerHTML = this.getKeyframeCSS({\n      name: this.name,\n      prefix: true\n    });\n    document.body.appendChild(this.styleElement);\n    return this;\n  };\n\n  Bounce.prototype.applyTo = function(elements, options) {\n    var css, deferred, element, prefix, prefixes, _i, _j, _len, _len1, _ref;\n    if (options == null) {\n      options = {};\n    }\n    this.define();\n    if (!elements.length) {\n      elements = [elements];\n    }\n    prefixes = this.getPrefixes();\n    deferred = null;\n    if (window.jQuery && window.jQuery.Deferred) {\n      deferred = new window.jQuery.Deferred();\n    }\n    for (_i = 0, _len = elements.length; _i < _len; _i++) {\n      element = elements[_i];\n      _ref = prefixes.animation;\n      for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {\n        prefix = _ref[_j];\n        css = [this.name, \"\" + this.duration + \"ms\", \"linear\", \"both\"];\n        if (options.loop) {\n          css.push(\"infinite\");\n        }\n        element.style[\"\" + prefix + \"animation\"] = css.join(\" \");\n      }\n    }\n    if (!options.loop) {\n      setTimeout(((function(_this) {\n        return function() {\n          if (options.remove) {\n            _this.remove();\n          }\n          if (typeof options.onComplete === \"function\") {\n            options.onComplete();\n          }\n          if (deferred) {\n            return deferred.resolve();\n          }\n        };\n      })(this)), this.duration);\n    }\n    return deferred;\n  };\n\n  Bounce.prototype.remove = function() {\n    var _ref;\n    if (!this.styleElement) {\n      return;\n    }\n    if (this.styleElement.remove) {\n      return this.styleElement.remove();\n    } else {\n      return (_ref = this.styleElement.parentNode) != null ? _ref.removeChild(this.styleElement) : void 0;\n    }\n  };\n\n  Bounce.prototype.getPrefixes = function(force) {\n    var prefixes, style;\n    prefixes = {\n      transform: [\"\"],\n      animation: [\"\"]\n    };\n    style = document.createElement(\"dummy\").style;\n    if (force || (!(\"transform\" in style) && \"webkitTransform\" in style)) {\n      prefixes.transform = [\"-webkit-\", \"\"];\n    }\n    if (force || (!(\"animation\" in style) && \"webkitAnimation\" in style)) {\n      prefixes.animation = [\"-webkit-\", \"\"];\n    }\n    return prefixes;\n  };\n\n  Bounce.prototype.getKeyframeCSS = function(options) {\n    var animations, key, keyframeList, keyframes, matrix, prefix, prefixes, transformString, transforms, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2;\n    if (options == null) {\n      options = {};\n    }\n    this.name = options.name || Bounce.generateName();\n    prefixes = {\n      transform: [\"\"],\n      animation: [\"\"]\n    };\n    if (options.prefix || options.forcePrefix) {\n      prefixes = this.getPrefixes(options.forcePrefix);\n    }\n    keyframeList = [];\n    keyframes = this.getKeyframes(options);\n    _ref = this.keys;\n    for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n      key = _ref[_i];\n      matrix = keyframes[key];\n      transformString = \"matrix3d\" + matrix;\n      transforms = [];\n      _ref1 = prefixes.transform;\n      for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {\n        prefix = _ref1[_j];\n        transforms.push(\"\" + prefix + \"transform: \" + transformString + \";\");\n      }\n      keyframeList.push(\"\" + (Math.round(key * 100 * 100) / 100) + \"% { \" + (transforms.join(\" \")) + \" }\");\n    }\n    animations = [];\n    _ref2 = prefixes.animation;\n    for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {\n      prefix = _ref2[_k];\n      animations.push(\"@\" + prefix + \"keyframes \" + this.name + \" { \\n  \" + (keyframeList.join(\"\\n  \")) + \" \\n}\");\n    }\n    return animations.join(\"\\n\\n\");\n  };\n\n  Bounce.prototype.getKeyframes = function(options) {\n    var component, componentKeys, currentTime, frames, i, key, keyframes, keys, matrix, ratio, _i, _j, _k, _l, _len, _len1, _len2, _ref, _ref1;\n    if (options == null) {\n      options = {};\n    }\n    keys = [0, 1];\n    if (options.optimized) {\n      _ref = this.components;\n      for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n        component = _ref[_i];\n        componentKeys = component.easingObject.findOptimalKeyPoints().map((function(_this) {\n          return function(key) {\n            return (key * component.duration / _this.duration) + (component.delay / _this.duration);\n          };\n        })(this));\n        if (component.delay) {\n          componentKeys.push((component.delay / this.duration) - 0.001);\n        }\n        keys = keys.concat(componentKeys);\n      }\n    } else {\n      frames = Math.round((this.duration / 1000) * Bounce.FPS);\n      for (i = _j = 0; 0 <= frames ? _j <= frames : _j >= frames; i = 0 <= frames ? ++_j : --_j) {\n        keys.push(i / frames);\n      }\n    }\n    keys = keys.sort(function(a, b) {\n      return a - b;\n    });\n    this.keys = [];\n    keyframes = {};\n    for (_k = 0, _len1 = keys.length; _k < _len1; _k++) {\n      key = keys[_k];\n      if (keyframes[key]) {\n        continue;\n      }\n      matrix = new Matrix4D().identity();\n      _ref1 = this.components;\n      for (_l = 0, _len2 = _ref1.length; _l < _len2; _l++) {\n        component = _ref1[_l];\n        currentTime = key * this.duration;\n        if ((component.delay - currentTime) > 1e-8) {\n          continue;\n        }\n        ratio = (key - component.delay / this.duration) / (component.duration / this.duration);\n        matrix.multiply(component.getEasedMatrix(ratio));\n      }\n      this.keys.push(key);\n      keyframes[key] = matrix.transpose().toFixed(3);\n    }\n    return keyframes;\n  };\n\n  Bounce.generateName = function() {\n    return \"animation-\" + (Bounce.counter++);\n  };\n\n  Bounce.isSupported = function() {\n    var property, propertyIsSupported, propertyList, propertyLists, style, _i, _j, _len, _len1;\n    style = document.createElement(\"dummy\").style;\n    propertyLists = [[\"transform\", \"webkitTransform\"], [\"animation\", \"webkitAnimation\"]];\n    for (_i = 0, _len = propertyLists.length; _i < _len; _i++) {\n      propertyList = propertyLists[_i];\n      propertyIsSupported = false;\n      for (_j = 0, _len1 = propertyList.length; _j < _len1; _j++) {\n        property = propertyList[_j];\n        propertyIsSupported || (propertyIsSupported = property in style);\n      }\n      if (!propertyIsSupported) {\n        return false;\n      }\n    }\n    return true;\n  };\n\n  return Bounce;\n\n})();\n\nmodule.exports = Bounce;\n\n\n},{\"./components/rotate\":2,\"./components/scale\":3,\"./components/skew\":4,\"./components/translate\":5,\"./math/matrix4d\":13}],12:[function(_dereq_,module,exports){\nvar MathHelpers;\n\nMathHelpers = (function() {\n  function MathHelpers() {}\n\n  MathHelpers.prototype.sign = function(value) {\n    if (value < 0) {\n      return -1;\n    }\n    return 1;\n  };\n\n  MathHelpers.prototype.findTurningPoints = function(values) {\n    var i, signA, signB, turningPoints, _i, _ref;\n    turningPoints = [];\n    for (i = _i = 1, _ref = values.length - 1; 1 <= _ref ? _i < _ref : _i > _ref; i = 1 <= _ref ? ++_i : --_i) {\n      signA = this.sign(values[i] - values[i - 1]);\n      signB = this.sign(values[i + 1] - values[i]);\n      if (signA !== signB) {\n        turningPoints.push(i);\n      }\n    }\n    return turningPoints;\n  };\n\n  MathHelpers.prototype.areaBetweenLineAndCurve = function(values, start, end) {\n    var area, curveValue, i, length, lineValue, yEnd, yStart, _i;\n    length = end - start;\n    yStart = values[start];\n    yEnd = values[end];\n    area = 0;\n    for (i = _i = 0; 0 <= length ? _i <= length : _i >= length; i = 0 <= length ? ++_i : --_i) {\n      curveValue = values[start + i];\n      lineValue = yStart + (i / length) * (yEnd - yStart);\n      area += Math.abs(lineValue - curveValue);\n    }\n    return area;\n  };\n\n  return MathHelpers;\n\n})();\n\nmodule.exports = new MathHelpers;\n\n\n},{}],13:[function(_dereq_,module,exports){\nvar Matrix4D;\n\nMatrix4D = (function() {\n  Matrix4D.prototype._array = null;\n\n  function Matrix4D(array) {\n    this._array = (array != null ? array.slice(0) : void 0) || [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n  }\n\n  Matrix4D.prototype.equals = function(matrix) {\n    return this.toString() === matrix.toString();\n  };\n\n  Matrix4D.prototype.identity = function() {\n    this.setArray([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);\n    return this;\n  };\n\n  Matrix4D.prototype.multiply = function(matrix) {\n    var i, j, k, res, value, _i, _j, _k;\n    res = new Matrix4D;\n    for (i = _i = 0; _i < 4; i = ++_i) {\n      for (j = _j = 0; _j < 4; j = ++_j) {\n        for (k = _k = 0; _k < 4; k = ++_k) {\n          value = res.get(i, j) + this.get(i, k) * matrix.get(k, j);\n          res.set(i, j, value);\n        }\n      }\n    }\n    return this.copy(res);\n  };\n\n  Matrix4D.prototype.transpose = function() {\n    var a;\n    a = this.getArray();\n    this.setArray([a[0], a[4], a[8], a[12], a[1], a[5], a[9], a[13], a[2], a[6], a[10], a[14], a[3], a[7], a[11], a[15]]);\n    return this;\n  };\n\n  Matrix4D.prototype.get = function(row, column) {\n    return this.getArray()[row * 4 + column];\n  };\n\n  Matrix4D.prototype.set = function(row, column, value) {\n    return this._array[row * 4 + column] = value;\n  };\n\n  Matrix4D.prototype.copy = function(matrix) {\n    this._array = matrix.getArray();\n    return this;\n  };\n\n  Matrix4D.prototype.clone = function() {\n    return new Matrix4D(this.getArray());\n  };\n\n  Matrix4D.prototype.getArray = function() {\n    return this._array.slice(0);\n  };\n\n  Matrix4D.prototype.setArray = function(array) {\n    this._array = array;\n    return this;\n  };\n\n  Matrix4D.prototype.toString = function() {\n    return \"(\" + (this.getArray().join(\", \")) + \")\";\n  };\n\n  Matrix4D.prototype.toFixed = function(n) {\n    var value;\n    this._array = (function() {\n      var _i, _len, _ref, _results;\n      _ref = this._array;\n      _results = [];\n      for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n        value = _ref[_i];\n        _results.push(parseFloat(value.toFixed(n)));\n      }\n      return _results;\n    }).call(this);\n    return this;\n  };\n\n  return Matrix4D;\n\n})();\n\nmodule.exports = Matrix4D;\n\n\n},{}],14:[function(_dereq_,module,exports){\nvar Vector2D;\n\nVector2D = (function() {\n  Vector2D.prototype.x = 0;\n\n  Vector2D.prototype.y = 0;\n\n  function Vector2D(x, y) {\n    this.x = x != null ? x : 0;\n    this.y = y != null ? y : 0;\n  }\n\n  Vector2D.prototype.add = function(vector) {\n    if (!Vector2D.isVector2D(vector)) {\n      return this._addScalar(vector);\n    }\n    this.x += vector.x;\n    this.y += vector.y;\n    return this;\n  };\n\n  Vector2D.prototype._addScalar = function(n) {\n    this.x += n;\n    this.y += n;\n    return this;\n  };\n\n  Vector2D.prototype.subtract = function(vector) {\n    if (!Vector2D.isVector2D(vector)) {\n      return this._subtractScalar(vector);\n    }\n    this.x -= vector.x;\n    this.y -= vector.y;\n    return this;\n  };\n\n  Vector2D.prototype._subtractScalar = function(n) {\n    return this._addScalar(-n);\n  };\n\n  Vector2D.prototype.multiply = function(vector) {\n    if (!Vector2D.isVector2D(vector)) {\n      return this._multiplyScalar(vector);\n    }\n    this.x *= vector.x;\n    this.y *= vector.y;\n    return this;\n  };\n\n  Vector2D.prototype._multiplyScalar = function(n) {\n    this.x *= n;\n    this.y *= n;\n    return this;\n  };\n\n  Vector2D.prototype.divide = function(vector) {\n    if (!Vector2D.isVector2D(vector)) {\n      return this._divideScalar(vector);\n    }\n    this.x /= vector.x;\n    this.y /= vector.y;\n    return this;\n  };\n\n  Vector2D.prototype._divideScalar = function(n) {\n    return this._multiplyScalar(1 / n);\n  };\n\n  Vector2D.prototype.clone = function() {\n    return new Vector2D(this.x, this.y);\n  };\n\n  Vector2D.prototype.copy = function(vector) {\n    this.x = vector.x;\n    this.y = vector.y;\n    return this;\n  };\n\n  Vector2D.prototype.equals = function(vector) {\n    return vector.x === this.x && vector.y === this.y;\n  };\n\n  Vector2D.prototype.toString = function() {\n    return \"(\" + this.x + \", \" + this.y + \")\";\n  };\n\n  Vector2D.prototype.toFixed = function(n) {\n    this.x = parseFloat(this.x.toFixed(n));\n    this.y = parseFloat(this.y.toFixed(n));\n    return this;\n  };\n\n  Vector2D.prototype.toArray = function() {\n    return [this.x, this.y];\n  };\n\n  Vector2D.isVector2D = function(item) {\n    return item instanceof Vector2D;\n  };\n\n  return Vector2D;\n\n})();\n\nmodule.exports = Vector2D;\n\n\n},{}]},{},[11])\n(11)\n});"
  },
  {
    "path": "demo/demo.css",
    "content": "body {\n  font-family: 'GothamRoundedLight', sans-serif;\n  font-weight: 300;\n  background-color: rgb(255, 253, 250);\n  background-image: url('bg-dot.png');\n  background-size: 41px 40px;\n  background-position: 0 0;\n  background-repeat: repeat;\n}\n\na, strong {\n  color: inherit;\n  font-family: 'GothamRoundedMedium', sans-serif;\n}\n\na:hover {\n  text-decoration: none;\n}\n\n.activity-item i {\n  float: left;\n  margin-top: 3px;\n  font-size: 16px;\n}\n\ndiv.activity {\n  margin-left: 28px;\n  line-height: 1.4em;\n}\n\ndiv.activity-item {\n  padding: 7px 12px;\n}\n\ndiv.activity > span {\n  display: block;\n  font-size: .8em;\n}\n\n#custom_container {\n  border: 2px solid #ccc;\n  width: 500px;\n  max-width: 100%;\n  margin: 40px auto;\n  min-height: 100px;\n  border-radius: 5px;\n  background: rgba(255, 255, 255, .5);\n  overflow: hidden;\n}\n\n.logo {\n  text-align: center;\n  background: rgb(255, 253, 250);\n  padding: 0 20px;\n  width: 200px;\n  margin: 0 auto;\n}\n\nselect:focus {\n  outline: none;\n}\n\nselect {\n  /* General styling */\n  height: 30px;\n  width: 137px;\n  padding-left: 10px;\n\n  color: #222;\n  border-radius: 3px;\n  border: 0 solid #222;\n  margin: 0 3px;\n\n  /* Removes the default <select> styling */\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n\n  /* Positions background arrow image */\n  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAh0lEQVQ4T93TMQrCUAzG8V9x8QziiYSuXdzFC7h4AcELOPQAdXYovZCHEATlgQV5GFTe1ozJlz/kS1IpjKqw3wQBVyy++JI0y1GTe7DCBbMAckeNIQKk/BanALBB+16LtnDELoMcsM/BESDlz2heDR3WePwKSLo5eoxz3z6NNcFD+vu3ij14Aqz/DxGbKB7CAAAAAElFTkSuQmCC');\n  background-repeat: no-repeat;\n  background-position: 115px center;\n}\n\n\n.button {\n  display: inline-block;\n  position: relative;\n  padding: .8em 1.3em;\n  font-size: 11px;\n  letter-spacing: 1px;\n  font-weight: 800;\n  text-transform: uppercase;\n  line-height: 1.2;\n  outline: 0;\n  background: #AC8FFD;\n  border: 2px solid #948CE2;\n  color: #fff;\n  text-shadow: none;\n  border-radius: 2px;\n}\n\n.button:hover {\n  color: #fff;\n  background-color: #c0a7fd;\n  border-color: #948CE2;\n}\n\n\n.button:disabled {\n  background: #dddddd;\n  color: #333;\n  opacity: .5;\n}\n\n.button:disabled:hover {\n  background: #dddddd;\n  opacity: .5;\n}\n"
  },
  {
    "path": "demo/demo.js",
    "content": "(function () {\n\n  var mojsOpenExample = function (promise) {\n    var n = this\n    var Timeline = new mojs.Timeline()\n    var body = new mojs.Html({\n      el: n.barDom,\n      x: {500: 0, delay: 0, duration: 500, easing: 'elastic.out'},\n      isForce3d: true,\n      onComplete: function () {\n        promise(function(resolve) {\n          resolve()\n        })\n      }\n    })\n\n    var parent = new mojs.Shape({\n      parent: n.barDom,\n      width: 200,\n      height: n.barDom.getBoundingClientRect().height,\n      radius: 0,\n      x: {[150]: -150},\n      duration: 1.2 * 500,\n      isShowStart: true\n    })\n\n    n.barDom.style['overflow'] = 'visible'\n    parent.el.style['overflow'] = 'hidden'\n\n    var burst = new mojs.Burst({\n      parent: parent.el,\n      count: 10,\n      top: n.barDom.getBoundingClientRect().height + 75,\n      degree: 90,\n      radius: 75,\n      angle: {[-90]: 40},\n      children: {\n        fill: '#EBD761',\n        delay: 'stagger(500, -50)',\n        radius: 'rand(8, 25)',\n        direction: -1,\n        isSwirl: true\n      }\n    })\n\n    const fadeBurst = new mojs.Burst({\n      parent: parent.el,\n      count: 2,\n      degree: 0,\n      angle: 75,\n      radius: {0: 100},\n      top: '90%',\n      children: {\n        fill: '#EBD761',\n        pathScale: [.65, 1],\n        radius: 'rand(12, 15)',\n        direction: [-1, 1],\n        delay: .8 * 500,\n        isSwirl: true\n      }\n    })\n\n    Timeline.add(body, burst, fadeBurst, parent)\n    Timeline.play()\n  }\n\n  var mojsCloseExample = function (promise) {\n    var n = this\n    new mojs.Html({\n      el: n.barDom,\n      x: {0: 500, delay: 0, duration: 250, easing: 'cubic.out'},\n      opacity: {1: 0, delay: 0, duration: 250},\n      isForce3d: true,\n      onComplete: function () {\n        promise(function(resolve) {\n          resolve()\n        })\n      }\n    }).play()\n  }\n\n  var bouncejsOpenExample = function () {\n    var n = this\n    new Bounce()\n      .translate({\n        from: {x: 450, y: 0},\n        to: {x: 0, y: 0},\n        easing: 'bounce',\n        duration: 1000,\n        bounces: 4,\n        stiffness: 3\n      })\n      .scale({\n        from: {x: 1.2, y: 1},\n        to: {x: 1, y: 1},\n        easing: 'bounce',\n        duration: 1000,\n        delay: 100,\n        bounces: 4,\n        stiffness: 1\n      })\n      .scale({\n        from: {x: 1, y: 1.2},\n        to: {x: 1, y: 1},\n        easing: 'bounce',\n        duration: 1000,\n        delay: 100,\n        bounces: 6,\n        stiffness: 1\n      })\n      .applyTo(n.barDom, {\n        onComplete: function () {\n          n.resume()\n        }\n      })\n  }\n\n  var bouncejsCloseExample = function () {\n    var n = this\n    new Bounce()\n      .translate({\n        from: {x: 0, y: 0},\n        to: {x: 450, y: 0},\n        easing: 'bounce',\n        duration: 500,\n        bounces: 4,\n        stiffness: 1\n      })\n      .applyTo(n.barDom, {\n        onComplete: function () {\n          n.barDom.parentNode.removeChild(n.barDom)\n        }\n      })\n  }\n\n  var velocityShowExample = function () {\n    var n = this\n\n    Velocity(n.barDom, {\n      left: 450,\n      scaleY: 2\n    }, {\n      duration: 0\n    })\n    Velocity(n.barDom, {\n      left: 0,\n      scaleY: 1\n    }, {\n      easing: [8, 8]\n    })\n  }\n\n  var velocityCloseExample = function () {\n    var n = this\n\n    Velocity(n.barDom, {\n      left: '+=-50'\n    }, {\n      easing: [8, 8, 2],\n      duration: 350\n    })\n    Velocity(n.barDom, {\n      left: 450,\n      scaleY: .2,\n      height: 0,\n      margin: 0\n    }, {\n      easing: [8, 8],\n      complete: function () {\n        n.barDom.parentNode.removeChild(n.barDom)\n      }\n    })\n  }\n\n  Noty.overrideDefaults({\n    layout: 'topRight',\n    theme: 'mint',\n    closeWith: ['click'],\n    timeout: 5000,\n    animation: {\n      open: mojsOpenExample,\n      close: mojsCloseExample\n    }\n  })\n\n   setTimeout(function() {\n     new Noty({\n       type: 'success',\n       layout: 'bottomRight',\n       text: \"<b>Testing 2<br/><br/> \",\n       timeout: false,\n       modal: true,\n       closeWith: ['click'],\n       animation: {\n         open: false,\n         close: false\n       }\n     }).show()\n   }, 2000)\n\n  // setTimeout(function() {\n  //   new Noty({\n  //     text: 'B) This notification <strong>plays a sound</strong> and <strong>updates the document title</strong> with count <i>if document is hidden</i>',\n  //     type: 'warning',\n  //     layout: 'topRight',\n  //     id: 'customID1'\n  //   }).show()\n  // }, 3000)\n\n//    setTimeout(function() {\n//      new Noty({\n//        text: 'B) This notification <strong>plays a sound</strong> and <strong>updates the document title</strong> with count <i>if document is hidden</i>',\n//        type: 'warning',\n//        layout: 'topRight',\n//        sounds: {\n//          sources: ['sound-example.wav'],\n//          volume: .2,\n//          conditions: ['docHidden']\n//        },\n//        titleCount: {\n//          conditions: ['docHidden']\n//        },\n//        closeWith: ['click', 'backdrop'],\n//        queue: \"Q2\",\n//        timeout: 2000,\n//        killer: \"Q1\",\n//        modal: true\n//      }).show()\n//    }, 5100)\n\n  var notes = []\n  notes['alert'] = 'Best check yo self, you\\'re not looking too good.'\n  notes['error'] = 'Change a few things up and try submitting again.'\n  notes['success'] = 'You successfully read this important alert message.'\n  notes['information'] = 'This alert needs your attention, but it\\'s not super important.'\n  notes['warning'] = '<strong>Warning!</strong> <br /> Best check yo self, you\\'re not looking too good.'\n\n  document.querySelector('.runner').addEventListener('click', function (e) {\n    e.preventDefault()\n\n    var layout = document.querySelector('select#layout')\n    var type = document.querySelector('select#type')\n\n    layout = layout.options[layout.selectedIndex].text\n    type = type.options[type.selectedIndex].text\n\n    var types = ['alert', 'error', 'success', 'information', 'warning']\n    if (type === 'random')\n      type = types[Math.floor(Math.random() * types.length)]\n\n    if (layout === 'inline') {\n      new Noty({\n        text: notes[type],\n        type: type,\n        timeout: 5000,\n        container: '#custom_container'\n      }).show()\n      return false\n    }\n\n    new Noty({\n      text: notes[type],\n      type: type,\n      timeout: 5000,\n      layout: layout\n    }).show()\n\n    return false\n  })\n\n  function getRandomInt (min, max) {\n    return Math.floor(Math.random() * (max - min + 1)) + min\n  }\n\n  var notification_alert = '<div class=\"activity-item\"> <i class=\"fa fa-tasks text-warning\"></i> <div class=\"activity\"> There are <a href=\"/\">6 new tasks</a> waiting for you. Don\\'t forget! <span>3 hours ago</span> </div> </div>',\n    notification_info = '<div class=\"activity-item\"> <i class=\"fa fa-check text-success\"></i> <div class=\"activity\"> Mail server was updated. See <a href=\"#\">changelog</a> <span>2 hours ago</span> </div> </div>',\n    notification_success = '<div class=\"activity-item\"> <i class=\"fa fa-heart text-danger\"></i> <div class=\"activity\"> Your <a href=\"#\">latest post</a> was liked by <a href=\"#\">John Doe</a> <span>35 minutes ago</span> </div> </div>',\n    notification_warning = '<div class=\"activity-item\"> <i class=\"fa fa-shopping-cart text-success\"></i> <div class=\"activity\"> <a href=\"#\">Jane</a> ordered 2 copies of <a href=\"#\">OEM license</a> <span>14 minutes ago</span> </div> </div>',\n    notification_error = '<div class=\"activity-item\"> <i class=\"fa fa-times-circle text-danger\"></i> <div class=\"activity\"> Opps! something bad happend! <span>14 minutes ago</span> </div> </div>'\n\n  Noty.setMaxVisible(5) // global queue's max visible amount (default is 5)\n  Noty.setMaxVisible(5, 'bottomRight')\n\n//            var n1 = new Noty({\n//                text   : notification_alert,\n//                type   : 'alert',\n//                timeout: false\n//            }).show();\n//            var n2 = new Noty({\n//                text   : notification_success,\n//                type   : 'success',\n//                timeout: getRandomInt(4000, 10000)\n//            }).show();\n//\n//            var n3 = new Noty({\n//                text   : notification_warning,\n//                type   : 'warning',\n//                timeout: getRandomInt(4000, 10000)\n//            }).show();\n//            var n4 = new Noty({\n//                text   : notification_error,\n//                type   : 'error',\n//                timeout: getRandomInt(4000, 10000)\n//            }).show();\n//            var n5 = new Noty({\n//                text   : notification_info,\n//                type   : 'info',\n//                timeout: getRandomInt(4000, 10000)\n//            }).show();\n//            var n6 = new Noty({\n//                text   : notification_success,\n//                type   : 'success',\n//                timeout: getRandomInt(4000, 10000)\n//            }).show();\n\n//            setTimeout(function() {\n//                n1.setText('Opps something is changed!', true);\n//            }, 1000);\n//\n//            setTimeout(function() {\n//                n1.setTheme('relax', false);\n//            }, 1000);\n//\n//            setTimeout(function() {\n//                n1.setTheme('semanticui', false);\n//            }, 3000);\n//\n//            setTimeout(function() {\n//                n1.setTheme('relax', true);\n//            }, 3000);\n//\n//            setTimeout(function() {\n//                n1.close();\n//            }, 4000);\n//\n//            setTimeout(function() {\n//                n1.show();\n//            }, 5000);\n\n//            var alternate_usage_example = new Noty({\n//                text   : \"Noty v3 - usage:2\",\n//                timeout: false,\n//                type   : 'warning',\n//                buttons: [\n//                    Noty.button('button 1', 'btn btn-success', function () {\n//                        console.log('button 1 clicked');\n//                    }, {id: 'button1', 'data-status': 'ok'}),\n//                    Noty.button('button 2', 'btn btn-error', function () {\n//                        console.log('button 2 clicked');\n//                        alternate_usage_example.close();\n//                    })\n//                ]\n//            }).on('beforeShow', function () {\n//                console.log('usage:2 beforeShow');\n//            }).on('onShow', function () {\n//                console.log('usage:2 onShow');\n//            }).on('onTemplate', function () {\n//                console.log('usage:2 onTemplate');\n//            }).on('afterShow', function () {\n//                console.log('usage:2 afterShow');\n//            }).show();\n\n})()\n"
  },
  {
    "path": "demo/fonts/stylesheet.css",
    "content": "@font-face {\n    font-family: 'GothamRoundedBold';\n    src: url('gothamrnd-bold.eot');\n    src: url('gothamrnd-bold.eot') format('embedded-opentype'),\n         url('gothamrnd-bold.woff') format('woff'),\n         url('gothamrnd-bold.ttf') format('truetype'),\n         url('gothamrnd-bold.svg#GothamRoundedBold') format('svg');\n}\n\n@font-face {\n    font-family: 'GothamRoundedBook';\n    src: url('gothamrnd-book.eot');\n    src: url('gothamrnd-book.eot') format('embedded-opentype'),\n         url('gothamrnd-book.woff') format('woff'),\n         url('gothamrnd-book.ttf') format('truetype'),\n         url('gothamrnd-book.svg#GothamRoundedBook') format('svg');\n}\n@font-face {\n    font-family: 'GothamRoundedMedium';\n    src: url('gothamrnd-medium.eot');\n    src: url('gothamrnd-medium.eot') format('embedded-opentype'),\n         url('gothamrnd-medium.woff') format('woff'),\n         url('gothamrnd-medium.ttf') format('truetype'),\n         url('gothamrnd-medium.svg#GothamRoundedMedium') format('svg');\n}\n@font-face {\n    font-family: 'GothamRoundedLight';\n    src: url('gothamrnd-light.eot');\n    src: url('gothamrnd-light.eot') format('embedded-opentype'),\n         url('gothamrnd-light.woff') format('woff'),\n         url('gothamrnd-light.ttf') format('truetype'),\n         url('gothamrnd-light.svg#GothamRoundedLight') format('svg');\n}\n"
  },
  {
    "path": "demo/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <title>NOTY v3 Demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\">\n  <link href=\"https://fonts.googleapis.com/css?family=Ubuntu:300,400,500,700&amp;subset=latin-ext\" rel=\"stylesheet\">\n  <link rel=\"stylesheet\" href=\"../lib/noty.css\"/>\n  <link rel=\"stylesheet\" href=\"../lib/themes/mint.css\"/>\n  <link rel=\"stylesheet\" href=\"demo/animate.css\"/>\n  <link rel=\"stylesheet\" href=\"demo/fonts/stylesheet.css\"/>\n  <link rel=\"stylesheet\" href=\"demo/font-awesome/css/font-awesome.min.css\"/>\n  <link rel=\"stylesheet\" href=\"demo/demo.css\"/>\n</head>\n<body>\n\n<div class=\"logo\">\n  <img src=\"demo/noty-logo.png\" alt=\"\">\n</div>\n\n<div>\n  <p class=\"mt30\" style=\"text-align: center\">\n    <select class=\"\" name=\"layout\" id=\"layout\">\n      <option value=\"top\">top</option>\n      <option value=\"topLeft\">topLeft</option>\n      <option value=\"topCenter\">topCenter</option>\n      <option value=\"topRight\" selected>topRight</option>\n      <option value=\"center\">center</option>\n      <option value=\"centerLeft\">centerLeft</option>\n      <option value=\"centerRight\">centerRight</option>\n      <option value=\"bottom\">bottom</option>\n      <option value=\"bottomLeft\">bottomLeft</option>\n      <option value=\"bottomCenter\">bottomCenter</option>\n      <option value=\"bottomRight\">bottomRight</option>\n      <optgroup label=\"Custom Container\">\n        <option value=\"inline\">inline</option>\n      </optgroup>\n    </select>\n    <select name=\"type\" id=\"type\">\n      <option value=\"random\" selected>random</option>\n      <option value=\"alert\">alert</option>\n      <option value=\"success\">success</option>\n      <option value=\"warning\">warning</option>\n      <option value=\"error\">error</option>\n      <option value=\"information\">information</option>\n    </select>\n    <br><br>\n    <a href=\"#run\" class=\"btn button runner\"\n       style=\"position: relative; top: -3px; margin-left: 10px; text-decoration: none\">CREATE</a>\n  </p>\n</div>\n\n<div id=\"custom_container\">\n  <h2 style=\"text-align: center\">Custom Container</h2>\n</div>\n\n<script src=\"//cdn.jsdelivr.net/velocity/1.5/velocity.min.js\"></script>\n<script src=\"//cdn.jsdelivr.net/mojs/latest/mo.min.js\"></script>\n<script type=\"text/javascript\" src=\"demo/bouncejs/bounce.js\"></script>\n<script type=\"text/javascript\" src=\"../lib/noty.js\"></script>\n<script type=\"text/javascript\" src=\"demo/demo.js\"></script>\n\n</body>\n</html>\n"
  },
  {
    "path": "demo/push.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <title>NOTY v3 Push Demo</title>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\">\n  <link href=\"https://fonts.googleapis.com/css?family=Ubuntu:300,400,500,700&amp;subset=latin-ext\" rel=\"stylesheet\">\n  <link rel=\"stylesheet\" href=\"../lib/noty.css\"/>\n  <link rel=\"stylesheet\" href=\"animate.css\"/>\n  <link rel=\"stylesheet\" href=\"fonts/stylesheet.css\"/>\n  <link rel=\"stylesheet\" href=\"font-awesome/css/font-awesome.min.css\"/>\n  <link rel=\"stylesheet\" href=\"demo.css\"/>\n\n  <link rel=\"manifest\" href=\"../manifest.json\">\n</head>\n<body>\n\n<div class=\"logo\">\n  <img src=\"noty-logo.png\" alt=\"\">\n</div>\n\n<div>\n  <p class=\"mt30\" style=\"text-align: center\">\n    <button class=\"btn button request\">REQUEST PERMISSION</button>\n  </p>\n</div>\n\n<div id=\"logs-wrapper\">\n  <pre id=\"logs\"></pre>\n</div>\n\n<script type=\"text/javascript\" src=\"../lib/noty.js\"></script>\n<script type=\"text/javascript\" src=\"store.everything.min.js\"></script>\n\n<script type=\"text/javascript\">\n  (function () {\n\n    function addListener (el, events, cb, useCapture = false) {\n      events = events.split(' ')\n      for (let i = 0; i < events.length; i++) {\n        if (document.addEventListener) {\n          el.addEventListener(events[i], cb, useCapture)\n        } else if (document.attachEvent) {\n          el.attachEvent('on' + events[i], cb)\n        }\n      }\n    }\n\n    var logs = document.querySelector('#logs')\n    var reqBtn = document.querySelector('.request')\n\n    window.NotyPush = Noty.Push()\n      .on('onPermissionGranted', function () {\n        console.log('Perm: granted')\n        logs.innerHTML += 'Perm: granted' + '\\n'\n        updateBtn()\n      })\n      .on('onPermissionDenied', function () {\n        console.log('Perm: denied')\n        logs.innerHTML += 'Perm: denied' + '\\n'\n        updateBtn()\n      })\n      .on('onSubscriptionSuccess', function (subData) {\n        console.log('Subscription:', subData)\n        logs.innerHTML += 'Subscription: (YOU NEED TO STORE THIS VALUES FOR LATER USE)' + '\\n' + JSON.stringify(subData, null, 2) + '\\n'\n\n        store.set('subData', subData)\n        updateBtn()\n      })\n      .on('onSubscriptionCancel', function (subData) {\n        console.log('Subscription: canceled')\n        logs.innerHTML += 'Subscription: canceled' + '\\n'\n        updateBtn()\n      })\n      .on('onWorkerSuccess', function () {\n        console.log('Worker: installed')\n        logs.innerHTML += 'Worker: installed' + '\\n'\n        updateBtn()\n      })\n      .on('onWorkerError', function (err) {\n        console.log('Worker: failed', err)\n        logs.innerHTML += 'Worker: failed' + '\\n' + JSON.stringify(err, null, 2) + '\\n'\n        updateBtn()\n      })\n      .on('onWorkerNotSupported', function (err) {\n        console.log('Worker: not supported', err)\n        logs.innerHTML += 'Worker: not supported' + '\\n'\n        updateBtn()\n      })\n\n    addListener(reqBtn, 'click', function (e) {\n      e.preventDefault()\n\n      var op = reqBtn.attributes['data-op']\n      if (op === 'request') {\n        NotyPush.requestSubscription(true)\n      } else if (op === 'print') {\n        logs.innerHTML += 'Subscription: (YOU NEED TO STORE THIS VALUES FOR LATER USE)' + '\\n' + JSON.stringify(store.get('subData'), null, 2) + '\\n'\n      }\n\n      return false\n    })\n\n    function updateBtn () {\n      if (window.NotyPush.getPermissionStatus() === 'granted') {\n        if (window.NotyPush.isSWRegistered()) {\n          reqBtn.disabled = false\n          reqBtn.innerHTML = 'Print Subscription Data <br> (granted:sw:ok)'\n          reqBtn.attributes['data-op'] = 'print'\n        } else {\n          reqBtn.disabled = false\n          reqBtn.innerHTML = 'Print Subscription Data <br> (granted:sw:fail)'\n          reqBtn.attributes['data-op'] = 'request'\n        }\n      } else if (window.NotyPush.getPermissionStatus() === 'denied') {\n        reqBtn.innerHTML = 'Push is blocked by user'\n        reqBtn.disabled = true\n      } else if (window.NotyPush.getPermissionStatus() === 'default') {\n        reqBtn.innerHTML = 'Request Subscription'\n        reqBtn.disabled = false\n        reqBtn.attributes['data-op'] = 'request'\n      }\n    }\n\n    updateBtn()\n\n  })()\n</script>\n\n</body>\n</html>\n"
  },
  {
    "path": "demo/sendpush.js",
    "content": "const webpush = require('web-push')\n\nconst vapidKeys = webpush.generateVAPIDKeys()\n\n// Create a project on the Firebase Developer Console for the key\n// https://console.firebase.google.com/\nwebpush.setGCMAPIKey(process.env.NOTY_PUSH_API_KEY)\n\nwebpush.setVapidDetails(\n  'mailto:nedimarabaci@gmail.com',\n  vapidKeys.publicKey,\n  vapidKeys.privateKey\n)\n\nconst pushSubscription = {\n  endpoint: '<-https://android.googleapis.com/gcm/send/dF3pK2rWhOQ..........->',\n  keys: {\n    auth: '<-insert-auth-key-here->',\n    p256dh: '<-insert-p256dh-key-here->'\n  }\n}\n\nwebpush.sendNotification(pushSubscription, JSON.stringify({\n  title: 'Noty title',\n  body: 'Noty body',\n  icon: 'https://avatars1.githubusercontent.com/u/3040386?v=3&s=200',\n  image: 'https://cdn.dribbble.com/users/252805/screenshots/2760603/dribbble-notification.png',\n  url: 'http://ned.im/noty/?ref=webPushTest',\n  actions: [\n    {action: 'actionYes', 'title': 'Yes', 'icon': 'https://cdn2.iconfinder.com/data/icons/navigation-set-arrows-part-two/32/Check-128.png'},\n    {action: 'actionNo', 'title': 'No', 'icon': 'https://cdn0.iconfinder.com/data/icons/navigation-set-arrows-part-one/32/Close-128.png'}\n  ]\n}))\n"
  },
  {
    "path": "docs/.nojekyll",
    "content": ""
  },
  {
    "path": "docs/README.md",
    "content": "# ![logo](_media/noty-v3-logo.png)\n\n> A Dependency-free notification library\n\n<div style=\"position:relative;\">\n    <iframe src=\"https://smashing.tools/widget\" frameBorder=\"0\" height=\"257\" width=\"320\" style=\"border-radius: 20px; pointer-events: none; margin: 0\"></iframe>\n    <a style=\"position:absolute; top:0; left:0; display:inline-block; width:320px; height:257px; z-index:5;\" target=\"_blank\" href=\"https://smashing.tools?ref=ned.im\">\n    </a>\n</div>\n\n<p>\n<button id=\"example-runner\" class=\"button\">Show me a notification</button>\n</p>\n\n<a class=\"github-button\" href=\"https://github.com/needim/noty\" data-icon=\"octicon-star\" data-size=\"large\" data-show-count=\"true\" aria-label=\"Star needim/noty on GitHub\">Star</a>\n<a class=\"github-button\" href=\"https://github.com/needim/noty/fork\" data-icon=\"octicon-repo-forked\" data-size=\"large\" data-show-count=\"true\" aria-label=\"Fork needim/noty on GitHub\">Fork</a>\n<a class=\"github-button\" href=\"https://github.com/needim/noty/subscription\" data-icon=\"octicon-eye\" data-size=\"large\" data-show-count=\"true\" aria-label=\"Watch needim/noty on GitHub\">Watch</a>\n<a class=\"github-button\" href=\"https://github.com/needim\" data-size=\"large\" data-show-count=\"true\" aria-label=\"Follow @needim on GitHub\">Follow @needim</a>\n\n<p align=\"left\">\n<a href=\"https://github.com/needim/noty/releases\"><img src=\"https://img.shields.io/github/release/needim/noty.svg\" alt=\"GitHub release\"></a>\n<a href=\"https://bower.io/\"><img src=\"https://img.shields.io/bower/v/noty.svg\" alt=\"Bower version\"></a>\n<a href=\"https://www.npmjs.com/package/noty\"><img src=\"https://img.shields.io/npm/v/noty.svg\" alt=\"NPM version\"></a>\n<a href=\"https://packagist.org/packages/needim/noty\"><img src=\"https://img.shields.io/packagist/v/needim/noty.svg\" alt=\"Packagist version\"></a>\n<br>\n<a href=\"https://www.npmjs.com/package/noty\"><img src=\"https://img.shields.io/npm/dm/noty.svg?label=npm%20downloads\" alt=\"NPM Downloads\"></a>\n<a href=\"https://github.com/needim/noty/graphs/contributors\"><img src=\"https://img.shields.io/github/contributors/needim/noty.svg\" alt=\"Contributors\"></a>\n</p>\n\n##  Sponsored By\n\n<div class=\"supported-by\" style=\"margin-right: 20px\">\n    <a target=\"_blank\" href=\"https://idealecasinos.nl/\">\n        <img src=\"_media/ideal_casinos_logo_140_140.svg\" width=\"120\" alt=\"online casinos met ideal\">\n    </a>\n</div>\n\n<div class=\"supported-by\">\n    <a target=\"_blank\" href=\"https://www.correctcasinos.com/free-slots/\">\n        <img src=\"_media/correct-casino-logo.svg\" width=\"250\" alt=\"Best Free Slots\">\n    </a>\n</div>\n\n<div class=\"supported-by\">\n    <a target=\"_blank\" href=\"https://www.browserstack.com?ref=notyjs\">\n        <img src=\"_media/browserstack.svg\" width=\"220\" alt=\"\">\n    </a>\n</div>\n\n<div class=\"supported-by\">\n    <a target=\"_blank\" href=\"https://www.boostmmr.com/\">\n        <img src=\"https://i.ibb.co/99682Vb/boostmmr.jpg\" width=\"180\" alt=\"\">\n    </a>\n</div>\n\n<div class=\"supported-by\">\n    <a target=\"_blank\" href=\"https://goread.io/buy-instagram-followers\">\n        <img src=\"_media/Favicongoread.png\" width=\"85\" alt=\"Buy Instagram Followers\">\n    </a>\n</div>\n\n<div class=\"supported-by\">\n    <a target=\"_blank\" href=\"https://nettikasinot.org\" style=\"background: #2B5FC1;\n    padding: 9px 10px 13px 10px;\">\n        <img src=\"_media/nettikasinot.svg\" width=\"185\" alt=\"Nettikasinot\">\n    </a>\n</div>\n\n<div class=\"supported-by\">\n    <a target=\"_blank\" href=\"https://www.gambledex.com/\">\n        <img src=\"_media/gambledex.png\" width=\"80\" alt=\"Gambledex\">\n    </a>\n</div>\n\n<div class=\"supported-by\">\n    <a target=\"_blank\" href=\"https://casinoshunter.com/online-casinos/real-money/\">\n        <img src=\"_media/casinoshunter-dark.png\" width=\"150\" alt=\"Casinos Hunter\">\n    </a>\n</div>\n\n<div class=\"supported-by\">\n    <a target=\"_blank\" href=\"https://reddogcasino.com/en/games/blackjack\">\n        <img src=\"_media/Red-Dog-Casino-Logo.png\" width=\"150\" alt=\"RedDogCasino\">\n    </a>\n</div>\n\n<div class=\"supported-by\">\n    <a target=\"_blank\" href=\"https://slotsempire.com\">\n        <img src=\"_media/slots-empire.webp\" width=\"150\" alt=\"Online Slots Empire Casino\">\n    </a>\n</div>\n\n##  Became a Patron\n\nIf you enjoy my work and want to support me creating stuff, I'm on Patreon!<br>\n<a class=\"jmgFob\" href=\"https://www.patreon.com/bePatron?u=5075261\" data-patreon-widget-type=\"become-patron-button\">\n<span class=\"sc-ifAKCX hyFnYR\"><svg viewBox=\"0 0 569 546\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"><title>Patreon logo</title><g><circle data-color=\"1\" id=\"Oval\" cx=\"362.589996\" cy=\"204.589996\" r=\"204.589996\"></circle><rect data-color=\"2\" id=\"Rectangle\" x=\"0\" y=\"0\" width=\"100\" height=\"545.799988\"></rect></g></svg></span>\nBecome a Patron!\n</a>\n\n!> v2 Documentation is <a href=\"/noty/v2\">here</a>\n\n## Features\n\n- Dependency-free\n- UMD\n- Web Push Notifications with Service Worker support\n- Named queue system\n- Has 11 layouts, 5 notification styles, 5+ themes\n- Custom container (inline notifications)\n- Confirm notifications\n- TTL with timeout option\n- Progress bar indicator for timed notifications\n- Supports css animations, **animate.css**, **mojs**, **bounce.js**, **velocity** and others\n- 2 close options: click, button\n- API & Callbacks\n- Custom templating\n- Document visibility control (blur, focus)\n"
  },
  {
    "path": "docs/_assets/docs.js",
    "content": "var velocityShow = function (promise) {\n  var n = this\n  $.Velocity(n.barDom, {\n    left: 450,\n    scaleY: 2\n  }, {\n      duration: 0\n    })\n  $.Velocity(n.barDom, {\n    left: 0,\n    scaleY: 1\n  }, {\n      easing: [8, 8],\n      complete: function () {\n        promise(function (resolve) {\n          resolve()\n        })\n      }\n    })\n}\n\nvar velocityClose = function (promise) {\n  var n = this\n  $.Velocity(n.barDom, {\n    left: '+=-50'\n  }, {\n      easing: [8, 8, 2],\n      duration: 350\n    })\n  $.Velocity(n.barDom, {\n    left: 450,\n    scaleY: .2,\n    height: 0,\n    margin: 0\n  }, {\n      easing: [8, 8],\n      complete: function () {\n        promise(function (resolve) {\n          resolve()\n        })\n      }\n    })\n}\n\nvar mojsShow = function (promise) {\n  var n = this\n  var Timeline = new mojs.Timeline()\n  var body = new mojs.Html({\n    el: n.barDom,\n    x: { 500: 0, delay: 0, duration: 500, easing: 'elastic.out' },\n    isForce3d: true,\n    onComplete: function () {\n      promise(function (resolve) {\n        resolve()\n      })\n    }\n  })\n\n  var parent = new mojs.Shape({\n    parent: n.barDom,\n    width: 200,\n    height: n.barDom.getBoundingClientRect().height,\n    radius: 0,\n    x: { [150]: -150 },\n    duration: 1.2 * 500,\n    isShowStart: true\n  })\n\n  n.barDom.style['overflow'] = 'visible'\n  parent.el.style['overflow'] = 'hidden'\n\n  var burst = new mojs.Burst({\n    parent: parent.el,\n    count: 10,\n    top: n.barDom.getBoundingClientRect().height + 75,\n    degree: 90,\n    radius: 75,\n    angle: { [-90]: 40 },\n    children: {\n      fill: '#EBD761',\n      delay: 'stagger(500, -50)',\n      radius: 'rand(8, 25)',\n      direction: -1,\n      isSwirl: true\n    }\n  })\n\n  var fadeBurst = new mojs.Burst({\n    parent: parent.el,\n    count: 2,\n    degree: 0,\n    angle: 75,\n    radius: { 0: 100 },\n    top: '90%',\n    children: {\n      fill: '#EBD761',\n      pathScale: [.65, 1],\n      radius: 'rand(12, 15)',\n      direction: [-1, 1],\n      delay: .8 * 500,\n      isSwirl: true\n    }\n  })\n\n  Timeline.add(body, burst, fadeBurst, parent)\n  Timeline.play()\n}\n\nvar mojsClose = function (promise) {\n  var n = this\n  new mojs.Html({\n    el: n.barDom,\n    x: { 0: 500, delay: 10, duration: 500, easing: 'cubic.out' },\n    isForce3d: true,\n    onComplete: function () {\n      promise(function (resolve) {\n        resolve()\n      })\n    }\n  }).play()\n}\n\nvar bouncejsShow = function (promise) {\n  var n = this\n  new Bounce()\n    .translate({\n      from: { x: 450, y: 0 }, to: { x: 0, y: 0 },\n      easing: 'bounce',\n      duration: 1000,\n      bounces: 4,\n      stiffness: 3\n    })\n    .scale({\n      from: { x: 1.2, y: 1 }, to: { x: 1, y: 1 },\n      easing: 'bounce',\n      duration: 1000,\n      delay: 100,\n      bounces: 4,\n      stiffness: 1\n    })\n    .scale({\n      from: { x: 1, y: 1.2 }, to: { x: 1, y: 1 },\n      easing: 'bounce',\n      duration: 1000,\n      delay: 100,\n      bounces: 6,\n      stiffness: 1\n    })\n    .applyTo(n.barDom, {\n      onComplete: function () {\n        promise(function (resolve) {\n          resolve()\n        })\n      }\n    })\n}\n\nvar bouncejsClose = function (promise) {\n  var n = this\n  new Bounce()\n    .translate({\n      from: { x: 0, y: 0 }, to: { x: 450, y: 0 },\n      easing: 'bounce',\n      duration: 500,\n      bounces: 4,\n      stiffness: 1\n    })\n    .applyTo(n.barDom, {\n      onComplete: function () {\n        promise(function (resolve) {\n          resolve()\n        })\n      }\n    })\n}\n\n$('body').on('click', '#example-runner', function (e) {\n  new Noty({\n    text: '<div class=\"text-left\">I\\'m an example notification. <strong>Hi!</strong></div>',\n    type: 'warning',\n    theme: 'mint',\n    layout: 'topRight',\n    timeout: 4000,\n    animation: {\n      open: mojsShow,\n      close: mojsClose\n    }\n  }).show()\n})\n\n$('body').on('click', '#example-animatecss', function (e) {\n  new Noty({\n    type: 'warning',\n    text: 'NOTY - a Dependency-free notification library!',\n    animation: {\n      open: 'animated bounceInRight', // Animate.css class names\n      close: 'animated bounceOutRight' // Animate.css class names\n    }\n  }).show();\n})\n\n$('body').on('click', '#example-bouncejs', function (e) {\n  new Noty({\n    type: 'warning',\n    text: 'NOTY - a Dependency-free notification library!',\n    animation: {\n      open: bouncejsShow,\n      close: bouncejsClose\n    }\n  }).show();\n})\n\n$('body').on('click', '#example-mojs', function (e) {\n  new Noty({\n    type: 'warning',\n    text: 'NOTY - a Dependency-free notification library!',\n    animation: {\n      open: mojsShow,\n      close: mojsClose\n    }\n  }).show();\n})\n\n$('body').on('click', '#example-velocity', function (e) {\n  new Noty({\n    type: 'warning',\n    text: 'NOTY - a Dependency-free notification library!',\n    animation: {\n      open: velocityShow,\n      close: velocityClose\n    }\n  }).show();\n})\n\nsetTimeout(function () {\n  new Noty({\n    text: '<div class=\"text-center\">Wubba lubba dub dub! <strong>v3.1.3 released!</strong></div>',\n    type: 'information',\n    theme: 'mint',\n    layout: 'topRight',\n    timeout: 4000,\n    animation: {\n      open: mojsShow,\n      close: mojsClose\n    }\n  }).show()\n}, 2000)\n\nfunction RenderPreviews () {\n  console.log(\"run\")\n\n  Noty.setMaxVisible(999999999);\n\n  $themePreview = $(\".theme-previews\")\n  $themePreviews = [\"mint\", \"sunset\", \"relax\", \"nest\", \"metroui\", \"semanticui\", \"light\", \"bootstrap-v3\", \"bootstrap-v4\"]\n  if ($themePreview.length != 0) {\n\n    $.each($themePreviews, function (i, theme) {\n\n      $(\".theme-preview-\" + theme).append($(\"<h4>\" + theme + \"</h4>\"))\n\n      console.log(theme)\n\n      generatePreview(theme, 'alert')\n      generatePreview(theme, 'success')\n      generatePreview(theme, 'warning')\n      generatePreview(theme, 'error')\n      generatePreview(theme, 'information')\n      generatePreview(theme, 'confirm')\n\n    });\n\n    function generatePreview (theme, type) {\n      var notes = [];\n      notes['alert'] = 'Best check yo self, you\\'re not looking too good.';\n      notes['error'] = 'Change a few things up and try submitting again.';\n      notes['success'] = 'You successfully read this important alert message.';\n      notes['information'] = 'This alert needs your attention, but it\\'s not super important.';\n      notes['warning'] = '<strong>Warning!</strong> <br /> Best check yo self, you\\'re not looking too good.';\n      notes['confirm'] = 'Do you want to continue?';\n      new Noty({\n        text: notes[type],\n        container: \".theme-preview-\" + theme,\n        type: type,\n        theme: theme,\n        dismissQueue: true,\n        force: false,\n        closeWith: [],\n        buttons: (type != 'confirm') ? false : [\n          Noty.button('YES', 'btn btn-success', function () {\n            console.log('button 1 clicked');\n          }),\n\n          Noty.button('NO', 'btn btn-error', function () {\n            console.log('button 2 clicked');\n          })\n        ]\n      }).show()\n    }\n\n  } else {\n    console.log(\"shit\")\n  }\n}\n\n"
  },
  {
    "path": "docs/_assets/docsify.js",
    "content": "(function () {\n'use strict';\n\n/**\n * Create a cached version of a pure function.\n */\nfunction cached (fn) {\n  var cache = Object.create(null);\n  return function cachedFn (str) {\n    var hit = cache[str];\n    return hit || (cache[str] = fn(str))\n  }\n}\n\n/**\n * Hyphenate a camelCase string.\n */\nvar hyphenate = cached(function (str) {\n  return str.replace(/([A-Z])/g, function (m) { return '-' + m.toLowerCase(); })\n});\n\n/**\n * Simple Object.assign polyfill\n */\nvar merge = Object.assign || function (to) {\n  var arguments$1 = arguments;\n\n  var hasOwn = Object.prototype.hasOwnProperty;\n\n  for (var i = 1; i < arguments.length; i++) {\n    var from = Object(arguments$1[i]);\n\n    for (var key in from) {\n      if (hasOwn.call(from, key)) {\n        to[key] = from[key];\n      }\n    }\n  }\n\n  return to\n};\n\n/**\n * Check if value is primitive\n */\nfunction isPrimitive (value) {\n  return typeof value === 'string' || typeof value === 'number'\n}\n\n/**\n * Perform no operation.\n */\nfunction noop () {}\n\n/**\n * Check if value is function\n */\nfunction isFn (obj) {\n  return typeof obj === 'function'\n}\n\nvar config = merge({\n  el: '#app',\n  repo: '',\n  maxLevel: 6,\n  subMaxLevel: 0,\n  loadSidebar: null,\n  loadNavbar: null,\n  homepage: 'README.md',\n  coverpage: '',\n  basePath: '',\n  auto2top: false,\n  name: '',\n  themeColor: '',\n  nameLink: window.location.pathname,\n  autoHeader: false,\n  executeScript: null,\n  noEmoji: false,\n  ga: '',\n  mergeNavbar: false,\n  formatUpdated: '',\n  externalLinkTarget: '_blank',\n  routerModel: 'hash',\n  noCompileLinks: []\n}, window.$docsify);\n\nvar script = document.currentScript ||\n  [].slice.call(document.getElementsByTagName('script'))\n    .filter(function (n) { return /docsify\\./.test(n.src); })[0];\n\nif (script) {\n  for (var prop in config) {\n    var val = script.getAttribute('data-' + hyphenate(prop));\n\n    if (isPrimitive(val)) {\n      config[prop] = val === '' ? true : val;\n    }\n  }\n\n  if (config.loadSidebar === true) { config.loadSidebar = '_sidebar.md'; }\n  if (config.loadNavbar === true) { config.loadNavbar = '_navbar.md'; }\n  if (config.coverpage === true) { config.coverpage = '_coverpage.md'; }\n  if (config.repo === true) { config.repo = ''; }\n  if (config.name === true) { config.name = ''; }\n}\n\nwindow.$docsify = config;\n\nfunction initLifecycle (vm) {\n  var hooks = [\n    'init',\n    'mounted',\n    'beforeEach',\n    'afterEach',\n    'doneEach',\n    'ready'\n  ];\n\n  vm._hooks = {};\n  vm._lifecycle = {};\n  hooks.forEach(function (hook) {\n    var arr = vm._hooks[hook] = [];\n    vm._lifecycle[hook] = function (fn) { return arr.push(fn); };\n  });\n}\n\nfunction callHook (vm, hook, data, next) {\n  if ( next === void 0 ) next = noop;\n\n  var queue = vm._hooks[hook];\n\n  var step = function (index) {\n    var hook = queue[index];\n    if (index >= queue.length) {\n      next(data);\n    } else {\n      if (typeof hook === 'function') {\n        if (hook.length === 2) {\n          hook(data, function (result) {\n            data = result;\n            step(index + 1);\n          });\n        } else {\n          var result = hook(data);\n          data = result !== undefined ? result : data;\n          step(index + 1);\n        }\n      } else {\n        step(index + 1);\n      }\n    }\n  };\n\n  step(0);\n}\n\nvar cacheNode = {};\n\n/**\n * Get Node\n * @param  {String|Element} el\n * @param  {Boolean} noCache\n * @return {Element}\n */\nfunction getNode (el, noCache) {\n  if ( noCache === void 0 ) noCache = false;\n\n  if (typeof el === 'string') {\n    if (typeof window.Vue !== 'undefined') {\n      return find(el)\n    }\n    el = noCache ? find(el) : (cacheNode[el] || (cacheNode[el] = find(el)));\n  }\n\n  return el\n}\n\nvar $ = document;\n\nvar body = $.body;\n\nvar head = $.head;\n\n/**\n * Find element\n * @example\n * find('nav') => document.querySelector('nav')\n * find(nav, 'a') => nav.querySelector('a')\n */\nfunction find (el, node) {\n  return node ? el.querySelector(node) : $.querySelector(el)\n}\n\n/**\n * Find all elements\n * @example\n * findAll('a') => [].slice.call(document.querySelectorAll('a'))\n * findAll(nav, 'a') => [].slice.call(nav.querySelectorAll('a'))\n */\nfunction findAll (el, node) {\n  return [].slice.call(node ? el.querySelectorAll(node) : $.querySelectorAll(el))\n}\n\nfunction create (node, tpl) {\n  node = $.createElement(node);\n  if (tpl) { node.innerHTML = tpl; }\n  return node\n}\n\nfunction appendTo (target, el) {\n  return target.appendChild(el)\n}\n\nfunction before (target, el) {\n  return target.insertBefore(el, target.children[0])\n}\n\nfunction on (el, type, handler) {\n  isFn(type)\n    ? window.addEventListener(el, type)\n    : el.addEventListener(type, handler);\n}\n\nfunction off (el, type, handler) {\n  isFn(type)\n    ? window.removeEventListener(el, type)\n    : el.removeEventListener(type, handler);\n}\n\n/**\n * Toggle class\n *\n * @example\n * toggleClass(el, 'active') => el.classList.toggle('active')\n * toggleClass(el, 'add', 'active') => el.classList.add('active')\n */\nfunction toggleClass (el, type, val) {\n  el && el.classList[val ? type : 'toggle'](val || type);\n}\n\n\nvar dom = Object.freeze({\n\tgetNode: getNode,\n\t$: $,\n\tbody: body,\n\thead: head,\n\tfind: find,\n\tfindAll: findAll,\n\tcreate: create,\n\tappendTo: appendTo,\n\tbefore: before,\n\ton: on,\n\toff: off,\n\ttoggleClass: toggleClass\n});\n\nvar inBrowser = typeof window !== 'undefined';\n\nvar isMobile = inBrowser && document.body.clientWidth <= 600;\n\n/**\n * @see https://github.com/MoOx/pjax/blob/master/lib/is-supported.js\n */\nvar supportsPushState = inBrowser && (function () {\n  // Borrowed wholesale from https://github.com/defunkt/jquery-pjax\n  return window.history &&\n    window.history.pushState &&\n    window.history.replaceState &&\n    // pushState isn’t reliable on iOS until 5.\n    !navigator.userAgent.match(/((iPod|iPhone|iPad).+\\bOS\\s+[1-4]\\D|WebApps\\/.+CFNetwork)/)\n})();\n\n/**\n * Render github corner\n * @param  {Object} data\n * @return {String}\n */\nfunction corner (data) {\n  if (!data) { return '' }\n  if (!/\\/\\//.test(data)) { data = 'https://github.com/' + data; }\n  data = data.replace(/^git\\+/, '');\n\n  return (\n  \"<a href=\\\"\" + data + \"\\\" class=\\\"github-corner\\\" aria-label=\\\"View source on Github\\\">\" +\n    '<svg viewBox=\"0 0 250 250\" aria-hidden=\"true\">' +\n      '<path d=\"M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z\"></path>' +\n      '<path d=\"M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2\" fill=\"currentColor\" style=\"transform-origin: 130px 106px;\" class=\"octo-arm\"></path>' +\n      '<path d=\"M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z\" fill=\"currentColor\" class=\"octo-body\"></path>' +\n    '</svg>' +\n  '</a>')\n}\n\n/**\n * Render main content\n */\nfunction main (config) {\n  var aside = (\n    '<button class=\"sidebar-toggle\">' +\n      '<div class=\"sidebar-toggle-button\">' +\n        '<span></span><span></span><span></span>' +\n      '</div>' +\n    '</button>' +\n    '<aside class=\"sidebar\">' +\n      (config.name\n        ? (\"<h1><a class=\\\"app-name-link\\\" data-nosearch>\" + (config.name) + \"</a></h1>\")\n        : '') +\n      '<div class=\"sidebar-nav\"><!--sidebar--></div>' +\n    '</aside>');\n\n  return (isMobile ? (aside + \"<main>\") : (\"<main>\" + aside)) +\n      '<section class=\"content\">' +\n        '<article class=\"markdown-section\" id=\"main\"><!--main--></article>' +\n      '</section>' +\n    '</main>'\n}\n\n/**\n * Cover Page\n */\nfunction cover () {\n  var SL = ', 100%, 85%';\n  var bgc = 'linear-gradient(to left bottom, ' +\n  \"hsl(\" + (Math.floor(Math.random() * 255) + SL) + \") 0%,\" +\n  \"hsl(\" + (Math.floor(Math.random() * 255) + SL) + \") 100%)\";\n\n  return \"<section class=\\\"cover\\\" style=\\\"background: \" + bgc + \"\\\">\" +\n    '<div class=\"cover-main\"></div>' +\n    '<div class=\"mask\"></div>' +\n  '</section>'\n}\n\n/**\n * Render tree\n * @param  {Array} tree\n * @param  {String} tpl\n * @return {String}\n */\nfunction tree (toc, tpl) {\n  if ( tpl === void 0 ) tpl = '';\n\n  if (!toc || !toc.length) { return '' }\n\n  toc.forEach(function (node) {\n    tpl += \"<li><a class=\\\"section-link\\\" href=\\\"\" + (node.slug) + \"\\\">\" + (node.title) + \"</a></li>\";\n    if (node.children) {\n      tpl += \"<li><ul class=\\\"children\\\">\" + (tree(node.children)) + \"</li></ul>\";\n    }\n  });\n\n  return tpl\n}\n\nfunction helper (className, content) {\n  return (\"<p class=\\\"\" + className + \"\\\">\" + (content.slice(5).trim()) + \"</p>\")\n}\n\nfunction theme (color) {\n  return (\"<style>:root{--theme-color: \" + color + \";}</style>\")\n}\n\nvar barEl;\nvar timeId;\n\n/**\n * Init progress component\n */\nfunction init () {\n  var div = create('div');\n\n  div.classList.add('progress');\n  appendTo(body, div);\n  barEl = div;\n}\n/**\n * Render progress bar\n */\nvar progressbar = function (ref) {\n  var loaded = ref.loaded;\n  var total = ref.total;\n  var step = ref.step;\n\n  var num;\n\n  !barEl && init();\n\n  if (step) {\n    num = parseInt(barEl.style.width || 0, 10) + step;\n    num = num > 80 ? 80 : num;\n  } else {\n    num = Math.floor(loaded / total * 100);\n  }\n\n  barEl.style.opacity = 1;\n  barEl.style.width = num >= 95 ? '100%' : num + '%';\n\n  if (num >= 95) {\n    clearTimeout(timeId);\n    timeId = setTimeout(function (_) {\n      barEl.style.opacity = 0;\n      barEl.style.width = '0%';\n    }, 200);\n  }\n};\n\nvar cache = {};\n\n/**\n * Simple ajax get\n * @param {string} url\n * @param {boolean} [hasBar=false] has progress bar\n * @return { then(resolve, reject), abort }\n */\nfunction get (url, hasBar) {\n  if ( hasBar === void 0 ) hasBar = false;\n\n  var xhr = new XMLHttpRequest();\n  var on = function () {\n    xhr.addEventListener.apply(xhr, arguments);\n  };\n  var cached$$1 = cache[url];\n\n  if (cached$$1) {\n    return { then: function (cb) { return cb(cached$$1.content, cached$$1.opt); }, abort: noop }\n  }\n\n  xhr.open('GET', url);\n  xhr.send();\n\n  return {\n    then: function (success, error) {\n      if ( error === void 0 ) error = noop;\n\n      if (hasBar) {\n        var id = setInterval(function (_) { return progressbar({\n          step: Math.floor(Math.random() * 5 + 1)\n        }); }, 500);\n\n        on('progress', progressbar);\n        on('loadend', function (evt) {\n          progressbar(evt);\n          clearInterval(id);\n        });\n      }\n\n      on('error', error);\n      on('load', function (ref) {\n        var target = ref.target;\n\n        if (target.status >= 400) {\n          error(target);\n        } else {\n          var result = cache[url] = {\n            content: target.response,\n            opt: {\n              updatedAt: xhr.getResponseHeader('last-modified')\n            }\n          };\n\n          success(result.content, result.opt);\n        }\n      });\n    },\n    abort: function (_) { return xhr.readyState !== 4 && xhr.abort(); }\n  }\n}\n\nfunction replaceVar (block, color) {\n  block.innerHTML = block.innerHTML\n    .replace(/var\\(\\s*--theme-color.*?\\)/g, color);\n}\n\nvar cssVars = function (color) {\n  // Variable support\n  if (window.CSS &&\n      window.CSS.supports &&\n      window.CSS.supports('(--v:red)')) { return }\n\n  var styleBlocks = findAll('style:not(.inserted),link');[].forEach.call(styleBlocks, function (block) {\n    if (block.nodeName === 'STYLE') {\n      replaceVar(block, color);\n    } else if (block.nodeName === 'LINK') {\n      var href = block.getAttribute('href');\n\n      if (!/\\.css$/.test(href)) { return }\n\n      get(href).then(function (res) {\n        var style = create('style', res);\n\n        head.appendChild(style);\n        replaceVar(style, color);\n      });\n    }\n  });\n};\n\nvar RGX = /([^{]*?)\\w(?=\\})/g;\n\nvar dict = {\n\tYYYY: 'getFullYear',\n\tYY: 'getYear',\n\tMM: function (d) {\n\t\treturn d.getMonth() + 1;\n\t},\n\tDD: 'getDate',\n\tHH: 'getHours',\n\tmm: 'getMinutes',\n\tss: 'getSeconds'\n};\n\nvar tinydate = function (str) {\n\tvar parts=[], offset=0;\n\tstr.replace(RGX, function (key, _, idx) {\n\t\t// save preceding string\n\t\tparts.push(str.substring(offset, idx - 1));\n\t\toffset = idx += key.length + 1;\n\t\t// save function\n\t\tparts.push(function(d){\n\t\t\treturn ('00' + (typeof dict[key]==='string' ? d[dict[key]]() : dict[key](d))).slice(-key.length);\n\t\t});\n\t});\n\n\tif (offset !== str.length) {\n\t\tparts.push(str.substring(offset));\n\t}\n\n\treturn function (arg) {\n\t\tvar out='', i=0, d=arg||new Date();\n\t\tfor (; i<parts.length; i++) {\n\t\t\tout += (typeof parts[i]==='string') ? parts[i] : parts[i](d);\n\t\t}\n\t\treturn out;\n\t};\n};\n\nvar commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n\n\n\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nvar marked = createCommonjsModule(function (module, exports) {\n/**\n * marked - a markdown parser\n * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)\n * https://github.com/chjj/marked\n */\n\n(function() {\n\n/**\n * Block-Level Grammar\n */\n\nvar block = {\n  newline: /^\\n+/,\n  code: /^( {4}[^\\n]+\\n*)+/,\n  fences: noop,\n  hr: /^( *[-*_]){3,} *(?:\\n+|$)/,\n  heading: /^ *(#{1,6}) *([^\\n]+?) *#* *(?:\\n+|$)/,\n  nptable: noop,\n  lheading: /^([^\\n]+)\\n *(=|-){2,} *(?:\\n+|$)/,\n  blockquote: /^( *>[^\\n]+(\\n(?!def)[^\\n]+)*\\n*)+/,\n  list: /^( *)(bull) [\\s\\S]+?(?:hr|def|\\n{2,}(?! )(?!\\1bull )\\n*|\\s*$)/,\n  html: /^ *(?:comment *(?:\\n|\\s*$)|closed *(?:\\n{2,}|\\s*$)|closing *(?:\\n{2,}|\\s*$))/,\n  def: /^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +[\"(]([^\\n]+)[\")])? *(?:\\n+|$)/,\n  table: noop,\n  paragraph: /^((?:[^\\n]+\\n?(?!hr|heading|lheading|blockquote|tag|def))+)\\n*/,\n  text: /^[^\\n]+/\n};\n\nblock.bullet = /(?:[*+-]|\\d+\\.)/;\nblock.item = /^( *)(bull) [^\\n]*(?:\\n(?!\\1bull )[^\\n]*)*/;\nblock.item = replace(block.item, 'gm')\n  (/bull/g, block.bullet)\n  ();\n\nblock.list = replace(block.list)\n  (/bull/g, block.bullet)\n  ('hr', '\\\\n+(?=\\\\1?(?:[-*_] *){3,}(?:\\\\n+|$))')\n  ('def', '\\\\n+(?=' + block.def.source + ')')\n  ();\n\nblock.blockquote = replace(block.blockquote)\n  ('def', block.def)\n  ();\n\nblock._tag = '(?!(?:'\n  + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code'\n  + '|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo'\n  + '|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:/|[^\\\\w\\\\s@]*@)\\\\b';\n\nblock.html = replace(block.html)\n  ('comment', /<!--[\\s\\S]*?-->/)\n  ('closed', /<(tag)[\\s\\S]+?<\\/\\1>/)\n  ('closing', /<tag(?:\"[^\"]*\"|'[^']*'|[^'\">])*?>/)\n  (/tag/g, block._tag)\n  ();\n\nblock.paragraph = replace(block.paragraph)\n  ('hr', block.hr)\n  ('heading', block.heading)\n  ('lheading', block.lheading)\n  ('blockquote', block.blockquote)\n  ('tag', '<' + block._tag)\n  ('def', block.def)\n  ();\n\n/**\n * Normal Block Grammar\n */\n\nblock.normal = merge({}, block);\n\n/**\n * GFM Block Grammar\n */\n\nblock.gfm = merge({}, block.normal, {\n  fences: /^ *(`{3,}|~{3,})[ \\.]*(\\S+)? *\\n([\\s\\S]*?)\\s*\\1 *(?:\\n+|$)/,\n  paragraph: /^/,\n  heading: /^ *(#{1,6}) +([^\\n]+?) *#* *(?:\\n+|$)/\n});\n\nblock.gfm.paragraph = replace(block.paragraph)\n  ('(?!', '(?!'\n    + block.gfm.fences.source.replace('\\\\1', '\\\\2') + '|'\n    + block.list.source.replace('\\\\1', '\\\\3') + '|')\n  ();\n\n/**\n * GFM + Tables Block Grammar\n */\n\nblock.tables = merge({}, block.gfm, {\n  nptable: /^ *(\\S.*\\|.*)\\n *([-:]+ *\\|[-| :]*)\\n((?:.*\\|.*(?:\\n|$))*)\\n*/,\n  table: /^ *\\|(.+)\\n *\\|( *[-:]+[-| :]*)\\n((?: *\\|.*(?:\\n|$))*)\\n*/\n});\n\n/**\n * Block Lexer\n */\n\nfunction Lexer(options) {\n  this.tokens = [];\n  this.tokens.links = {};\n  this.options = options || marked.defaults;\n  this.rules = block.normal;\n\n  if (this.options.gfm) {\n    if (this.options.tables) {\n      this.rules = block.tables;\n    } else {\n      this.rules = block.gfm;\n    }\n  }\n}\n\n/**\n * Expose Block Rules\n */\n\nLexer.rules = block;\n\n/**\n * Static Lex Method\n */\n\nLexer.lex = function(src, options) {\n  var lexer = new Lexer(options);\n  return lexer.lex(src);\n};\n\n/**\n * Preprocessing\n */\n\nLexer.prototype.lex = function(src) {\n  src = src\n    .replace(/\\r\\n|\\r/g, '\\n')\n    .replace(/\\t/g, '    ')\n    .replace(/\\u00a0/g, ' ')\n    .replace(/\\u2424/g, '\\n');\n\n  return this.token(src, true);\n};\n\n/**\n * Lexing\n */\n\nLexer.prototype.token = function(src, top, bq) {\n  var this$1 = this;\n\n  var src = src.replace(/^ +$/gm, '')\n    , next\n    , loose\n    , cap\n    , bull\n    , b\n    , item\n    , space\n    , i\n    , l;\n\n  while (src) {\n    // newline\n    if (cap = this$1.rules.newline.exec(src)) {\n      src = src.substring(cap[0].length);\n      if (cap[0].length > 1) {\n        this$1.tokens.push({\n          type: 'space'\n        });\n      }\n    }\n\n    // code\n    if (cap = this$1.rules.code.exec(src)) {\n      src = src.substring(cap[0].length);\n      cap = cap[0].replace(/^ {4}/gm, '');\n      this$1.tokens.push({\n        type: 'code',\n        text: !this$1.options.pedantic\n          ? cap.replace(/\\n+$/, '')\n          : cap\n      });\n      continue;\n    }\n\n    // fences (gfm)\n    if (cap = this$1.rules.fences.exec(src)) {\n      src = src.substring(cap[0].length);\n      this$1.tokens.push({\n        type: 'code',\n        lang: cap[2],\n        text: cap[3] || ''\n      });\n      continue;\n    }\n\n    // heading\n    if (cap = this$1.rules.heading.exec(src)) {\n      src = src.substring(cap[0].length);\n      this$1.tokens.push({\n        type: 'heading',\n        depth: cap[1].length,\n        text: cap[2]\n      });\n      continue;\n    }\n\n    // table no leading pipe (gfm)\n    if (top && (cap = this$1.rules.nptable.exec(src))) {\n      src = src.substring(cap[0].length);\n\n      item = {\n        type: 'table',\n        header: cap[1].replace(/^ *| *\\| *$/g, '').split(/ *\\| */),\n        align: cap[2].replace(/^ *|\\| *$/g, '').split(/ *\\| */),\n        cells: cap[3].replace(/\\n$/, '').split('\\n')\n      };\n\n      for (i = 0; i < item.align.length; i++) {\n        if (/^ *-+: *$/.test(item.align[i])) {\n          item.align[i] = 'right';\n        } else if (/^ *:-+: *$/.test(item.align[i])) {\n          item.align[i] = 'center';\n        } else if (/^ *:-+ *$/.test(item.align[i])) {\n          item.align[i] = 'left';\n        } else {\n          item.align[i] = null;\n        }\n      }\n\n      for (i = 0; i < item.cells.length; i++) {\n        item.cells[i] = item.cells[i].split(/ *\\| */);\n      }\n\n      this$1.tokens.push(item);\n\n      continue;\n    }\n\n    // lheading\n    if (cap = this$1.rules.lheading.exec(src)) {\n      src = src.substring(cap[0].length);\n      this$1.tokens.push({\n        type: 'heading',\n        depth: cap[2] === '=' ? 1 : 2,\n        text: cap[1]\n      });\n      continue;\n    }\n\n    // hr\n    if (cap = this$1.rules.hr.exec(src)) {\n      src = src.substring(cap[0].length);\n      this$1.tokens.push({\n        type: 'hr'\n      });\n      continue;\n    }\n\n    // blockquote\n    if (cap = this$1.rules.blockquote.exec(src)) {\n      src = src.substring(cap[0].length);\n\n      this$1.tokens.push({\n        type: 'blockquote_start'\n      });\n\n      cap = cap[0].replace(/^ *> ?/gm, '');\n\n      // Pass `top` to keep the current\n      // \"toplevel\" state. This is exactly\n      // how markdown.pl works.\n      this$1.token(cap, top, true);\n\n      this$1.tokens.push({\n        type: 'blockquote_end'\n      });\n\n      continue;\n    }\n\n    // list\n    if (cap = this$1.rules.list.exec(src)) {\n      src = src.substring(cap[0].length);\n      bull = cap[2];\n\n      this$1.tokens.push({\n        type: 'list_start',\n        ordered: bull.length > 1\n      });\n\n      // Get each top-level item.\n      cap = cap[0].match(this$1.rules.item);\n\n      next = false;\n      l = cap.length;\n      i = 0;\n\n      for (; i < l; i++) {\n        item = cap[i];\n\n        // Remove the list item's bullet\n        // so it is seen as the next token.\n        space = item.length;\n        item = item.replace(/^ *([*+-]|\\d+\\.) +/, '');\n\n        // Outdent whatever the\n        // list item contains. Hacky.\n        if (~item.indexOf('\\n ')) {\n          space -= item.length;\n          item = !this$1.options.pedantic\n            ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')\n            : item.replace(/^ {1,4}/gm, '');\n        }\n\n        // Determine whether the next list item belongs here.\n        // Backpedal if it does not belong in this list.\n        if (this$1.options.smartLists && i !== l - 1) {\n          b = block.bullet.exec(cap[i + 1])[0];\n          if (bull !== b && !(bull.length > 1 && b.length > 1)) {\n            src = cap.slice(i + 1).join('\\n') + src;\n            i = l - 1;\n          }\n        }\n\n        // Determine whether item is loose or not.\n        // Use: /(^|\\n)(?! )[^\\n]+\\n\\n(?!\\s*$)/\n        // for discount behavior.\n        loose = next || /\\n\\n(?!\\s*$)/.test(item);\n        if (i !== l - 1) {\n          next = item.charAt(item.length - 1) === '\\n';\n          if (!loose) { loose = next; }\n        }\n\n        this$1.tokens.push({\n          type: loose\n            ? 'loose_item_start'\n            : 'list_item_start'\n        });\n\n        // Recurse.\n        this$1.token(item, false, bq);\n\n        this$1.tokens.push({\n          type: 'list_item_end'\n        });\n      }\n\n      this$1.tokens.push({\n        type: 'list_end'\n      });\n\n      continue;\n    }\n\n    // html\n    if (cap = this$1.rules.html.exec(src)) {\n      src = src.substring(cap[0].length);\n      this$1.tokens.push({\n        type: this$1.options.sanitize\n          ? 'paragraph'\n          : 'html',\n        pre: !this$1.options.sanitizer\n          && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),\n        text: cap[0]\n      });\n      continue;\n    }\n\n    // def\n    if ((!bq && top) && (cap = this$1.rules.def.exec(src))) {\n      src = src.substring(cap[0].length);\n      this$1.tokens.links[cap[1].toLowerCase()] = {\n        href: cap[2],\n        title: cap[3]\n      };\n      continue;\n    }\n\n    // table (gfm)\n    if (top && (cap = this$1.rules.table.exec(src))) {\n      src = src.substring(cap[0].length);\n\n      item = {\n        type: 'table',\n        header: cap[1].replace(/^ *| *\\| *$/g, '').split(/ *\\| */),\n        align: cap[2].replace(/^ *|\\| *$/g, '').split(/ *\\| */),\n        cells: cap[3].replace(/(?: *\\| *)?\\n$/, '').split('\\n')\n      };\n\n      for (i = 0; i < item.align.length; i++) {\n        if (/^ *-+: *$/.test(item.align[i])) {\n          item.align[i] = 'right';\n        } else if (/^ *:-+: *$/.test(item.align[i])) {\n          item.align[i] = 'center';\n        } else if (/^ *:-+ *$/.test(item.align[i])) {\n          item.align[i] = 'left';\n        } else {\n          item.align[i] = null;\n        }\n      }\n\n      for (i = 0; i < item.cells.length; i++) {\n        item.cells[i] = item.cells[i]\n          .replace(/^ *\\| *| *\\| *$/g, '')\n          .split(/ *\\| */);\n      }\n\n      this$1.tokens.push(item);\n\n      continue;\n    }\n\n    // top-level paragraph\n    if (top && (cap = this$1.rules.paragraph.exec(src))) {\n      src = src.substring(cap[0].length);\n      this$1.tokens.push({\n        type: 'paragraph',\n        text: cap[1].charAt(cap[1].length - 1) === '\\n'\n          ? cap[1].slice(0, -1)\n          : cap[1]\n      });\n      continue;\n    }\n\n    // text\n    if (cap = this$1.rules.text.exec(src)) {\n      // Top-level should never reach here.\n      src = src.substring(cap[0].length);\n      this$1.tokens.push({\n        type: 'text',\n        text: cap[0]\n      });\n      continue;\n    }\n\n    if (src) {\n      throw new\n        Error('Infinite loop on byte: ' + src.charCodeAt(0));\n    }\n  }\n\n  return this.tokens;\n};\n\n/**\n * Inline-Level Grammar\n */\n\nvar inline = {\n  escape: /^\\\\([\\\\`*{}\\[\\]()#+\\-.!_>])/,\n  autolink: /^<([^ >]+(@|:\\/)[^ >]+)>/,\n  url: noop,\n  tag: /^<!--[\\s\\S]*?-->|^<\\/?\\w+(?:\"[^\"]*\"|'[^']*'|[^'\">])*?>/,\n  link: /^!?\\[(inside)\\]\\(href\\)/,\n  reflink: /^!?\\[(inside)\\]\\s*\\[([^\\]]*)\\]/,\n  nolink: /^!?\\[((?:\\[[^\\]]*\\]|[^\\[\\]])*)\\]/,\n  strong: /^__([\\s\\S]+?)__(?!_)|^\\*\\*([\\s\\S]+?)\\*\\*(?!\\*)/,\n  em: /^\\b_((?:[^_]|__)+?)_\\b|^\\*((?:\\*\\*|[\\s\\S])+?)\\*(?!\\*)/,\n  code: /^(`+)\\s*([\\s\\S]*?[^`])\\s*\\1(?!`)/,\n  br: /^ {2,}\\n(?!\\s*$)/,\n  del: noop,\n  text: /^[\\s\\S]+?(?=[\\\\<!\\[_*`]| {2,}\\n|$)/\n};\n\ninline._inside = /(?:\\[[^\\]]*\\]|[^\\[\\]]|\\](?=[^\\[]*\\]))*/;\ninline._href = /\\s*<?([\\s\\S]*?)>?(?:\\s+['\"]([\\s\\S]*?)['\"])?\\s*/;\n\ninline.link = replace(inline.link)\n  ('inside', inline._inside)\n  ('href', inline._href)\n  ();\n\ninline.reflink = replace(inline.reflink)\n  ('inside', inline._inside)\n  ();\n\n/**\n * Normal Inline Grammar\n */\n\ninline.normal = merge({}, inline);\n\n/**\n * Pedantic Inline Grammar\n */\n\ninline.pedantic = merge({}, inline.normal, {\n  strong: /^__(?=\\S)([\\s\\S]*?\\S)__(?!_)|^\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*(?!\\*)/,\n  em: /^_(?=\\S)([\\s\\S]*?\\S)_(?!_)|^\\*(?=\\S)([\\s\\S]*?\\S)\\*(?!\\*)/\n});\n\n/**\n * GFM Inline Grammar\n */\n\ninline.gfm = merge({}, inline.normal, {\n  escape: replace(inline.escape)('])', '~|])')(),\n  url: /^(https?:\\/\\/[^\\s<]+[^<.,:;\"')\\]\\s])/,\n  del: /^~~(?=\\S)([\\s\\S]*?\\S)~~/,\n  text: replace(inline.text)\n    (']|', '~]|')\n    ('|', '|https?://|')\n    ()\n});\n\n/**\n * GFM + Line Breaks Inline Grammar\n */\n\ninline.breaks = merge({}, inline.gfm, {\n  br: replace(inline.br)('{2,}', '*')(),\n  text: replace(inline.gfm.text)('{2,}', '*')()\n});\n\n/**\n * Inline Lexer & Compiler\n */\n\nfunction InlineLexer(links, options) {\n  this.options = options || marked.defaults;\n  this.links = links;\n  this.rules = inline.normal;\n  this.renderer = this.options.renderer || new Renderer;\n  this.renderer.options = this.options;\n\n  if (!this.links) {\n    throw new\n      Error('Tokens array requires a `links` property.');\n  }\n\n  if (this.options.gfm) {\n    if (this.options.breaks) {\n      this.rules = inline.breaks;\n    } else {\n      this.rules = inline.gfm;\n    }\n  } else if (this.options.pedantic) {\n    this.rules = inline.pedantic;\n  }\n}\n\n/**\n * Expose Inline Rules\n */\n\nInlineLexer.rules = inline;\n\n/**\n * Static Lexing/Compiling Method\n */\n\nInlineLexer.output = function(src, links, options) {\n  var inline = new InlineLexer(links, options);\n  return inline.output(src);\n};\n\n/**\n * Lexing/Compiling\n */\n\nInlineLexer.prototype.output = function(src) {\n  var this$1 = this;\n\n  var out = ''\n    , link\n    , text\n    , href\n    , cap;\n\n  while (src) {\n    // escape\n    if (cap = this$1.rules.escape.exec(src)) {\n      src = src.substring(cap[0].length);\n      out += cap[1];\n      continue;\n    }\n\n    // autolink\n    if (cap = this$1.rules.autolink.exec(src)) {\n      src = src.substring(cap[0].length);\n      if (cap[2] === '@') {\n        text = cap[1].charAt(6) === ':'\n          ? this$1.mangle(cap[1].substring(7))\n          : this$1.mangle(cap[1]);\n        href = this$1.mangle('mailto:') + text;\n      } else {\n        text = escape(cap[1]);\n        href = text;\n      }\n      out += this$1.renderer.link(href, null, text);\n      continue;\n    }\n\n    // url (gfm)\n    if (!this$1.inLink && (cap = this$1.rules.url.exec(src))) {\n      src = src.substring(cap[0].length);\n      text = escape(cap[1]);\n      href = text;\n      out += this$1.renderer.link(href, null, text);\n      continue;\n    }\n\n    // tag\n    if (cap = this$1.rules.tag.exec(src)) {\n      if (!this$1.inLink && /^<a /i.test(cap[0])) {\n        this$1.inLink = true;\n      } else if (this$1.inLink && /^<\\/a>/i.test(cap[0])) {\n        this$1.inLink = false;\n      }\n      src = src.substring(cap[0].length);\n      out += this$1.options.sanitize\n        ? this$1.options.sanitizer\n          ? this$1.options.sanitizer(cap[0])\n          : escape(cap[0])\n        : cap[0];\n      continue;\n    }\n\n    // link\n    if (cap = this$1.rules.link.exec(src)) {\n      src = src.substring(cap[0].length);\n      this$1.inLink = true;\n      out += this$1.outputLink(cap, {\n        href: cap[2],\n        title: cap[3]\n      });\n      this$1.inLink = false;\n      continue;\n    }\n\n    // reflink, nolink\n    if ((cap = this$1.rules.reflink.exec(src))\n        || (cap = this$1.rules.nolink.exec(src))) {\n      src = src.substring(cap[0].length);\n      link = (cap[2] || cap[1]).replace(/\\s+/g, ' ');\n      link = this$1.links[link.toLowerCase()];\n      if (!link || !link.href) {\n        out += cap[0].charAt(0);\n        src = cap[0].substring(1) + src;\n        continue;\n      }\n      this$1.inLink = true;\n      out += this$1.outputLink(cap, link);\n      this$1.inLink = false;\n      continue;\n    }\n\n    // strong\n    if (cap = this$1.rules.strong.exec(src)) {\n      src = src.substring(cap[0].length);\n      out += this$1.renderer.strong(this$1.output(cap[2] || cap[1]));\n      continue;\n    }\n\n    // em\n    if (cap = this$1.rules.em.exec(src)) {\n      src = src.substring(cap[0].length);\n      out += this$1.renderer.em(this$1.output(cap[2] || cap[1]));\n      continue;\n    }\n\n    // code\n    if (cap = this$1.rules.code.exec(src)) {\n      src = src.substring(cap[0].length);\n      out += this$1.renderer.codespan(escape(cap[2], true));\n      continue;\n    }\n\n    // br\n    if (cap = this$1.rules.br.exec(src)) {\n      src = src.substring(cap[0].length);\n      out += this$1.renderer.br();\n      continue;\n    }\n\n    // del (gfm)\n    if (cap = this$1.rules.del.exec(src)) {\n      src = src.substring(cap[0].length);\n      out += this$1.renderer.del(this$1.output(cap[1]));\n      continue;\n    }\n\n    // text\n    if (cap = this$1.rules.text.exec(src)) {\n      src = src.substring(cap[0].length);\n      out += this$1.renderer.text(escape(this$1.smartypants(cap[0])));\n      continue;\n    }\n\n    if (src) {\n      throw new\n        Error('Infinite loop on byte: ' + src.charCodeAt(0));\n    }\n  }\n\n  return out;\n};\n\n/**\n * Compile Link\n */\n\nInlineLexer.prototype.outputLink = function(cap, link) {\n  var href = escape(link.href)\n    , title = link.title ? escape(link.title) : null;\n\n  return cap[0].charAt(0) !== '!'\n    ? this.renderer.link(href, title, this.output(cap[1]))\n    : this.renderer.image(href, title, escape(cap[1]));\n};\n\n/**\n * Smartypants Transformations\n */\n\nInlineLexer.prototype.smartypants = function(text) {\n  if (!this.options.smartypants) { return text; }\n  return text\n    // em-dashes\n    .replace(/---/g, '\\u2014')\n    // en-dashes\n    .replace(/--/g, '\\u2013')\n    // opening singles\n    .replace(/(^|[-\\u2014/(\\[{\"\\s])'/g, '$1\\u2018')\n    // closing singles & apostrophes\n    .replace(/'/g, '\\u2019')\n    // opening doubles\n    .replace(/(^|[-\\u2014/(\\[{\\u2018\\s])\"/g, '$1\\u201c')\n    // closing doubles\n    .replace(/\"/g, '\\u201d')\n    // ellipses\n    .replace(/\\.{3}/g, '\\u2026');\n};\n\n/**\n * Mangle Links\n */\n\nInlineLexer.prototype.mangle = function(text) {\n  if (!this.options.mangle) { return text; }\n  var out = ''\n    , l = text.length\n    , i = 0\n    , ch;\n\n  for (; i < l; i++) {\n    ch = text.charCodeAt(i);\n    if (Math.random() > 0.5) {\n      ch = 'x' + ch.toString(16);\n    }\n    out += '&#' + ch + ';';\n  }\n\n  return out;\n};\n\n/**\n * Renderer\n */\n\nfunction Renderer(options) {\n  this.options = options || {};\n}\n\nRenderer.prototype.code = function(code, lang, escaped) {\n  if (this.options.highlight) {\n    var out = this.options.highlight(code, lang);\n    if (out != null && out !== code) {\n      escaped = true;\n      code = out;\n    }\n  }\n\n  if (!lang) {\n    return '<pre><code>'\n      + (escaped ? code : escape(code, true))\n      + '\\n</code></pre>';\n  }\n\n  return '<pre><code class=\"'\n    + this.options.langPrefix\n    + escape(lang, true)\n    + '\">'\n    + (escaped ? code : escape(code, true))\n    + '\\n</code></pre>\\n';\n};\n\nRenderer.prototype.blockquote = function(quote) {\n  return '<blockquote>\\n' + quote + '</blockquote>\\n';\n};\n\nRenderer.prototype.html = function(html) {\n  return html;\n};\n\nRenderer.prototype.heading = function(text, level, raw) {\n  return '<h'\n    + level\n    + ' id=\"'\n    + this.options.headerPrefix\n    + raw.toLowerCase().replace(/[^\\w]+/g, '-')\n    + '\">'\n    + text\n    + '</h'\n    + level\n    + '>\\n';\n};\n\nRenderer.prototype.hr = function() {\n  return this.options.xhtml ? '<hr/>\\n' : '<hr>\\n';\n};\n\nRenderer.prototype.list = function(body, ordered) {\n  var type = ordered ? 'ol' : 'ul';\n  return '<' + type + '>\\n' + body + '</' + type + '>\\n';\n};\n\nRenderer.prototype.listitem = function(text) {\n  return '<li>' + text + '</li>\\n';\n};\n\nRenderer.prototype.paragraph = function(text) {\n  return '<p>' + text + '</p>\\n';\n};\n\nRenderer.prototype.table = function(header, body) {\n  return '<table>\\n'\n    + '<thead>\\n'\n    + header\n    + '</thead>\\n'\n    + '<tbody>\\n'\n    + body\n    + '</tbody>\\n'\n    + '</table>\\n';\n};\n\nRenderer.prototype.tablerow = function(content) {\n  return '<tr>\\n' + content + '</tr>\\n';\n};\n\nRenderer.prototype.tablecell = function(content, flags) {\n  var type = flags.header ? 'th' : 'td';\n  var tag = flags.align\n    ? '<' + type + ' style=\"text-align:' + flags.align + '\">'\n    : '<' + type + '>';\n  return tag + content + '</' + type + '>\\n';\n};\n\n// span level renderer\nRenderer.prototype.strong = function(text) {\n  return '<strong>' + text + '</strong>';\n};\n\nRenderer.prototype.em = function(text) {\n  return '<em>' + text + '</em>';\n};\n\nRenderer.prototype.codespan = function(text) {\n  return '<code>' + text + '</code>';\n};\n\nRenderer.prototype.br = function() {\n  return this.options.xhtml ? '<br/>' : '<br>';\n};\n\nRenderer.prototype.del = function(text) {\n  return '<del>' + text + '</del>';\n};\n\nRenderer.prototype.link = function(href, title, text) {\n  if (this.options.sanitize) {\n    try {\n      var prot = decodeURIComponent(unescape(href))\n        .replace(/[^\\w:]/g, '')\n        .toLowerCase();\n    } catch (e) {\n      return '';\n    }\n    if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0) {\n      return '';\n    }\n  }\n  var out = '<a href=\"' + href + '\"';\n  if (title) {\n    out += ' title=\"' + title + '\"';\n  }\n  out += '>' + text + '</a>';\n  return out;\n};\n\nRenderer.prototype.image = function(href, title, text) {\n  var out = '<img src=\"' + href + '\" alt=\"' + text + '\"';\n  if (title) {\n    out += ' title=\"' + title + '\"';\n  }\n  out += this.options.xhtml ? '/>' : '>';\n  return out;\n};\n\nRenderer.prototype.text = function(text) {\n  return text;\n};\n\n/**\n * Parsing & Compiling\n */\n\nfunction Parser(options) {\n  this.tokens = [];\n  this.token = null;\n  this.options = options || marked.defaults;\n  this.options.renderer = this.options.renderer || new Renderer;\n  this.renderer = this.options.renderer;\n  this.renderer.options = this.options;\n}\n\n/**\n * Static Parse Method\n */\n\nParser.parse = function(src, options, renderer) {\n  var parser = new Parser(options, renderer);\n  return parser.parse(src);\n};\n\n/**\n * Parse Loop\n */\n\nParser.prototype.parse = function(src) {\n  var this$1 = this;\n\n  this.inline = new InlineLexer(src.links, this.options, this.renderer);\n  this.tokens = src.reverse();\n\n  var out = '';\n  while (this.next()) {\n    out += this$1.tok();\n  }\n\n  return out;\n};\n\n/**\n * Next Token\n */\n\nParser.prototype.next = function() {\n  return this.token = this.tokens.pop();\n};\n\n/**\n * Preview Next Token\n */\n\nParser.prototype.peek = function() {\n  return this.tokens[this.tokens.length - 1] || 0;\n};\n\n/**\n * Parse Text Tokens\n */\n\nParser.prototype.parseText = function() {\n  var this$1 = this;\n\n  var body = this.token.text;\n\n  while (this.peek().type === 'text') {\n    body += '\\n' + this$1.next().text;\n  }\n\n  return this.inline.output(body);\n};\n\n/**\n * Parse Current Token\n */\n\nParser.prototype.tok = function() {\n  var this$1 = this;\n\n  switch (this.token.type) {\n    case 'space': {\n      return '';\n    }\n    case 'hr': {\n      return this.renderer.hr();\n    }\n    case 'heading': {\n      return this.renderer.heading(\n        this.inline.output(this.token.text),\n        this.token.depth,\n        this.token.text);\n    }\n    case 'code': {\n      return this.renderer.code(this.token.text,\n        this.token.lang,\n        this.token.escaped);\n    }\n    case 'table': {\n      var header = ''\n        , body = ''\n        , i\n        , row\n        , cell\n        , flags\n        , j;\n\n      // header\n      cell = '';\n      for (i = 0; i < this.token.header.length; i++) {\n        flags = { header: true, align: this$1.token.align[i] };\n        cell += this$1.renderer.tablecell(\n          this$1.inline.output(this$1.token.header[i]),\n          { header: true, align: this$1.token.align[i] }\n        );\n      }\n      header += this.renderer.tablerow(cell);\n\n      for (i = 0; i < this.token.cells.length; i++) {\n        row = this$1.token.cells[i];\n\n        cell = '';\n        for (j = 0; j < row.length; j++) {\n          cell += this$1.renderer.tablecell(\n            this$1.inline.output(row[j]),\n            { header: false, align: this$1.token.align[j] }\n          );\n        }\n\n        body += this$1.renderer.tablerow(cell);\n      }\n      return this.renderer.table(header, body);\n    }\n    case 'blockquote_start': {\n      var body = '';\n\n      while (this.next().type !== 'blockquote_end') {\n        body += this$1.tok();\n      }\n\n      return this.renderer.blockquote(body);\n    }\n    case 'list_start': {\n      var body = ''\n        , ordered = this.token.ordered;\n\n      while (this.next().type !== 'list_end') {\n        body += this$1.tok();\n      }\n\n      return this.renderer.list(body, ordered);\n    }\n    case 'list_item_start': {\n      var body = '';\n\n      while (this.next().type !== 'list_item_end') {\n        body += this$1.token.type === 'text'\n          ? this$1.parseText()\n          : this$1.tok();\n      }\n\n      return this.renderer.listitem(body);\n    }\n    case 'loose_item_start': {\n      var body = '';\n\n      while (this.next().type !== 'list_item_end') {\n        body += this$1.tok();\n      }\n\n      return this.renderer.listitem(body);\n    }\n    case 'html': {\n      var html = !this.token.pre && !this.options.pedantic\n        ? this.inline.output(this.token.text)\n        : this.token.text;\n      return this.renderer.html(html);\n    }\n    case 'paragraph': {\n      return this.renderer.paragraph(this.inline.output(this.token.text));\n    }\n    case 'text': {\n      return this.renderer.paragraph(this.parseText());\n    }\n  }\n};\n\n/**\n * Helpers\n */\n\nfunction escape(html, encode) {\n  return html\n    .replace(!encode ? /&(?!#?\\w+;)/g : /&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n    .replace(/\"/g, '&quot;')\n    .replace(/'/g, '&#39;');\n}\n\nfunction unescape(html) {\n\t// explicitly match decimal, hex, and named HTML entities \n  return html.replace(/&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/g, function(_, n) {\n    n = n.toLowerCase();\n    if (n === 'colon') { return ':'; }\n    if (n.charAt(0) === '#') {\n      return n.charAt(1) === 'x'\n        ? String.fromCharCode(parseInt(n.substring(2), 16))\n        : String.fromCharCode(+n.substring(1));\n    }\n    return '';\n  });\n}\n\nfunction replace(regex, opt) {\n  regex = regex.source;\n  opt = opt || '';\n  return function self(name, val) {\n    if (!name) { return new RegExp(regex, opt); }\n    val = val.source || val;\n    val = val.replace(/(^|[^\\[])\\^/g, '$1');\n    regex = regex.replace(name, val);\n    return self;\n  };\n}\n\nfunction noop() {}\nnoop.exec = noop;\n\nfunction merge(obj) {\n  var arguments$1 = arguments;\n\n  var i = 1\n    , target\n    , key;\n\n  for (; i < arguments.length; i++) {\n    target = arguments$1[i];\n    for (key in target) {\n      if (Object.prototype.hasOwnProperty.call(target, key)) {\n        obj[key] = target[key];\n      }\n    }\n  }\n\n  return obj;\n}\n\n\n/**\n * Marked\n */\n\nfunction marked(src, opt, callback) {\n  if (callback || typeof opt === 'function') {\n    if (!callback) {\n      callback = opt;\n      opt = null;\n    }\n\n    opt = merge({}, marked.defaults, opt || {});\n\n    var highlight = opt.highlight\n      , tokens\n      , pending\n      , i = 0;\n\n    try {\n      tokens = Lexer.lex(src, opt);\n    } catch (e) {\n      return callback(e);\n    }\n\n    pending = tokens.length;\n\n    var done = function(err) {\n      if (err) {\n        opt.highlight = highlight;\n        return callback(err);\n      }\n\n      var out;\n\n      try {\n        out = Parser.parse(tokens, opt);\n      } catch (e) {\n        err = e;\n      }\n\n      opt.highlight = highlight;\n\n      return err\n        ? callback(err)\n        : callback(null, out);\n    };\n\n    if (!highlight || highlight.length < 3) {\n      return done();\n    }\n\n    delete opt.highlight;\n\n    if (!pending) { return done(); }\n\n    for (; i < tokens.length; i++) {\n      (function(token) {\n        if (token.type !== 'code') {\n          return --pending || done();\n        }\n        return highlight(token.text, token.lang, function(err, code) {\n          if (err) { return done(err); }\n          if (code == null || code === token.text) {\n            return --pending || done();\n          }\n          token.text = code;\n          token.escaped = true;\n          --pending || done();\n        });\n      })(tokens[i]);\n    }\n\n    return;\n  }\n  try {\n    if (opt) { opt = merge({}, marked.defaults, opt); }\n    return Parser.parse(Lexer.lex(src, opt), opt);\n  } catch (e) {\n    e.message += '\\nPlease report this to https://github.com/chjj/marked.';\n    if ((opt || marked.defaults).silent) {\n      return '<p>An error occured:</p><pre>'\n        + escape(e.message + '', true)\n        + '</pre>';\n    }\n    throw e;\n  }\n}\n\n/**\n * Options\n */\n\nmarked.options =\nmarked.setOptions = function(opt) {\n  merge(marked.defaults, opt);\n  return marked;\n};\n\nmarked.defaults = {\n  gfm: true,\n  tables: true,\n  breaks: false,\n  pedantic: false,\n  sanitize: false,\n  sanitizer: null,\n  mangle: true,\n  smartLists: false,\n  silent: false,\n  highlight: null,\n  langPrefix: 'lang-',\n  smartypants: false,\n  headerPrefix: '',\n  renderer: new Renderer,\n  xhtml: false\n};\n\n/**\n * Expose\n */\n\nmarked.Parser = Parser;\nmarked.parser = Parser.parse;\n\nmarked.Renderer = Renderer;\n\nmarked.Lexer = Lexer;\nmarked.lexer = Lexer.lex;\n\nmarked.InlineLexer = InlineLexer;\nmarked.inlineLexer = InlineLexer.output;\n\nmarked.parse = marked;\n\n{\n  module.exports = marked;\n}\n\n}).call(function() {\n  return this || (typeof window !== 'undefined' ? window : commonjsGlobal);\n}());\n});\n\nvar prism = createCommonjsModule(function (module) {\n/* **********************************************\n     Begin prism-core.js\n********************************************** */\n\nvar _self = (typeof window !== 'undefined')\n\t? window   // if in browser\n\t: (\n\t\t(typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope)\n\t\t? self // if in worker\n\t\t: {}   // if in node js\n\t);\n\n/**\n * Prism: Lightweight, robust, elegant syntax highlighting\n * MIT license http://www.opensource.org/licenses/mit-license.php/\n * @author Lea Verou http://lea.verou.me\n */\n\nvar Prism = (function(){\n\n// Private helper vars\nvar lang = /\\blang(?:uage)?-(\\w+)\\b/i;\nvar uniqueId = 0;\n\nvar _ = _self.Prism = {\n\tutil: {\n\t\tencode: function (tokens) {\n\t\t\tif (tokens instanceof Token) {\n\t\t\t\treturn new Token(tokens.type, _.util.encode(tokens.content), tokens.alias);\n\t\t\t} else if (_.util.type(tokens) === 'Array') {\n\t\t\t\treturn tokens.map(_.util.encode);\n\t\t\t} else {\n\t\t\t\treturn tokens.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/\\u00a0/g, ' ');\n\t\t\t}\n\t\t},\n\n\t\ttype: function (o) {\n\t\t\treturn Object.prototype.toString.call(o).match(/\\[object (\\w+)\\]/)[1];\n\t\t},\n\n\t\tobjId: function (obj) {\n\t\t\tif (!obj['__id']) {\n\t\t\t\tObject.defineProperty(obj, '__id', { value: ++uniqueId });\n\t\t\t}\n\t\t\treturn obj['__id'];\n\t\t},\n\n\t\t// Deep clone a language definition (e.g. to extend it)\n\t\tclone: function (o) {\n\t\t\tvar type = _.util.type(o);\n\n\t\t\tswitch (type) {\n\t\t\t\tcase 'Object':\n\t\t\t\t\tvar clone = {};\n\n\t\t\t\t\tfor (var key in o) {\n\t\t\t\t\t\tif (o.hasOwnProperty(key)) {\n\t\t\t\t\t\t\tclone[key] = _.util.clone(o[key]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn clone;\n\n\t\t\t\tcase 'Array':\n\t\t\t\t\t// Check for existence for IE8\n\t\t\t\t\treturn o.map && o.map(function(v) { return _.util.clone(v); });\n\t\t\t}\n\n\t\t\treturn o;\n\t\t}\n\t},\n\n\tlanguages: {\n\t\textend: function (id, redef) {\n\t\t\tvar lang = _.util.clone(_.languages[id]);\n\n\t\t\tfor (var key in redef) {\n\t\t\t\tlang[key] = redef[key];\n\t\t\t}\n\n\t\t\treturn lang;\n\t\t},\n\n\t\t/**\n\t\t * Insert a token before another token in a language literal\n\t\t * As this needs to recreate the object (we cannot actually insert before keys in object literals),\n\t\t * we cannot just provide an object, we need anobject and a key.\n\t\t * @param inside The key (or language id) of the parent\n\t\t * @param before The key to insert before. If not provided, the function appends instead.\n\t\t * @param insert Object with the key/value pairs to insert\n\t\t * @param root The object that contains `inside`. If equal to Prism.languages, it can be omitted.\n\t\t */\n\t\tinsertBefore: function (inside, before, insert, root) {\n\t\t\troot = root || _.languages;\n\t\t\tvar grammar = root[inside];\n\n\t\t\tif (arguments.length == 2) {\n\t\t\t\tinsert = arguments[1];\n\n\t\t\t\tfor (var newToken in insert) {\n\t\t\t\t\tif (insert.hasOwnProperty(newToken)) {\n\t\t\t\t\t\tgrammar[newToken] = insert[newToken];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn grammar;\n\t\t\t}\n\n\t\t\tvar ret = {};\n\n\t\t\tfor (var token in grammar) {\n\n\t\t\t\tif (grammar.hasOwnProperty(token)) {\n\n\t\t\t\t\tif (token == before) {\n\n\t\t\t\t\t\tfor (var newToken in insert) {\n\n\t\t\t\t\t\t\tif (insert.hasOwnProperty(newToken)) {\n\t\t\t\t\t\t\t\tret[newToken] = insert[newToken];\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\tret[token] = grammar[token];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Update references in other language definitions\n\t\t\t_.languages.DFS(_.languages, function(key, value) {\n\t\t\t\tif (value === root[inside] && key != inside) {\n\t\t\t\t\tthis[key] = ret;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn root[inside] = ret;\n\t\t},\n\n\t\t// Traverse a language definition with Depth First Search\n\t\tDFS: function(o, callback, type, visited) {\n\t\t\tvisited = visited || {};\n\t\t\tfor (var i in o) {\n\t\t\t\tif (o.hasOwnProperty(i)) {\n\t\t\t\t\tcallback.call(o, i, o[i], type || i);\n\n\t\t\t\t\tif (_.util.type(o[i]) === 'Object' && !visited[_.util.objId(o[i])]) {\n\t\t\t\t\t\tvisited[_.util.objId(o[i])] = true;\n\t\t\t\t\t\t_.languages.DFS(o[i], callback, null, visited);\n\t\t\t\t\t}\n\t\t\t\t\telse if (_.util.type(o[i]) === 'Array' && !visited[_.util.objId(o[i])]) {\n\t\t\t\t\t\tvisited[_.util.objId(o[i])] = true;\n\t\t\t\t\t\t_.languages.DFS(o[i], callback, i, visited);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tplugins: {},\n\n\thighlightAll: function(async, callback) {\n\t\tvar env = {\n\t\t\tcallback: callback,\n\t\t\tselector: 'code[class*=\"language-\"], [class*=\"language-\"] code, code[class*=\"lang-\"], [class*=\"lang-\"] code'\n\t\t};\n\n\t\t_.hooks.run(\"before-highlightall\", env);\n\n\t\tvar elements = env.elements || document.querySelectorAll(env.selector);\n\n\t\tfor (var i=0, element; element = elements[i++];) {\n\t\t\t_.highlightElement(element, async === true, env.callback);\n\t\t}\n\t},\n\n\thighlightElement: function(element, async, callback) {\n\t\t// Find language\n\t\tvar language, grammar, parent = element;\n\n\t\twhile (parent && !lang.test(parent.className)) {\n\t\t\tparent = parent.parentNode;\n\t\t}\n\n\t\tif (parent) {\n\t\t\tlanguage = (parent.className.match(lang) || [,''])[1].toLowerCase();\n\t\t\tgrammar = _.languages[language];\n\t\t}\n\n\t\t// Set language on the element, if not present\n\t\telement.className = element.className.replace(lang, '').replace(/\\s+/g, ' ') + ' language-' + language;\n\n\t\t// Set language on the parent, for styling\n\t\tparent = element.parentNode;\n\n\t\tif (/pre/i.test(parent.nodeName)) {\n\t\t\tparent.className = parent.className.replace(lang, '').replace(/\\s+/g, ' ') + ' language-' + language;\n\t\t}\n\n\t\tvar code = element.textContent;\n\n\t\tvar env = {\n\t\t\telement: element,\n\t\t\tlanguage: language,\n\t\t\tgrammar: grammar,\n\t\t\tcode: code\n\t\t};\n\n\t\t_.hooks.run('before-sanity-check', env);\n\n\t\tif (!env.code || !env.grammar) {\n\t\t\tif (env.code) {\n\t\t\t\tenv.element.textContent = env.code;\n\t\t\t}\n\t\t\t_.hooks.run('complete', env);\n\t\t\treturn;\n\t\t}\n\n\t\t_.hooks.run('before-highlight', env);\n\n\t\tif (async && _self.Worker) {\n\t\t\tvar worker = new Worker(_.filename);\n\n\t\t\tworker.onmessage = function(evt) {\n\t\t\t\tenv.highlightedCode = evt.data;\n\n\t\t\t\t_.hooks.run('before-insert', env);\n\n\t\t\t\tenv.element.innerHTML = env.highlightedCode;\n\n\t\t\t\tcallback && callback.call(env.element);\n\t\t\t\t_.hooks.run('after-highlight', env);\n\t\t\t\t_.hooks.run('complete', env);\n\t\t\t};\n\n\t\t\tworker.postMessage(JSON.stringify({\n\t\t\t\tlanguage: env.language,\n\t\t\t\tcode: env.code,\n\t\t\t\timmediateClose: true\n\t\t\t}));\n\t\t}\n\t\telse {\n\t\t\tenv.highlightedCode = _.highlight(env.code, env.grammar, env.language);\n\n\t\t\t_.hooks.run('before-insert', env);\n\n\t\t\tenv.element.innerHTML = env.highlightedCode;\n\n\t\t\tcallback && callback.call(element);\n\n\t\t\t_.hooks.run('after-highlight', env);\n\t\t\t_.hooks.run('complete', env);\n\t\t}\n\t},\n\n\thighlight: function (text, grammar, language) {\n\t\tvar tokens = _.tokenize(text, grammar);\n\t\treturn Token.stringify(_.util.encode(tokens), language);\n\t},\n\n\ttokenize: function(text, grammar, language) {\n\t\tvar Token = _.Token;\n\n\t\tvar strarr = [text];\n\n\t\tvar rest = grammar.rest;\n\n\t\tif (rest) {\n\t\t\tfor (var token in rest) {\n\t\t\t\tgrammar[token] = rest[token];\n\t\t\t}\n\n\t\t\tdelete grammar.rest;\n\t\t}\n\n\t\ttokenloop: for (var token in grammar) {\n\t\t\tif(!grammar.hasOwnProperty(token) || !grammar[token]) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar patterns = grammar[token];\n\t\t\tpatterns = (_.util.type(patterns) === \"Array\") ? patterns : [patterns];\n\n\t\t\tfor (var j = 0; j < patterns.length; ++j) {\n\t\t\t\tvar pattern = patterns[j],\n\t\t\t\t\tinside = pattern.inside,\n\t\t\t\t\tlookbehind = !!pattern.lookbehind,\n\t\t\t\t\tgreedy = !!pattern.greedy,\n\t\t\t\t\tlookbehindLength = 0,\n\t\t\t\t\talias = pattern.alias;\n\n\t\t\t\tif (greedy && !pattern.pattern.global) {\n\t\t\t\t\t// Without the global flag, lastIndex won't work\n\t\t\t\t\tvar flags = pattern.pattern.toString().match(/[imuy]*$/)[0];\n\t\t\t\t\tpattern.pattern = RegExp(pattern.pattern.source, flags + \"g\");\n\t\t\t\t}\n\n\t\t\t\tpattern = pattern.pattern || pattern;\n\n\t\t\t\t// Don’t cache length as it changes during the loop\n\t\t\t\tfor (var i=0, pos = 0; i<strarr.length; pos += strarr[i].length, ++i) {\n\n\t\t\t\t\tvar str = strarr[i];\n\n\t\t\t\t\tif (strarr.length > text.length) {\n\t\t\t\t\t\t// Something went terribly wrong, ABORT, ABORT!\n\t\t\t\t\t\tbreak tokenloop;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (str instanceof Token) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tpattern.lastIndex = 0;\n\n\t\t\t\t\tvar match = pattern.exec(str),\n\t\t\t\t\t    delNum = 1;\n\n\t\t\t\t\t// Greedy patterns can override/remove up to two previously matched tokens\n\t\t\t\t\tif (!match && greedy && i != strarr.length - 1) {\n\t\t\t\t\t\tpattern.lastIndex = pos;\n\t\t\t\t\t\tmatch = pattern.exec(text);\n\t\t\t\t\t\tif (!match) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar from = match.index + (lookbehind ? match[1].length : 0),\n\t\t\t\t\t\t    to = match.index + match[0].length,\n\t\t\t\t\t\t    k = i,\n\t\t\t\t\t\t    p = pos;\n\n\t\t\t\t\t\tfor (var len = strarr.length; k < len && p < to; ++k) {\n\t\t\t\t\t\t\tp += strarr[k].length;\n\t\t\t\t\t\t\t// Move the index i to the element in strarr that is closest to from\n\t\t\t\t\t\t\tif (from >= p) {\n\t\t\t\t\t\t\t\t++i;\n\t\t\t\t\t\t\t\tpos = p;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * If strarr[i] is a Token, then the match starts inside another Token, which is invalid\n\t\t\t\t\t\t * If strarr[k - 1] is greedy we are in conflict with another greedy pattern\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (strarr[i] instanceof Token || strarr[k - 1].greedy) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Number of tokens to delete and replace with the new match\n\t\t\t\t\t\tdelNum = k - i;\n\t\t\t\t\t\tstr = text.slice(pos, p);\n\t\t\t\t\t\tmatch.index -= pos;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!match) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(lookbehind) {\n\t\t\t\t\t\tlookbehindLength = match[1].length;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar from = match.index + lookbehindLength,\n\t\t\t\t\t    match = match[0].slice(lookbehindLength),\n\t\t\t\t\t    to = from + match.length,\n\t\t\t\t\t    before = str.slice(0, from),\n\t\t\t\t\t    after = str.slice(to);\n\n\t\t\t\t\tvar args = [i, delNum];\n\n\t\t\t\t\tif (before) {\n\t\t\t\t\t\targs.push(before);\n\t\t\t\t\t}\n\n\t\t\t\t\tvar wrapped = new Token(token, inside? _.tokenize(match, inside) : match, alias, match, greedy);\n\n\t\t\t\t\targs.push(wrapped);\n\n\t\t\t\t\tif (after) {\n\t\t\t\t\t\targs.push(after);\n\t\t\t\t\t}\n\n\t\t\t\t\tArray.prototype.splice.apply(strarr, args);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn strarr;\n\t},\n\n\thooks: {\n\t\tall: {},\n\n\t\tadd: function (name, callback) {\n\t\t\tvar hooks = _.hooks.all;\n\n\t\t\thooks[name] = hooks[name] || [];\n\n\t\t\thooks[name].push(callback);\n\t\t},\n\n\t\trun: function (name, env) {\n\t\t\tvar callbacks = _.hooks.all[name];\n\n\t\t\tif (!callbacks || !callbacks.length) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor (var i=0, callback; callback = callbacks[i++];) {\n\t\t\t\tcallback(env);\n\t\t\t}\n\t\t}\n\t}\n};\n\nvar Token = _.Token = function(type, content, alias, matchedStr, greedy) {\n\tthis.type = type;\n\tthis.content = content;\n\tthis.alias = alias;\n\t// Copy of the full string this token was created from\n\tthis.length = (matchedStr || \"\").length|0;\n\tthis.greedy = !!greedy;\n};\n\nToken.stringify = function(o, language, parent) {\n\tif (typeof o == 'string') {\n\t\treturn o;\n\t}\n\n\tif (_.util.type(o) === 'Array') {\n\t\treturn o.map(function(element) {\n\t\t\treturn Token.stringify(element, language, o);\n\t\t}).join('');\n\t}\n\n\tvar env = {\n\t\ttype: o.type,\n\t\tcontent: Token.stringify(o.content, language, parent),\n\t\ttag: 'span',\n\t\tclasses: ['token', o.type],\n\t\tattributes: {},\n\t\tlanguage: language,\n\t\tparent: parent\n\t};\n\n\tif (env.type == 'comment') {\n\t\tenv.attributes['spellcheck'] = 'true';\n\t}\n\n\tif (o.alias) {\n\t\tvar aliases = _.util.type(o.alias) === 'Array' ? o.alias : [o.alias];\n\t\tArray.prototype.push.apply(env.classes, aliases);\n\t}\n\n\t_.hooks.run('wrap', env);\n\n\tvar attributes = Object.keys(env.attributes).map(function(name) {\n\t\treturn name + '=\"' + (env.attributes[name] || '').replace(/\"/g, '&quot;') + '\"';\n\t}).join(' ');\n\n\treturn '<' + env.tag + ' class=\"' + env.classes.join(' ') + '\"' + (attributes ? ' ' + attributes : '') + '>' + env.content + '</' + env.tag + '>';\n\n};\n\nif (!_self.document) {\n\tif (!_self.addEventListener) {\n\t\t// in Node.js\n\t\treturn _self.Prism;\n\t}\n \t// In worker\n\t_self.addEventListener('message', function(evt) {\n\t\tvar message = JSON.parse(evt.data),\n\t\t    lang = message.language,\n\t\t    code = message.code,\n\t\t    immediateClose = message.immediateClose;\n\n\t\t_self.postMessage(_.highlight(code, _.languages[lang], lang));\n\t\tif (immediateClose) {\n\t\t\t_self.close();\n\t\t}\n\t}, false);\n\n\treturn _self.Prism;\n}\n\n//Get current script and highlight\nvar script = document.currentScript || [].slice.call(document.getElementsByTagName(\"script\")).pop();\n\nif (script) {\n\t_.filename = script.src;\n\n\tif (document.addEventListener && !script.hasAttribute('data-manual')) {\n\t\tif(document.readyState !== \"loading\") {\n\t\t\tif (window.requestAnimationFrame) {\n\t\t\t\twindow.requestAnimationFrame(_.highlightAll);\n\t\t\t} else {\n\t\t\t\twindow.setTimeout(_.highlightAll, 16);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tdocument.addEventListener('DOMContentLoaded', _.highlightAll);\n\t\t}\n\t}\n}\n\nreturn _self.Prism;\n\n})();\n\nif ('object' !== 'undefined' && module.exports) {\n\tmodule.exports = Prism;\n}\n\n// hack for components to work correctly in node.js\nif (typeof commonjsGlobal !== 'undefined') {\n\tcommonjsGlobal.Prism = Prism;\n}\n\n\n/* **********************************************\n     Begin prism-markup.js\n********************************************** */\n\nPrism.languages.markup = {\n\t'comment': /<!--[\\w\\W]*?-->/,\n\t'prolog': /<\\?[\\w\\W]+?\\?>/,\n\t'doctype': /<!DOCTYPE[\\w\\W]+?>/i,\n\t'cdata': /<!\\[CDATA\\[[\\w\\W]*?]]>/i,\n\t'tag': {\n\t\tpattern: /<\\/?(?!\\d)[^\\s>\\/=$<]+(?:\\s+[^\\s>\\/=]+(?:=(?:(\"|')(?:\\\\\\1|\\\\?(?!\\1)[\\w\\W])*\\1|[^\\s'\">=]+))?)*\\s*\\/?>/i,\n\t\tinside: {\n\t\t\t'tag': {\n\t\t\t\tpattern: /^<\\/?[^\\s>\\/]+/i,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /^<\\/?/,\n\t\t\t\t\t'namespace': /^[^\\s>\\/:]+:/\n\t\t\t\t}\n\t\t\t},\n\t\t\t'attr-value': {\n\t\t\t\tpattern: /=(?:('|\")[\\w\\W]*?(\\1)|[^\\s>]+)/i,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /[=>\"']/\n\t\t\t\t}\n\t\t\t},\n\t\t\t'punctuation': /\\/?>/,\n\t\t\t'attr-name': {\n\t\t\t\tpattern: /[^\\s>\\/]+/,\n\t\t\t\tinside: {\n\t\t\t\t\t'namespace': /^[^\\s>\\/:]+:/\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t},\n\t'entity': /&#?[\\da-z]{1,8};/i\n};\n\n// Plugin to make entity title show the real entity, idea by Roman Komarov\nPrism.hooks.add('wrap', function(env) {\n\n\tif (env.type === 'entity') {\n\t\tenv.attributes['title'] = env.content.replace(/&amp;/, '&');\n\t}\n});\n\nPrism.languages.xml = Prism.languages.markup;\nPrism.languages.html = Prism.languages.markup;\nPrism.languages.mathml = Prism.languages.markup;\nPrism.languages.svg = Prism.languages.markup;\n\n\n/* **********************************************\n     Begin prism-css.js\n********************************************** */\n\nPrism.languages.css = {\n\t'comment': /\\/\\*[\\w\\W]*?\\*\\//,\n\t'atrule': {\n\t\tpattern: /@[\\w-]+?.*?(;|(?=\\s*\\{))/i,\n\t\tinside: {\n\t\t\t'rule': /@[\\w-]+/\n\t\t\t// See rest below\n\t\t}\n\t},\n\t'url': /url\\((?:([\"'])(\\\\(?:\\r\\n|[\\w\\W])|(?!\\1)[^\\\\\\r\\n])*\\1|.*?)\\)/i,\n\t'selector': /[^\\{\\}\\s][^\\{\\};]*?(?=\\s*\\{)/,\n\t'string': {\n\t\tpattern: /(\"|')(\\\\(?:\\r\\n|[\\w\\W])|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\tgreedy: true\n\t},\n\t'property': /(\\b|\\B)[\\w-]+(?=\\s*:)/i,\n\t'important': /\\B!important\\b/i,\n\t'function': /[-a-z0-9]+(?=\\()/i,\n\t'punctuation': /[(){};:]/\n};\n\nPrism.languages.css['atrule'].inside.rest = Prism.util.clone(Prism.languages.css);\n\nif (Prism.languages.markup) {\n\tPrism.languages.insertBefore('markup', 'tag', {\n\t\t'style': {\n\t\t\tpattern: /(<style[\\w\\W]*?>)[\\w\\W]*?(?=<\\/style>)/i,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.css,\n\t\t\talias: 'language-css'\n\t\t}\n\t});\n\t\n\tPrism.languages.insertBefore('inside', 'attr-value', {\n\t\t'style-attr': {\n\t\t\tpattern: /\\s*style=(\"|').*?\\1/i,\n\t\t\tinside: {\n\t\t\t\t'attr-name': {\n\t\t\t\t\tpattern: /^\\s*style/i,\n\t\t\t\t\tinside: Prism.languages.markup.tag.inside\n\t\t\t\t},\n\t\t\t\t'punctuation': /^\\s*=\\s*['\"]|['\"]\\s*$/,\n\t\t\t\t'attr-value': {\n\t\t\t\t\tpattern: /.+/i,\n\t\t\t\t\tinside: Prism.languages.css\n\t\t\t\t}\n\t\t\t},\n\t\t\talias: 'language-css'\n\t\t}\n\t}, Prism.languages.markup.tag);\n}\n\n/* **********************************************\n     Begin prism-clike.js\n********************************************** */\n\nPrism.languages.clike = {\n\t'comment': [\n\t\t{\n\t\t\tpattern: /(^|[^\\\\])\\/\\*[\\w\\W]*?\\*\\//,\n\t\t\tlookbehind: true\n\t\t},\n\t\t{\n\t\t\tpattern: /(^|[^\\\\:])\\/\\/.*/,\n\t\t\tlookbehind: true\n\t\t}\n\t],\n\t'string': {\n\t\tpattern: /([\"'])(\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\tgreedy: true\n\t},\n\t'class-name': {\n\t\tpattern: /((?:\\b(?:class|interface|extends|implements|trait|instanceof|new)\\s+)|(?:catch\\s+\\())[a-z0-9_\\.\\\\]+/i,\n\t\tlookbehind: true,\n\t\tinside: {\n\t\t\tpunctuation: /(\\.|\\\\)/\n\t\t}\n\t},\n\t'keyword': /\\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\\b/,\n\t'boolean': /\\b(true|false)\\b/,\n\t'function': /[a-z0-9_]+(?=\\()/i,\n\t'number': /\\b-?(?:0x[\\da-f]+|\\d*\\.?\\d+(?:e[+-]?\\d+)?)\\b/i,\n\t'operator': /--?|\\+\\+?|!=?=?|<=?|>=?|==?=?|&&?|\\|\\|?|\\?|\\*|\\/|~|\\^|%/,\n\t'punctuation': /[{}[\\];(),.:]/\n};\n\n\n/* **********************************************\n     Begin prism-javascript.js\n********************************************** */\n\nPrism.languages.javascript = Prism.languages.extend('clike', {\n\t'keyword': /\\b(as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\\b/,\n\t'number': /\\b-?(0x[\\dA-Fa-f]+|0b[01]+|0o[0-7]+|\\d*\\.?\\d+([Ee][+-]?\\d+)?|NaN|Infinity)\\b/,\n\t// Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)\n\t'function': /[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*(?=\\()/i,\n\t'operator': /--?|\\+\\+?|!=?=?|<=?|>=?|==?=?|&&?|\\|\\|?|\\?|\\*\\*?|\\/|~|\\^|%|\\.{3}/\n});\n\nPrism.languages.insertBefore('javascript', 'keyword', {\n\t'regex': {\n\t\tpattern: /(^|[^/])\\/(?!\\/)(\\[.+?]|\\\\.|[^/\\\\\\r\\n])+\\/[gimyu]{0,5}(?=\\s*($|[\\r\\n,.;})]))/,\n\t\tlookbehind: true,\n\t\tgreedy: true\n\t}\n});\n\nPrism.languages.insertBefore('javascript', 'string', {\n\t'template-string': {\n\t\tpattern: /`(?:\\\\\\\\|\\\\?[^\\\\])*?`/,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'interpolation': {\n\t\t\t\tpattern: /\\$\\{[^}]+\\}/,\n\t\t\t\tinside: {\n\t\t\t\t\t'interpolation-punctuation': {\n\t\t\t\t\t\tpattern: /^\\$\\{|\\}$/,\n\t\t\t\t\t\talias: 'punctuation'\n\t\t\t\t\t},\n\t\t\t\t\trest: Prism.languages.javascript\n\t\t\t\t}\n\t\t\t},\n\t\t\t'string': /[\\s\\S]+/\n\t\t}\n\t}\n});\n\nif (Prism.languages.markup) {\n\tPrism.languages.insertBefore('markup', 'tag', {\n\t\t'script': {\n\t\t\tpattern: /(<script[\\w\\W]*?>)[\\w\\W]*?(?=<\\/script>)/i,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript,\n\t\t\talias: 'language-javascript'\n\t\t}\n\t});\n}\n\nPrism.languages.js = Prism.languages.javascript;\n\n/* **********************************************\n     Begin prism-file-highlight.js\n********************************************** */\n\n(function () {\n\tif (typeof self === 'undefined' || !self.Prism || !self.document || !document.querySelector) {\n\t\treturn;\n\t}\n\n\tself.Prism.fileHighlight = function() {\n\n\t\tvar Extensions = {\n\t\t\t'js': 'javascript',\n\t\t\t'py': 'python',\n\t\t\t'rb': 'ruby',\n\t\t\t'ps1': 'powershell',\n\t\t\t'psm1': 'powershell',\n\t\t\t'sh': 'bash',\n\t\t\t'bat': 'batch',\n\t\t\t'h': 'c',\n\t\t\t'tex': 'latex'\n\t\t};\n\n\t\tif(Array.prototype.forEach) { // Check to prevent error in IE8\n\t\t\tArray.prototype.slice.call(document.querySelectorAll('pre[data-src]')).forEach(function (pre) {\n\t\t\t\tvar src = pre.getAttribute('data-src');\n\n\t\t\t\tvar language, parent = pre;\n\t\t\t\tvar lang = /\\blang(?:uage)?-(?!\\*)(\\w+)\\b/i;\n\t\t\t\twhile (parent && !lang.test(parent.className)) {\n\t\t\t\t\tparent = parent.parentNode;\n\t\t\t\t}\n\n\t\t\t\tif (parent) {\n\t\t\t\t\tlanguage = (pre.className.match(lang) || [, ''])[1];\n\t\t\t\t}\n\n\t\t\t\tif (!language) {\n\t\t\t\t\tvar extension = (src.match(/\\.(\\w+)$/) || [, ''])[1];\n\t\t\t\t\tlanguage = Extensions[extension] || extension;\n\t\t\t\t}\n\n\t\t\t\tvar code = document.createElement('code');\n\t\t\t\tcode.className = 'language-' + language;\n\n\t\t\t\tpre.textContent = '';\n\n\t\t\t\tcode.textContent = 'Loading…';\n\n\t\t\t\tpre.appendChild(code);\n\n\t\t\t\tvar xhr = new XMLHttpRequest();\n\n\t\t\t\txhr.open('GET', src, true);\n\n\t\t\t\txhr.onreadystatechange = function () {\n\t\t\t\t\tif (xhr.readyState == 4) {\n\n\t\t\t\t\t\tif (xhr.status < 400 && xhr.responseText) {\n\t\t\t\t\t\t\tcode.textContent = xhr.responseText;\n\n\t\t\t\t\t\t\tPrism.highlightElement(code);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (xhr.status >= 400) {\n\t\t\t\t\t\t\tcode.textContent = '✖ Error ' + xhr.status + ' while fetching file: ' + xhr.statusText;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tcode.textContent = '✖ Error: File does not exist or is empty';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\txhr.send(null);\n\t\t\t});\n\t\t}\n\n\t};\n\n\tdocument.addEventListener('DOMContentLoaded', self.Prism.fileHighlight);\n\n})();\n});\n\n/**\n * gen toc tree\n * @link https://github.com/killercup/grock/blob/5280ae63e16c5739e9233d9009bc235ed7d79a50/styles/solarized/assets/js/behavior.coffee#L54-L81\n * @param  {Array} toc\n * @param  {Number} maxLevel\n * @return {Array}\n */\nfunction genTree (toc, maxLevel) {\n  var headlines = [];\n  var last = {};\n\n  toc.forEach(function (headline) {\n    var level = headline.level || 1;\n    var len = level - 1;\n\n    if (level > maxLevel) { return }\n    if (last[len]) {\n      last[len].children = (last[len].children || []).concat(headline);\n    } else {\n      headlines.push(headline);\n    }\n    last[level] = headline;\n  });\n\n  return headlines\n}\n\nvar cache$1 = {};\nvar re = /[\\u2000-\\u206F\\u2E00-\\u2E7F\\\\'!\"#$%&()*+,.\\/:;<=>?@\\[\\]^`{|}~]/g;\n\nfunction slugify (str) {\n  if (typeof str !== 'string') { return '' }\n\n  var slug = str.toLowerCase().trim()\n    .replace(/<[^>\\d]+>/g, '')\n    .replace(re, '')\n    .replace(/\\s/g, '-')\n    .replace(/-+/g, '-')\n    .replace(/^(\\d)/, '_$1');\n  var count = cache$1[slug];\n\n  count = cache$1.hasOwnProperty(slug) ? (count + 1) : 0;\n  cache$1[slug] = count;\n\n  if (count) {\n    slug = slug + '-' + count;\n  }\n\n  return slug\n}\n\nslugify.clear = function () {\n  cache$1 = {};\n};\n\nfunction replace (m, $1) {\n  return '<img class=\"emoji\" src=\"https://assets-cdn.github.com/images/icons/emoji/' + $1 + '.png\" alt=\"' + $1 + '\" />'\n}\n\nfunction emojify (text) {\n  return text\n    .replace(/<(pre|template|code)[^>]*?>[\\s\\S]+?<\\/(pre|template|code)>/g, function (m) { return m.replace(/:/g, '__colon__'); })\n    .replace(/:(\\w+?):/ig, (inBrowser && window.emojify) || replace)\n    .replace(/__colon__/g, ':')\n}\n\nvar decode = decodeURIComponent;\nvar encode = encodeURIComponent;\n\nfunction parseQuery (query) {\n  var res = {};\n\n  query = query.trim().replace(/^(\\?|#|&)/, '');\n\n  if (!query) {\n    return res\n  }\n\n  // Simple parse\n  query.split('&').forEach(function (param) {\n    var parts = param.replace(/\\+/g, ' ').split('=');\n\n    res[parts[0]] = parts[1] && decode(parts[1]);\n  });\n\n  return res\n}\n\nfunction stringifyQuery (obj) {\n  var qs = [];\n\n  for (var key in obj) {\n    qs.push(obj[key]\n      ? ((encode(key)) + \"=\" + (encode(obj[key]))).toLowerCase()\n      : encode(key));\n  }\n\n  return qs.length ? (\"?\" + (qs.join('&'))) : ''\n}\n\nfunction getPath () {\n  var args = [], len = arguments.length;\n  while ( len-- ) args[ len ] = arguments[ len ];\n\n  return cleanPath(args.join('/'))\n}\n\nvar isAbsolutePath = cached(function (path) {\n  return /(:|(\\/{2}))/g.test(path)\n});\n\nvar getParentPath = cached(function (path) {\n  return /\\/$/g.test(path)\n    ? path\n    : (path = path.match(/(\\S*\\/)[^\\/]+$/))\n      ? path[1]\n      : ''\n});\n\nvar cleanPath = cached(function (path) {\n  return path\n    .replace(/^\\/+/, '/')\n    .replace(/([^:])\\/{2,}/g, '$1/')\n});\n\nvar cachedLinks = {};\n\nvar Compiler = function Compiler (config, router) {\n  this.config = config;\n  this.router = router;\n  this.cacheTree = {};\n  this.toc = [];\n  this.linkTarget = config.externalLinkTarget || '_blank';\n  this.contentBase = router.getBasePath();\n\n  var renderer = this._initRenderer();\n  var compile;\n  var mdConf = config.markdown || {};\n\n  if (isFn(mdConf)) {\n    compile = mdConf(marked, renderer);\n  } else {\n    marked.setOptions(merge(mdConf, {\n      renderer: merge(renderer, mdConf.renderer)\n    }));\n    compile = marked;\n  }\n\n  this.compile = cached(function (text) {\n    var html = '';\n\n    if (!text) { return text }\n\n    html = compile(text);\n    html = config.noEmoji ? html : emojify(html);\n    slugify.clear();\n\n    return html\n  });\n};\n\nCompiler.prototype.matchNotCompileLink = function matchNotCompileLink (link) {\n  var links = this.config.noCompileLinks;\n\n  for (var i = 0; i < links.length; i++) {\n    var n = links[i];\n    var re = cachedLinks[n] || (cachedLinks[n] = new RegExp((\"^\" + n + \"$\")));\n\n    if (re.test(link)) {\n      return link\n    }\n  }\n};\n\nCompiler.prototype._initRenderer = function _initRenderer () {\n  var renderer = new marked.Renderer();\n  var ref = this;\n    var linkTarget = ref.linkTarget;\n    var router = ref.router;\n    var contentBase = ref.contentBase;\n  var _self = this;\n  /**\n   * render anchor tag\n   * @link https://github.com/chjj/marked#overriding-renderer-methods\n   */\n  renderer.heading = function (text, level) {\n    var nextToc = { level: level, title: text };\n\n    if (/{docsify-ignore}/g.test(text)) {\n      text = text.replace('{docsify-ignore}', '');\n      nextToc.title = text;\n      nextToc.ignoreSubHeading = true;\n    }\n\n    if (/{docsify-ignore-all}/g.test(text)) {\n      text = text.replace('{docsify-ignore-all}', '');\n      nextToc.title = text;\n      nextToc.ignoreAllSubs = true;\n    }\n\n    var slug = slugify(text);\n    var url = router.toURL(router.getCurrentPath(), { id: slug });\n    nextToc.slug = url;\n    _self.toc.push(nextToc);\n\n    return (\"<h\" + level + \" id=\\\"\" + slug + \"\\\"><a href=\\\"\" + url + \"\\\" data-id=\\\"\" + slug + \"\\\" class=\\\"anchor\\\"><span>\" + text + \"</span></a></h\" + level + \">\")\n  };\n  // highlight code\n  renderer.code = function (code, lang) {\n      if ( lang === void 0 ) lang = '';\n\n    var hl = prism.highlight(code, prism.languages[lang] || prism.languages.markup);\n\n    return (\"<pre v-pre data-lang=\\\"\" + lang + \"\\\"><code class=\\\"lang-\" + lang + \"\\\">\" + hl + \"</code></pre>\")\n  };\n  renderer.link = function (href, title, text) {\n    var blank = '';\n\n    if (!/:|(\\/{2})/.test(href) &&\n      !_self.matchNotCompileLink(href) &&\n      !/(\\s?:ignore)(\\s\\S+)?$/.test(title)) {\n      href = router.toURL(href, null, router.getCurrentPath());\n    } else {\n      blank = \" target=\\\"\" + linkTarget + \"\\\"\";\n      title = title && title.replace(/:ignore/g, '').trim();\n    }\n\n    if (title) {\n      title = \" title=\\\"\" + title + \"\\\"\";\n    }\n    return (\"<a href=\\\"\" + href + \"\\\"\" + (title || '') + blank + \">\" + text + \"</a>\")\n  };\n  renderer.paragraph = function (text) {\n    if (/^!&gt;/.test(text)) {\n      return helper('tip', text)\n    } else if (/^\\?&gt;/.test(text)) {\n      return helper('warn', text)\n    }\n    return (\"<p>\" + text + \"</p>\")\n  };\n  renderer.image = function (href, title, text) {\n    var url = href;\n    var titleHTML = title ? (\" title=\\\"\" + title + \"\\\"\") : '';\n\n    if (!isAbsolutePath(href)) {\n      url = getPath(contentBase, href);\n    }\n\n    return (\"<img src=\\\"\" + url + \"\\\" data-origin=\\\"\" + href + \"\\\" alt=\\\"\" + text + \"\\\"\" + titleHTML + \">\")\n  };\n\n  return renderer\n};\n\n/**\n * Compile sidebar\n */\nCompiler.prototype.sidebar = function sidebar (text, level) {\n  var currentPath = this.router.getCurrentPath();\n  var html = '';\n\n  if (text) {\n    html = this.compile(text);\n    // html = html && html.match(/<ul[^>]*>([\\s\\S]+)<\\/ul>/g)[0];\n  } else {\n    var tree$$1 = this.cacheTree[currentPath] || genTree(this.toc, level);\n    html = tree(tree$$1, '<ul>');\n    this.cacheTree[currentPath] = tree$$1;\n  }\n\n  return html\n};\n\n/**\n * Compile sub sidebar\n */\nCompiler.prototype.subSidebar = function subSidebar (level) {\n  if (!level) {\n    this.toc = [];\n    return\n  }\n  var currentPath = this.router.getCurrentPath();\n  var ref = this;\n    var cacheTree = ref.cacheTree;\n    var toc = ref.toc;\n\n  toc[0] && toc[0].ignoreAllSubs && (this.toc = []);\n  toc[0] && toc[0].level === 1 && toc.shift();\n  toc.forEach(function (node, i) {\n    node.ignoreSubHeading && toc.splice(i, 1);\n  });\n\n  var tree$$1 = cacheTree[currentPath] || genTree(toc, level);\n\n  cacheTree[currentPath] = tree$$1;\n  this.toc = [];\n  return tree(tree$$1, '<ul class=\"app-sub-sidebar\">')\n};\n\nCompiler.prototype.article = function article (text) {\n  return this.compile(text)\n};\n\n/**\n * Compile cover page\n */\nCompiler.prototype.cover = function cover$$1 (text) {\n  var cacheToc = this.toc.slice();\n  var html = this.compile(text);\n\n  this.toc = cacheToc.slice();\n\n  return html\n};\n\nvar title = $.title;\n/**\n * Toggle button\n */\nfunction btn (el, router) {\n  var toggle = function (_) { return body.classList.toggle('close'); };\n\n  el = getNode(el);\n  on(el, 'click', function (e) {\n    e.stopPropagation();\n    toggle();\n  });\n\n  var sidebar = getNode('.sidebar');\n\n  isMobile && on(body, 'click', function (_) { return body.classList.contains('close') && toggle(); }\n  );\n  on(sidebar, 'click', function (_) { return setTimeout((function (_) { return getAndActive(router, sidebar, true, true); }, 0)); }\n  );\n}\n\nfunction sticky () {\n  var cover = getNode('section.cover');\n  if (!cover) { return }\n  var coverHeight = cover.getBoundingClientRect().height;\n\n  if (window.pageYOffset >= coverHeight || cover.classList.contains('hidden')) {\n    toggleClass(body, 'add', 'sticky');\n  } else {\n    toggleClass(body, 'remove', 'sticky');\n  }\n}\n\n/**\n * Get and active link\n * @param  {object} router\n * @param  {string|element}  el\n * @param  {Boolean} isParent   acitve parent\n * @param  {Boolean} autoTitle  auto set title\n * @return {element}\n */\nfunction getAndActive (router, el, isParent, autoTitle) {\n  el = getNode(el);\n\n  var links = findAll(el, 'a');\n  var hash = router.toURL(router.getCurrentPath());\n  var target;\n\n  links\n    .sort(function (a, b) { return b.href.length - a.href.length; })\n    .forEach(function (a) {\n      var href = a.getAttribute('href');\n      var node = isParent ? a.parentNode : a;\n\n      if (hash.indexOf(href) === 0 && !target) {\n        target = a;\n        toggleClass(node, 'add', 'active');\n      } else {\n        toggleClass(node, 'remove', 'active');\n      }\n    });\n\n  if (autoTitle) {\n    $.title = target ? ((target.innerText) + \" - \" + title) : title;\n  }\n\n  return target\n}\n\nvar nav = {};\nvar hoverOver = false;\n\nfunction highlight () {\n  var sidebar = getNode('.sidebar');\n  var anchors = findAll('.anchor');\n  var wrap = find(sidebar, '.sidebar-nav');\n  var active = find(sidebar, 'li.active');\n  var top = body.scrollTop;\n  var last;\n\n  for (var i = 0, len = anchors.length; i < len; i += 1) {\n    var node = anchors[i];\n\n    if (node.offsetTop > top) {\n      if (!last) { last = node; }\n      break\n    } else {\n      last = node;\n    }\n  }\n  if (!last) { return }\n  var li = nav[last.getAttribute('data-id')];\n\n  if (!li || li === active) { return }\n\n  active && active.classList.remove('active');\n  li.classList.add('active');\n  active = li;\n\n  // scroll into view\n  // https://github.com/vuejs/vuejs.org/blob/master/themes/vue/source/js/common.js#L282-L297\n  if (!hoverOver && body.classList.contains('sticky')) {\n    var height = sidebar.clientHeight;\n    var curOffset = 0;\n    var cur = active.offsetTop + active.clientHeight + 40;\n    var isInView = (\n      active.offsetTop >= wrap.scrollTop &&\n      cur <= wrap.scrollTop + height\n    );\n    var notThan = cur - curOffset < height;\n    var top$1 = isInView\n      ? wrap.scrollTop\n      : notThan\n        ? curOffset\n        : cur - height;\n\n    sidebar.scrollTop = top$1;\n  }\n}\n\nfunction scrollActiveSidebar (router) {\n  if (isMobile) { return }\n\n  var sidebar = getNode('.sidebar');\n  var lis = findAll(sidebar, 'li');\n\n  for (var i = 0, len = lis.length; i < len; i += 1) {\n    var li = lis[i];\n    var a = li.querySelector('a');\n    if (!a) { continue }\n    var href = a.getAttribute('href');\n\n    if (href !== '/') {\n      href = router.parse(href).query.id;\n    }\n\n    nav[decodeURIComponent(href)] = li;\n  }\n\n  off('scroll', highlight);\n  on('scroll', highlight);\n  on(sidebar, 'mouseover', function () { hoverOver = true; });\n  on(sidebar, 'mouseleave', function () { hoverOver = false; });\n}\n\nfunction scrollIntoView (id) {\n  var section = find('#' + id);\n  section && section.scrollIntoView();\n}\n\nvar scrollEl = $.scrollingElement || $.documentElement;\n\nfunction scroll2Top (offset) {\n  if ( offset === void 0 ) offset = 0;\n\n  scrollEl.scrollTop = offset === true ? 0 : Number(offset);\n}\n\nfunction executeScript () {\n  var script = findAll('.markdown-section>script')\n      .filter(function (s) { return !/template/.test(s.type); })[0];\n  if (!script) { return false }\n  var code = script.innerText.trim();\n  if (!code) { return false }\n\n  setTimeout(function (_) {\n    window.__EXECUTE_RESULT__ = new Function(code)();\n  }, 0);\n}\n\nfunction formatUpdated (html, updated, fn) {\n  updated = typeof fn === 'function'\n    ? fn(updated)\n    : typeof fn === 'string'\n      ? tinydate(fn)(new Date(updated))\n      : updated;\n\n  return html.replace(/{docsify-updated}/g, updated)\n}\n\nfunction renderMain (html) {\n  if (!html) {\n    // TODO: Custom 404 page\n    html = 'not found';\n  }\n\n  this._renderTo('.markdown-section', html);\n  // Render sidebar with the TOC\n  !this.config.loadSidebar && this._renderSidebar();\n\n  // execute script\n  if (this.config.executeScript !== false &&\n      typeof window.Vue !== 'undefined' &&\n      !executeScript()) {\n    setTimeout(function (_) {\n      var vueVM = window.__EXECUTE_RESULT__;\n      vueVM && vueVM.$destroy && vueVM.$destroy();\n      window.__EXECUTE_RESULT__ = new window.Vue().$mount('#main');\n    }, 0);\n  } else {\n    this.config.executeScript && executeScript();\n  }\n}\n\nfunction renderNameLink (vm) {\n  var el = getNode('.app-name-link');\n  var nameLink = vm.config.nameLink;\n  var path = vm.route.path;\n\n  if (!el) { return }\n\n  if (isPrimitive(vm.config.nameLink)) {\n    el.setAttribute('href', nameLink);\n  } else if (typeof nameLink === 'object') {\n    var match = Object.keys(nameLink).filter(function (key) { return path.indexOf(key) > -1; })[0];\n\n    el.setAttribute('href', nameLink[match]);\n  }\n}\n\nfunction renderMixin (proto) {\n  proto._renderTo = function (el, content, replace) {\n    var node = getNode(el);\n    if (node) { node[replace ? 'outerHTML' : 'innerHTML'] = content; }\n  };\n\n  proto._renderSidebar = function (text) {\n    var ref = this.config;\n    var maxLevel = ref.maxLevel;\n    var subMaxLevel = ref.subMaxLevel;\n    var loadSidebar = ref.loadSidebar;\n\n    this._renderTo('.sidebar-nav', this.compiler.sidebar(text, maxLevel));\n    var activeEl = getAndActive(this.router, '.sidebar-nav', true, true);\n    if (loadSidebar && activeEl) {\n      activeEl.parentNode.innerHTML += (this.compiler.subSidebar(subMaxLevel) || '');\n    } else {\n      // reset toc\n      this.compiler.subSidebar();\n    }\n    // bind event\n    this._bindEventOnRendered(activeEl);\n  };\n\n  proto._bindEventOnRendered = function (activeEl) {\n    var ref = this.config;\n    var autoHeader = ref.autoHeader;\n    var auto2top = ref.auto2top;\n\n    scrollActiveSidebar(this.router);\n\n    if (autoHeader && activeEl) {\n      var main$$1 = getNode('#main');\n      var firstNode = main$$1.children[0];\n      if (firstNode && firstNode.tagName !== 'H1') {\n        var h1 = create('h1');\n        h1.innerText = activeEl.innerText;\n        before(main$$1, h1);\n      }\n    }\n\n    auto2top && scroll2Top(auto2top);\n  };\n\n  proto._renderNav = function (text) {\n    text && this._renderTo('nav', this.compiler.compile(text));\n    getAndActive(this.router, 'nav');\n  };\n\n  proto._renderMain = function (text, opt) {\n    var this$1 = this;\n    if ( opt === void 0 ) opt = {};\n\n    if (!text) {\n      return renderMain.call(this, text)\n    }\n\n    callHook(this, 'beforeEach', text, function (result) {\n      var html = this$1.isHTML ? result : this$1.compiler.compile(result);\n      if (opt.updatedAt) {\n        html = formatUpdated(html, opt.updatedAt, this$1.config.formatUpdated);\n      }\n\n      callHook(this$1, 'afterEach', html, function (text) { return renderMain.call(this$1, text); });\n    });\n  };\n\n  proto._renderCover = function (text) {\n    var el = getNode('.cover');\n    if (!text) {\n      toggleClass(el, 'remove', 'show');\n      return\n    }\n    toggleClass(el, 'add', 'show');\n\n    var html = this.coverIsHTML ? text : this.compiler.cover(text);\n    var m = html.trim().match('<p><img.*?data-origin=\"(.*?)\"[^a]+alt=\"(.*?)\">([^<]*?)</p>$');\n\n    if (m) {\n      if (m[2] === 'color') {\n        el.style.background = m[1] + (m[3] || '');\n      } else {\n        var path = m[1];\n\n        toggleClass(el, 'add', 'has-mask');\n        if (!isAbsolutePath(m[1])) {\n          path = getPath(this.router.getBasePath(), m[1]);\n        }\n        el.style.backgroundImage = \"url(\" + path + \")\";\n        el.style.backgroundSize = 'cover';\n        el.style.backgroundPosition = 'center center';\n      }\n      html = html.replace(m[0], '');\n    }\n\n    this._renderTo('.cover-main', html);\n    sticky();\n  };\n\n  proto._updateRender = function () {\n    // render name link\n    renderNameLink(this);\n  };\n}\n\nfunction initRender (vm) {\n  var config = vm.config;\n\n  // Init markdown compiler\n  vm.compiler = new Compiler(config, vm.router);\n\n  var id = config.el || '#app';\n  var navEl = find('nav') || create('nav');\n\n  var el = find(id);\n  var html = '';\n  var navAppendToTarget = body;\n\n  if (el) {\n    if (config.repo) {\n      html += corner(config.repo);\n    }\n    if (config.coverpage) {\n      html += cover();\n    }\n\n    html += main(config);\n    // Render main app\n    vm._renderTo(el, html, true);\n  } else {\n    vm.rendered = true;\n  }\n\n  if (config.mergeNavbar && isMobile) {\n    navAppendToTarget = find('.sidebar');\n  } else {\n    navEl.classList.add('app-nav');\n\n    if (!config.repo) {\n      navEl.classList.add('no-badge');\n    }\n  }\n\n  // Add nav\n  before(navAppendToTarget, navEl);\n\n  if (config.themeColor) {\n    $.head.appendChild(\n      create('div', theme(config.themeColor)).firstElementChild\n    );\n    // Polyfll\n    cssVars(config.themeColor);\n  }\n  vm._updateRender();\n  toggleClass(body, 'ready');\n}\n\nvar cached$1 = {};\n\nfunction getAlias (path, alias, last) {\n  var match = Object.keys(alias).filter(function (key) {\n    var re = cached$1[key] || (cached$1[key] = new RegExp((\"^\" + key + \"$\")));\n    return re.test(path) && path !== last\n  })[0];\n\n  return match ? getAlias(path.replace(cached$1[match], alias[match]), alias, path) : path\n}\n\nfunction getFileName (path) {\n  return /\\.(md|html)$/g.test(path)\n    ? path\n    : /\\/$/g.test(path)\n      ? (path + \"README.md\")\n      : (path + \".md\")\n}\n\nvar History = function History (config) {\n  this.config = config;\n};\n\nHistory.prototype.getBasePath = function getBasePath () {\n  return this.config.basePath\n};\n\nHistory.prototype.getFile = function getFile (path, isRelative) {\n  path = path || this.getCurrentPath();\n\n  var ref = this;\n    var config = ref.config;\n  var base = this.getBasePath();\n\n  path = config.alias ? getAlias(path, config.alias) : path;\n  path = getFileName(path);\n  path = path === '/README.md' ? (config.homepage || path) : path;\n  path = isAbsolutePath(path) ? path : getPath(base, path);\n\n  if (isRelative) {\n    path = path.replace(new RegExp((\"^\" + base)), '');\n  }\n\n  return path\n};\n\nHistory.prototype.onchange = function onchange (cb) {\n    if ( cb === void 0 ) cb = noop;\n\n  cb();\n};\n\nHistory.prototype.getCurrentPath = function getCurrentPath () {};\n\nHistory.prototype.normalize = function normalize () {};\n\nHistory.prototype.parse = function parse () {};\n\nHistory.prototype.toURL = function toURL () {};\n\nfunction replaceHash (path) {\n  var i = location.href.indexOf('#');\n  location.replace(\n    location.href.slice(0, i >= 0 ? i : 0) + '#' + path\n  );\n}\n\nvar replaceSlug = cached(function (path) {\n  return path.replace('#', '?id=')\n});\n\nvar HashHistory = (function (History$$1) {\n  function HashHistory (config) {\n    History$$1.call(this, config);\n    this.mode = 'hash';\n  }\n\n  if ( History$$1 ) HashHistory.__proto__ = History$$1;\n  HashHistory.prototype = Object.create( History$$1 && History$$1.prototype );\n  HashHistory.prototype.constructor = HashHistory;\n\n  HashHistory.prototype.getBasePath = function getBasePath () {\n    var path = window.location.pathname || '';\n    var base = this.config.basePath;\n\n    return /^(\\/|https?:)/g.test(base)\n      ? base\n      : cleanPath(path + '/' + base)\n  };\n\n  HashHistory.prototype.getCurrentPath = function getCurrentPath () {\n    // We can't use location.hash here because it's not\n    // consistent across browsers - Firefox will pre-decode it!\n    var href = location.href;\n    var index = href.indexOf('#');\n    return index === -1 ? '' : href.slice(index + 1)\n  };\n\n  HashHistory.prototype.onchange = function onchange (cb) {\n    if ( cb === void 0 ) cb = noop;\n\n    on('hashchange', cb);\n  };\n\n  HashHistory.prototype.normalize = function normalize () {\n    var path = this.getCurrentPath();\n\n    path = replaceSlug(path);\n\n    if (path.charAt(0) === '/') { return replaceHash(path) }\n    replaceHash('/' + path);\n  };\n\n  /**\n   * Parse the url\n   * @param {string} [path=location.herf]\n   * @return {object} { path, query }\n   */\n  HashHistory.prototype.parse = function parse (path) {\n    if ( path === void 0 ) path = location.href;\n\n    var query = '';\n\n    var hashIndex = path.indexOf('#');\n    if (hashIndex) {\n      path = path.slice(hashIndex + 1);\n    }\n\n    var queryIndex = path.indexOf('?');\n    if (queryIndex >= 0) {\n      query = path.slice(queryIndex + 1);\n      path = path.slice(0, queryIndex);\n    }\n\n    return {\n      path: path,\n      file: this.getFile(path, true),\n      query: parseQuery(query)\n    }\n  };\n\n  HashHistory.prototype.toURL = function toURL (path, params, currentRoute) {\n    var local = currentRoute && path[0] === '#';\n    var route = this.parse(replaceSlug(path));\n\n    route.query = merge({}, route.query, params);\n    path = route.path + stringifyQuery(route.query);\n    path = path.replace(/\\.md(\\?)|\\.md$/, '$1');\n\n    if (local) { path = currentRoute + path; }\n\n    return cleanPath('#/' + path)\n  };\n\n  return HashHistory;\n}(History));\n\nvar HTML5History = (function (History$$1) {\n  function HTML5History (config) {\n    History$$1.call(this, config);\n    this.mode = 'history';\n  }\n\n  if ( History$$1 ) HTML5History.__proto__ = History$$1;\n  HTML5History.prototype = Object.create( History$$1 && History$$1.prototype );\n  HTML5History.prototype.constructor = HTML5History;\n\n  HTML5History.prototype.getCurrentPath = function getCurrentPath () {\n    var base = this.getBasePath();\n    var path = window.location.pathname;\n\n    if (base && path.indexOf(base) === 0) {\n      path = path.slice(base.length);\n    }\n\n    return (path || '/') + window.location.search + window.location.hash\n  };\n\n  HTML5History.prototype.onchange = function onchange (cb) {\n    if ( cb === void 0 ) cb = noop;\n\n    on('click', function (e) {\n      var el = e.target.tagName === 'A'\n        ? e.target\n        : e.target.parentNode;\n\n      if (el.tagName === 'A' && !/_blank/.test(el.target)) {\n        e.preventDefault();\n        var url = el.href;\n        window.history.pushState({ key: url }, '', url);\n        cb();\n      }\n    });\n\n    on('popstate', cb);\n  };\n\n  /**\n   * Parse the url\n   * @param {string} [path=location.href]\n   * @return {object} { path, query }\n   */\n  HTML5History.prototype.parse = function parse (path) {\n    if ( path === void 0 ) path = location.href;\n\n    var query = '';\n\n    var queryIndex = path.indexOf('?');\n    if (queryIndex >= 0) {\n      query = path.slice(queryIndex + 1);\n      path = path.slice(0, queryIndex);\n    }\n\n    var base = getPath(location.origin);\n    var baseIndex = path.indexOf(base);\n\n    if (baseIndex > -1) {\n      path = path.slice(baseIndex + base.length);\n    }\n\n    return {\n      path: path,\n      file: this.getFile(path),\n      query: parseQuery(query)\n    }\n  };\n\n  HTML5History.prototype.toURL = function toURL (path, params, currentRoute) {\n    var local = currentRoute && path[0] === '#';\n    var route = this.parse(path);\n\n    route.query = merge({}, route.query, params);\n    path = route.path + stringifyQuery(route.query);\n    path = path.replace(/\\.md(\\?)|\\.md$/, '$1');\n\n    if (local) { path = currentRoute + path; }\n\n    return cleanPath('/' + path)\n  };\n\n  return HTML5History;\n}(History));\n\nfunction routerMixin (proto) {\n  proto.route = {};\n}\n\nvar lastRoute = {};\n\nfunction updateRender (vm) {\n  vm.router.normalize();\n  vm.route = vm.router.parse();\n  body.setAttribute('data-page', vm.route.file);\n}\n\nfunction initRouter (vm) {\n  var config = vm.config;\n  var mode = config.routerMode || 'hash';\n  var router;\n\n  if (mode === 'history' && supportsPushState) {\n    router = new HTML5History(config);\n  } else {\n    router = new HashHistory(config);\n  }\n\n  vm.router = router;\n  updateRender(vm);\n  lastRoute = vm.route;\n\n  router.onchange(function (_) {\n    updateRender(vm);\n    vm._updateRender();\n\n    if (lastRoute.path === vm.route.path) {\n      vm.$resetEvents();\n      return\n    }\n\n    vm.$fetch();\n    lastRoute = vm.route;\n  });\n}\n\nfunction eventMixin (proto) {\n  proto.$resetEvents = function () {\n    scrollIntoView(this.route.query.id);\n    getAndActive(this.router, 'nav');\n  };\n}\n\nfunction initEvent (vm) {\n  // Bind toggle button\n  btn('button.sidebar-toggle', vm.router);\n  // Bind sticky effect\n  if (vm.config.coverpage) {\n    !isMobile && on('scroll', sticky);\n  } else {\n    body.classList.add('sticky');\n  }\n}\n\nfunction loadNested (path, file, next, vm, first) {\n  path = first ? path : path.replace(/\\/$/, '');\n  path = getParentPath(path);\n\n  if (!path) { return }\n\n  get(vm.router.getFile(path + file))\n    .then(next, function (_) { return loadNested(path, file, next, vm); });\n}\n\nfunction fetchMixin (proto) {\n  var last;\n  proto._fetch = function (cb) {\n    var this$1 = this;\n    if ( cb === void 0 ) cb = noop;\n\n    var ref = this.route;\n    var path = ref.path;\n    var ref$1 = this.config;\n    var loadNavbar = ref$1.loadNavbar;\n    var loadSidebar = ref$1.loadSidebar;\n\n    // Abort last request\n    last && last.abort && last.abort();\n\n    last = get(this.router.getFile(path), true);\n\n    // Current page is html\n    this.isHTML = /\\.html$/g.test(path);\n\n    var loadSideAndNav = function () {\n      if (!loadSidebar) { return cb() }\n\n      var fn = function (result) { this$1._renderSidebar(result); cb(); };\n\n      // Load sidebar\n      loadNested(path, loadSidebar, fn, this$1, true);\n    };\n\n    // Load main content\n    last.then(function (text, opt) {\n      this$1._renderMain(text, opt);\n      loadSideAndNav();\n    },\n    function (_) {\n      this$1._renderMain(null);\n      loadSideAndNav();\n    });\n\n    // Load nav\n    loadNavbar &&\n    loadNested(path, loadNavbar, function (text) { return this$1._renderNav(text); }, this, true);\n  };\n\n  proto._fetchCover = function () {\n    var this$1 = this;\n\n    var ref = this.config;\n    var coverpage = ref.coverpage;\n    var root = getParentPath(this.route.path);\n    var path = this.router.getFile(root + coverpage);\n\n    if (this.route.path !== '/' || !coverpage) {\n      this._renderCover();\n      return\n    }\n\n    this.coverIsHTML = /\\.html$/g.test(path);\n    get(path)\n      .then(function (text) { return this$1._renderCover(text); });\n  };\n\n  proto.$fetch = function (cb) {\n    var this$1 = this;\n    if ( cb === void 0 ) cb = noop;\n\n    this._fetchCover();\n    this._fetch(function (result) {\n      this$1.$resetEvents();\n      callHook(this$1, 'doneEach');\n      cb();\n    });\n  };\n}\n\nfunction initFetch (vm) {\n  var ref = vm.config;\n  var loadSidebar = ref.loadSidebar;\n\n  // server-client renderer\n  if (vm.rendered) {\n    var activeEl = getAndActive(vm.router, '.sidebar-nav', true, true);\n    if (loadSidebar && activeEl) {\n      activeEl.parentNode.innerHTML += window.__SUB_SIDEBAR__;\n    }\n    vm._bindEventOnRendered(activeEl);\n    vm._fetchCover();\n    vm.$resetEvents();\n    callHook(vm, 'doneEach');\n    callHook(vm, 'ready');\n  } else {\n    vm.$fetch(function (_) { return callHook(vm, 'ready'); });\n  }\n}\n\nfunction initMixin (proto) {\n  proto._init = function () {\n    var vm = this;\n    vm.config = config || {};\n\n    initLifecycle(vm); // Init hooks\n    initPlugin(vm); // Install plugins\n    callHook(vm, 'init');\n    initRouter(vm); // Add router\n    initRender(vm); // Render base DOM\n    initEvent(vm); // Bind events\n    initFetch(vm); // Fetch data\n    callHook(vm, 'mounted');\n  };\n}\n\nfunction initPlugin (vm) {\n  [].concat(vm.config.plugins).forEach(function (fn) { return isFn(fn) && fn(vm._lifecycle, vm); });\n}\n\n\n\nvar util = Object.freeze({\n\tcached: cached,\n\thyphenate: hyphenate,\n\tmerge: merge,\n\tisPrimitive: isPrimitive,\n\tnoop: noop,\n\tisFn: isFn,\n\tinBrowser: inBrowser,\n\tisMobile: isMobile,\n\tsupportsPushState: supportsPushState,\n\tparseQuery: parseQuery,\n\tstringifyQuery: stringifyQuery,\n\tgetPath: getPath,\n\tisAbsolutePath: isAbsolutePath,\n\tgetParentPath: getParentPath,\n\tcleanPath: cleanPath\n});\n\nvar initGlobalAPI = function () {\n  window.Docsify = { util: util, dom: dom, get: get, slugify: slugify };\n  window.DocsifyCompiler = Compiler;\n  window.marked = marked;\n  window.Prism = prism;\n};\n\nfunction Docsify () {\n  this._init();\n}\n\nvar proto = Docsify.prototype;\n\ninitMixin(proto);\nrouterMixin(proto);\nrenderMixin(proto);\nfetchMixin(proto);\neventMixin(proto);\n\n/**\n * Global API\n */\ninitGlobalAPI();\n\n/**\n * Version\n */\nDocsify.version = '4.2.4';\n\n/**\n * Run Docsify\n */\nsetTimeout(function (_) { return new Docsify(); }, 0);\n\n}());\n"
  },
  {
    "path": "docs/_assets/vue.css",
    "content": "* {\n  -webkit-font-smoothing: antialiased;\n  -webkit-overflow-scrolling: touch;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n  -webkit-text-size-adjust: none;\n  -webkit-touch-callout: none;\n  box-sizing: border-box\n}\n\nbody:not(.ready) {\n  overflow: hidden\n}\n\nbody:not(.ready) .app-nav, body:not(.ready) > nav, body:not(.ready) [data-cloak] {\n  display: none\n}\n\ndiv#app {\n  font-size: 30px;\n  font-weight: lighter;\n  margin: 40vh auto;\n  text-align: center\n}\n\ndiv#app:empty:before {\n  content: \"Loading...\"\n}\n\n.emoji {\n  height: 19.2px;\n  height: 1.2rem;\n  vertical-align: middle\n}\n\n.progress {\n  background-color: #42b983;\n  background-color: var(--theme-color, #42b983);\n  height: 2px;\n  left: 0;\n  position: fixed;\n  right: 0;\n  top: 0;\n  transition: width .2s, opacity .4s;\n  width: 0;\n  z-index: 5\n}\n\n.search .search-keyword, .search a:hover {\n  color: #42b983;\n  color: var(--theme-color, #42b983)\n}\n\n.search .search-keyword {\n  font-style: normal\n}\n\nbody, html {\n  height: 100%\n}\n\nbody {\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-font-smoothing: antialiased;\n  color: #34495e;\n  font-family: Source Sans Pro, Helvetica Neue, Arial, sans-serif;\n  font-size: 15px;\n  letter-spacing: 0;\n  margin: 0;\n  overflow-x: hidden\n}\n\nimg {\n  max-width: 100%\n}\n\nkbd {\n  border: 1px solid #ccc;\n  border-radius: 3px;\n  display: inline-block;\n  font-size: 12px !important;\n  line-height: 12px;\n  margin-bottom: 3px;\n  padding: 3px 5px;\n  vertical-align: middle\n}\n\n.app-nav {\n  left: 0;\n  margin: 25px 60px 0 0;\n  position: absolute;\n  right: 0;\n  text-align: right;\n  z-index: 2\n}\n\n.app-nav p {\n  margin: 0\n}\n\n.app-nav > a {\n  margin: 0 16px;\n  margin: 0 1rem;\n  padding: 5px 0\n}\n\n.app-nav li, .app-nav ul {\n  display: inline-block;\n  list-style: none;\n  margin: 0\n}\n\n.app-nav a {\n  color: inherit;\n  font-size: 16px;\n  text-decoration: none;\n  transition: color .3s\n}\n\n.app-nav a.active, .app-nav a:hover {\n  color: #42b983;\n  color: var(--theme-color, #42b983)\n}\n\n.app-nav a.active {\n  border-bottom: 2px solid #42b983;\n  border-bottom: 2px solid var(--theme-color, #42b983)\n}\n\n.app-nav li {\n  display: inline-block;\n  margin: 0 16px;\n  margin: 0 1rem;\n  padding: 5px 0;\n  position: relative\n}\n\n.app-nav li ul {\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-bottom-color: #ccc;\n  border-radius: 4px;\n  box-sizing: border-box;\n  display: none;\n  max-height: calc(100vh - 61px);\n  overflow-y: scroll;\n  padding: 10px 0;\n  position: absolute;\n  right: -15px;\n  text-align: left;\n  top: 100%;\n  white-space: nowrap\n}\n\n.app-nav li ul li {\n  display: block;\n  font-size: 14px;\n  line-height: 16px;\n  line-height: 1rem;\n  margin: 0;\n  margin: 8px 14px;\n  white-space: nowrap\n}\n\n.app-nav li ul a {\n  display: block;\n  font-size: inherit;\n  margin: 0;\n  padding: 0\n}\n\n.app-nav li ul a.active {\n  border-bottom: 0\n}\n\n.app-nav li:hover ul {\n  display: block\n}\n\n.app-nav.no-badge {\n  margin-right: 25px\n}\n\n.github-corner {\n  border-bottom: 0;\n  position: fixed;\n  right: 0;\n  text-decoration: none;\n  top: 0;\n  z-index: 1\n}\n\n.github-corner svg {\n  color: #fff;\n  fill: #42b983;\n  fill: var(--theme-color, #42b983);\n  height: 80px;\n  width: 80px\n}\n\n.github-corner:hover .octo-arm {\n  -webkit-animation: a .56s ease-in-out;\n  animation: a .56s ease-in-out\n}\n\nmain {\n  display: block;\n  position: relative;\n  width: 100vw;\n  height: 100%\n}\n\n.anchor {\n  display: inline-block;\n  text-decoration: none;\n  transition: all .3s\n}\n\n.anchor span {\n  color: #34495e\n}\n\n.anchor:hover {\n  text-decoration: underline\n}\n\n.sidebar {\n  border-right: 1px solid rgba(0, 0, 0, .07);\n  overflow-y: auto;\n  padding: 40px 0;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  position: absolute;\n  transition: -webkit-transform .25s ease-out;\n  transition: transform .25s ease-out;\n  transition: transform .25s ease-out, -webkit-transform .25s ease-out;\n  width: 300px;\n  z-index: 3\n}\n\n.sidebar > h1 {\n  margin: 0 auto 16px;\n  margin: 0 auto 1rem;\n  font-size: 24px;\n  font-size: 1.5rem;\n  font-weight: 300;\n  text-align: center\n}\n\n.sidebar > h1 a {\n  color: inherit;\n  text-decoration: none\n}\n\n.sidebar > h1 .app-nav {\n  display: block;\n  position: static\n}\n\n.sidebar .sidebar-nav {\n  line-height: 2em\n}\n\n.sidebar ul {\n  margin: 0;\n  padding: 0\n}\n\n.sidebar li > p {\n  font-weight: 700;\n  margin: 0\n}\n\n.sidebar ul, .sidebar ul li {\n  list-style: none\n}\n\n.sidebar ul li a {\n  border-bottom: none;\n  display: block\n}\n\n.sidebar ul li ul {\n  padding-left: 20px\n}\n\n.sidebar::-webkit-scrollbar {\n  width: 4px\n}\n\n.sidebar::-webkit-scrollbar-thumb {\n  background: transparent;\n  border-radius: 4px\n}\n\n.sidebar:hover::-webkit-scrollbar-thumb {\n  background: hsla(0, 0%, 53%, .4)\n}\n\n.sidebar:hover::-webkit-scrollbar-track {\n  background: hsla(0, 0%, 53%, .1)\n}\n\n.sidebar-toggle {\n  background-color: transparent;\n  background-color: hsla(0, 0%, 100%, .8);\n  border: 0;\n  outline: none;\n  padding: 10px;\n  bottom: 0;\n  left: 0;\n  position: absolute;\n  text-align: center;\n  transition: opacity .3s;\n  width: 30px;\n  width: 284px;\n  z-index: 4\n}\n\n.sidebar-toggle .sidebar-toggle-button:hover {\n  opacity: .4\n}\n\n.sidebar-toggle span {\n  background-color: #42b983;\n  background-color: var(--theme-color, #42b983);\n  display: block;\n  margin-bottom: 4px;\n  width: 16px;\n  height: 2px\n}\n\nbody.sticky .sidebar, body.sticky .sidebar-toggle {\n  position: fixed\n}\n\n.content {\n  padding-top: 20px;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 300px;\n  position: absolute;\n  transition: left .25s ease\n}\n\n.markdown-section {\n  margin: 0 auto;\n  max-width: 800px;\n  padding: 30px 15px 40px;\n  position: relative\n}\n\n.markdown-section > * {\n  box-sizing: border-box;\n  font-size: inherit\n}\n\n.markdown-section > :first-child {\n  margin-top: 0 !important\n}\n\n.markdown-section hr {\n  border: none;\n  border-bottom: 1px solid #eee;\n  margin: 2em 0\n}\n\n.markdown-section table {\n  border-collapse: collapse;\n  border-spacing: 0;\n  display: block;\n  margin-bottom: 16px;\n  margin-bottom: 1rem;\n  overflow: auto;\n  width: 100%\n}\n\n.markdown-section th {\n  font-weight: 700\n}\n\n.markdown-section td, .markdown-section th {\n  border: 1px solid #ddd;\n  padding: 6px 13px\n}\n\n.markdown-section tr {\n  border-top: 1px solid #ccc\n}\n\n.markdown-section p.tip, .markdown-section tr:nth-child(2n) {\n  background-color: #f8f8f8\n}\n\n.markdown-section p.tip {\n  border-bottom-right-radius: 2px;\n  border-left: 4px solid #f66;\n  border-top-right-radius: 2px;\n  margin: 2em 0;\n  padding: 12px 24px 12px 30px;\n  position: relative\n}\n\n.markdown-section p.tip code {\n  background-color: #efefef\n}\n\n.markdown-section p.tip em {\n  color: #34495e\n}\n\n.markdown-section p.tip:before {\n  background-color: #f66;\n  border-radius: 100%;\n  color: #fff;\n  content: \"!\";\n  font-family: Dosis, Source Sans Pro, Helvetica Neue, Arial, sans-serif;\n  font-size: 14px;\n  font-weight: 700;\n  left: -12px;\n  line-height: 20px;\n  position: absolute;\n  width: 20px;\n  height: 20px;\n  text-align: center;\n  top: 14px\n}\n\n.markdown-section p.warn {\n  background: rgba(66, 185, 131, .1);\n  border-radius: 2px;\n  padding: 16px;\n  padding: 1rem\n}\n\nbody.close .sidebar {\n  -webkit-transform: translateX(-300px);\n  transform: translateX(-300px)\n}\n\nbody.close .sidebar-toggle {\n  width: auto\n}\n\nbody.close .content {\n  left: 0\n}\n\n@media print {\n  .app-nav, .github-corner, .sidebar, .sidebar-toggle {\n    display: none\n  }\n}\n\n@media screen and (max-width: 768px) {\n  .github-corner, .sidebar, .sidebar-toggle {\n    position: fixed\n  }\n\n  .app-nav {\n    margin-top: 16px\n  }\n\n  .app-nav li ul {\n    top: 30px\n  }\n\n  main {\n    height: auto;\n    overflow-x: hidden\n  }\n\n  .sidebar {\n    left: -300px;\n    transition: -webkit-transform .25s ease-out;\n    transition: transform .25s ease-out;\n    transition: transform .25s ease-out, -webkit-transform .25s ease-out\n  }\n\n  .content {\n    left: 0;\n    max-width: 100vw;\n    position: static;\n    transition: -webkit-transform .25s ease;\n    transition: transform .25s ease;\n    transition: transform .25s ease, -webkit-transform .25s ease\n  }\n\n  .app-nav, .github-corner {\n    transition: -webkit-transform .25s ease-out;\n    transition: transform .25s ease-out;\n    transition: transform .25s ease-out, -webkit-transform .25s ease-out\n  }\n\n  .sidebar-toggle {\n    background-color: transparent;\n    width: auto\n  }\n\n  body.close .sidebar {\n    -webkit-transform: translateX(300px);\n    transform: translateX(300px)\n  }\n\n  body.close .sidebar-toggle {\n    background-color: hsla(0, 0%, 100%, .8);\n    transition: background-color 1s;\n    width: 284px\n  }\n\n  body.close .content {\n    -webkit-transform: translateX(300px);\n    transform: translateX(300px)\n  }\n\n  body.close .app-nav, body.close .github-corner {\n    display: none\n  }\n\n  .github-corner .octo-arm {\n    -webkit-animation: a .56s ease-in-out;\n    animation: a .56s ease-in-out\n  }\n\n  .github-corner:hover .octo-arm {\n    -webkit-animation: none;\n    animation: none\n  }\n}\n\n@-webkit-keyframes a {\n  0%, to {\n    -webkit-transform: rotate(0);\n    transform: rotate(0)\n  }\n  20%, 60% {\n    -webkit-transform: rotate(-25deg);\n    transform: rotate(-25deg)\n  }\n  40%, 80% {\n    -webkit-transform: rotate(10deg);\n    transform: rotate(10deg)\n  }\n}\n\n@keyframes a {\n  0%, to {\n    -webkit-transform: rotate(0);\n    transform: rotate(0)\n  }\n  20%, 60% {\n    -webkit-transform: rotate(-25deg);\n    transform: rotate(-25deg)\n  }\n  40%, 80% {\n    -webkit-transform: rotate(10deg);\n    transform: rotate(10deg)\n  }\n}\n\nsection.cover {\n  -webkit-box-align: center;\n  -ms-flex-align: center;\n  align-items: center;\n  background-position: 50%;\n  background-repeat: no-repeat;\n  background-size: cover;\n  height: 100vh;\n  display: none\n}\n\nsection.cover .cover-main {\n  -webkit-box-flex: 1;\n  -ms-flex: 1;\n  flex: 1;\n  margin: -20px 16px 0;\n  text-align: center;\n  z-index: 1\n}\n\nsection.cover a {\n  color: inherit\n}\n\nsection.cover a, section.cover a:hover {\n  text-decoration: none\n}\n\nsection.cover p {\n  line-height: 24px;\n  line-height: 1.5rem;\n  margin: 1em 0\n}\n\nsection.cover h1 {\n  color: inherit;\n  font-size: 40px;\n  font-size: 2.5rem;\n  font-weight: 300;\n  margin: 10px 0 40px;\n  margin: .625rem 0 2.5rem;\n  position: relative;\n  text-align: center\n}\n\nsection.cover h1 a {\n  display: block\n}\n\nsection.cover h1 small {\n  bottom: -7px;\n  bottom: -.4375rem;\n  font-size: 16px;\n  font-size: 1rem;\n  position: absolute\n}\n\nsection.cover blockquote {\n  font-size: 24px;\n  font-size: 1.5rem;\n  text-align: center\n}\n\nsection.cover ul {\n  line-height: 1.8;\n  list-style-type: none;\n  margin: 1em auto;\n  max-width: 500px;\n  padding: 0\n}\n\nsection.cover .cover-main > p:last-child a {\n  border-color: #42b983;\n  border: 1px solid var(--theme-color, #42b983);\n  border-radius: 2rem;\n  box-sizing: border-box;\n  color: #42b983;\n  color: var(--theme-color, #42b983);\n  display: inline-block;\n  font-size: 16.8px;\n  font-size: 1.05rem;\n  letter-spacing: 1.6px;\n  letter-spacing: .1rem;\n  margin-right: 16px;\n  margin-right: 1rem;\n  padding: .75em 32px;\n  padding: .75em 2rem;\n  text-decoration: none;\n  transition: all .15s ease\n}\n\nsection.cover .cover-main > p:last-child a:last-child {\n  background-color: #42b983;\n  background-color: var(--theme-color, #42b983);\n  color: #fff;\n  margin-right: 0\n}\n\nsection.cover .cover-main > p:last-child a:last-child:hover {\n  color: inherit;\n  opacity: .8\n}\n\nsection.cover .cover-main > p:last-child a:hover {\n  color: inherit\n}\n\nsection.cover blockquote > p > a {\n  border-bottom: 2px solid #42b983;\n  border-bottom: 2px solid var(--theme-color, #42b983);\n  transition: color .3s\n}\n\nsection.cover blockquote > p > a:hover {\n  color: #42b983;\n  color: var(--theme-color, #42b983)\n}\n\nsection.cover.show {\n  display: -webkit-box;\n  display: -ms-flexbox;\n  display: flex\n}\n\nsection.cover.has-mask .mask {\n  background-color: #fff;\n  opacity: .8;\n  position: absolute;\n  width: 100%;\n  height: 100%\n}\n\n.sidebar, body {\n  background-color: #fff\n}\n\n.sidebar {\n  color: #364149\n}\n\n.sidebar li {\n  margin: 6px 0 6px 15px\n}\n\n.sidebar ul li a {\n  color: #505d6b;\n  font-size: 14px;\n  font-weight: 400;\n  overflow: hidden;\n  text-decoration: none;\n  text-overflow: ellipsis;\n  white-space: nowrap\n}\n\n.sidebar ul li a:hover {\n  text-decoration: underline\n}\n\n.sidebar ul li ul {\n  padding: 0\n}\n\n.sidebar ul li.active > a {\n  border-right: 2px solid;\n  color: #42b983;\n  color: var(--theme-color, #42b983);\n  font-weight: 600\n}\n\n.app-sub-sidebar .section-link:before {\n  content: \"-\";\n  padding-right: 4px\n}\n\n.markdown-section h1, .markdown-section h2, .markdown-section h3, .markdown-section h4, .markdown-section strong {\n  color: #2c3e50;\n  font-weight: 600\n}\n\n.markdown-section a {\n  color: #42b983;\n  color: var(--theme-color, #42b983);\n  font-weight: 600\n}\n\n.markdown-section h1 {\n  font-size: 32px;\n  font-size: 2rem;\n  margin: 0 0 16px;\n  margin: 0 0 1rem\n}\n\n.markdown-section h2 {\n  font-size: 28px;\n  font-size: 1.75rem;\n  margin: 45px 0 12.8px;\n  margin: 45px 0 .8rem\n}\n\n.markdown-section h3 {\n  font-size: 24px;\n  font-size: 1.5rem;\n  margin: 40px 0 9.6px;\n  margin: 40px 0 .6rem\n}\n\n.markdown-section h4 {\n  font-size: 20px;\n  font-size: 1.25rem\n}\n\n.markdown-section h5, .markdown-section h6 {\n  font-size: 16px;\n  font-size: 1rem\n}\n\n.markdown-section h6 {\n  color: #777\n}\n\n.markdown-section figure, .markdown-section ol, .markdown-section p, .markdown-section ul {\n  margin: 1.2em 0\n}\n\n.markdown-section ol, .markdown-section p, .markdown-section ul {\n  line-height: 25.6px;\n  line-height: 1.6rem;\n  word-spacing: .8px;\n  word-spacing: .05rem\n}\n\n.markdown-section ol, .markdown-section ul {\n  padding-left: 24px;\n  padding-left: 1.5rem\n}\n\n.markdown-section blockquote {\n  border-left: 4px solid #42b983;\n  border-left: 4px solid var(--theme-color, #42b983);\n  color: #858585;\n  margin: 2em 0;\n  padding-left: 20px\n}\n\n.markdown-section blockquote p {\n  font-weight: 600;\n  margin-left: 0\n}\n\n.markdown-section iframe {\n  margin: 1em 0\n}\n\n.markdown-section em {\n  color: #7f8c8d\n}\n\n.markdown-section code {\n  border-radius: 2px;\n  color: #e96900;\n  font-size: 12.8px;\n  font-size: .8rem;\n  margin: 0 2px;\n  padding: 3px 5px;\n  white-space: nowrap\n}\n\n.markdown-section code, .markdown-section pre {\n  background-color: #f8f8f8;\n  font-family: Roboto Mono, Monaco, courier, monospace\n}\n\n.markdown-section pre {\n  -moz-osx-font-smoothing: initial;\n  -webkit-font-smoothing: initial;\n  line-height: 24px;\n  line-height: 1.5rem;\n  margin: 1.2em 0;\n  overflow: auto;\n  padding: 0 22.4px;\n  padding: 0 1.4rem;\n  position: relative;\n  word-wrap: normal\n}\n\n.token.cdata, .token.comment, .token.doctype, .token.prolog {\n  color: #8e908c\n}\n\n.token.namespace {\n  opacity: .7\n}\n\n.token.boolean, .token.number {\n  color: #c76b29\n}\n\n.token.punctuation {\n  color: #525252\n}\n\n.token.property {\n  color: #c08b30\n}\n\n.token.tag {\n  color: #2973b7\n}\n\n.token.string {\n  color: #42b983;\n  color: var(--theme-color, #42b983)\n}\n\n.token.selector {\n  color: #6679cc\n}\n\n.token.attr-name {\n  color: #2973b7\n}\n\n.language-css .token.string, .style .token.string, .token.entity, .token.url {\n  color: #22a2c9\n}\n\n.token.attr-value, .token.control, .token.directive, .token.unit {\n  color: #42b983;\n  color: var(--theme-color, #42b983)\n}\n\n.token.keyword {\n  color: #e96900\n}\n\n.token.atrule, .token.regex, .token.statement {\n  color: #22a2c9\n}\n\n.token.placeholder, .token.variable {\n  color: #3d8fd1\n}\n\n.token.deleted {\n  text-decoration: line-through\n}\n\n.token.inserted {\n  border-bottom: 1px dotted #202746;\n  text-decoration: none\n}\n\n.token.italic {\n  font-style: italic\n}\n\n.token.bold, .token.important {\n  font-weight: 700\n}\n\n.token.important {\n  color: #c94922\n}\n\n.token.entity {\n  cursor: help\n}\n\n.markdown-section pre > code {\n  -moz-osx-font-smoothing: initial;\n  -webkit-font-smoothing: initial;\n  background-color: #f8f8f8;\n  border-radius: 2px;\n  color: #525252;\n  display: block;\n  font-family: Roboto Mono, Monaco, courier, monospace;\n  font-size: 12.8px;\n  font-size: .8rem;\n  line-height: inherit;\n  margin: 0 2px;\n  max-width: inherit;\n  overflow: inherit;\n  padding: 2.2em 5px;\n  white-space: inherit\n}\n\n.markdown-section code:after, .markdown-section code:before {\n  letter-spacing: .8px;\n  letter-spacing: .05rem\n}\n\ncode .token {\n  -moz-osx-font-smoothing: initial;\n  -webkit-font-smoothing: initial;\n  min-height: 24px;\n  min-height: 1.5rem\n}\n\npre:after {\n  color: #ccc;\n  content: attr(data-lang);\n  font-size: 9.6px;\n  font-size: .6rem;\n  font-weight: 600;\n  height: 15px;\n  line-height: 15px;\n  padding: 5px 10px 0;\n  position: absolute;\n  right: 0;\n  text-align: right;\n  top: 0\n}\n\n.flex-grid-thirds {\n  margin-bottom: 100px;\n  display: flex;\n  justify-content: space-between;\n}\n.flex-grid-thirds .col {\n  width: 32%;\n}"
  },
  {
    "path": "docs/_navbar.md",
    "content": "- Translations\n    - [English](/)\n    "
  },
  {
    "path": "docs/_sidebar.md",
    "content": "<p align=\"center\" id=\"bas\">\n<a href=\"/noty/#/bakers\" id=\"become-a-sponsor\" class=\"bas\">Become a Sponsor</a>\n</p>\n\n- [<div class=\"ps-icon ps-icon-arrow-right\"></div> Home](/)\n- [<div class=\"ps-icon ps-icon-download\"></div> Installation](installation.md)\n- [<div class=\"ps-icon ps-icon-row-setting\"></div> Options & Defaults](options.md)\n- [<div class=\"ps-icon ps-icon-apps\"></div> Types & Layouts](types.md)\n- [<div class=\"ps-icon ps-icon-wand\"></div> Themes](themes.md)\n- [<div class=\"ps-icon ps-icon-switch\"></div> Show & Hide Animations](animations.md)\n- [<div class=\"ps-icon ps-icon-ufo\"></div> Web Push Notifications](push.md)\n- [<div class=\"ps-icon ps-icon-headset\"></div> Confirm Dialogs](confirm.md)\n- [<div class=\"ps-icon ps-icon-puzzle\"></div> API & Callbacks](api.md)\n- [<div class=\"ps-icon ps-icon-laptop\"></div> Browser Support](browsers.md)\n- [<div class=\"ps-icon ps-icon-fried-egg\"></div> Bakers](bakers.md)\n\n"
  },
  {
    "path": "docs/animations.md",
    "content": "### CSS Animations\n\nUsing with class names. (like animate.css)\n\n```javascript\nnew Noty({\n    text: 'NOTY - a dependency-free notification library!',\n    animation: {\n        open: 'animated bounceInRight', // Animate.css class names\n        close: 'animated bounceOutRight' // Animate.css class names\n    }\n}).show();\n```\n\n<p>\n<button id=\"example-animatecss\" class=\"button\">Run Example</button>\n</p>\n\nExample css animation;\n\n```css\n.noty_effects_open {\n  opacity: 0;\n  transform: translate(50%);\n  animation: noty_anim_in 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);\n}\n\n.noty_effects_close {\n  animation: noty_anim_out 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);\n}\n\n@keyframes noty_anim_in {\n  100% {\n    transform: translate(0);\n    opacity: 1;\n  }\n}\n\n@keyframes noty_anim_out {\n  100% {\n    transform: translate(50%);\n    opacity: 0;\n  }\n}\n```\n\n!> **JavaScript animations** are deprecated! But you can use 3rd party animation libraries.\n\n#### Other cool ways\n\n### Animating with bounce.js\n\n> Get [bounce.js](http://bouncejs.com/?ref=notyjs), first. Then;\n\n```javascript\nnew Noty({\n    ...\n    text: 'NOTY - animating with Bounce.js!',\n    ...\n    animation: {\n        open: function (promise) {\n            var n = this;\n            new Bounce()\n                .translate({\n                    from     : {x: 450, y: 0}, to: {x: 0, y: 0},\n                    easing   : \"bounce\",\n                    duration : 1000,\n                    bounces  : 4,\n                    stiffness: 3\n                })\n                .scale({\n                    from     : {x: 1.2, y: 1}, to: {x: 1, y: 1},\n                    easing   : \"bounce\",\n                    duration : 1000,\n                    delay    : 100,\n                    bounces  : 4,\n                    stiffness: 1\n                })\n                .scale({\n                    from     : {x: 1, y: 1.2}, to: {x: 1, y: 1},\n                    easing   : \"bounce\",\n                    duration : 1000,\n                    delay    : 100,\n                    bounces  : 6,\n                    stiffness: 1\n                })\n                .applyTo(n.barDom, {\n                    onComplete: function () {\n                        promise(function(resolve) {\n                            resolve();\n                        })\n                    }\n                });\n        },\n        close: function (promise) {\n            var n = this;\n            new Bounce()\n                .translate({\n                    from     : {x: 0, y: 0}, to: {x: 450, y: 0},\n                    easing   : \"bounce\",\n                    duration : 500,\n                    bounces  : 4,\n                    stiffness: 1\n                })\n                .applyTo(n.barDom, {\n                    onComplete: function () {\n                        promise(function(resolve) {\n                            resolve();\n                        })\n                    }\n                });\n        }\n    }\n}).show();\n```\n\n<p>\n<button id=\"example-bouncejs\" class=\"button\">Run Example</button>\n</p>\n\n\n!> **Important**: You need to resolve promises for this type of usage.\n\n### Animating with mo.js\n\n> Get [mo.js](https://mojs.github.io/), first. Then;\n\n```javascript\nnew Noty({\n    ...\n    text: 'NOTY - animating with Mo.js!',\n    ...\n    animation: {\n        open: function (promise) {\n            var n = this;\n            var Timeline = new mojs.Timeline();\n            var body = new mojs.Html({\n                el        : n.barDom,\n                x         : {500: 0, delay: 0, duration: 500, easing: 'elastic.out'},\n                isForce3d : true,\n                onComplete: function () {\n                    promise(function(resolve) {\n                        resolve();\n                    })\n                }\n            });\n\n            var parent = new mojs.Shape({\n                parent: n.barDom,\n                width      : 200,\n                height     : n.barDom.getBoundingClientRect().height,\n                radius     : 0,\n                x          : {[150]: -150},\n                duration   : 1.2 * 500,\n                isShowStart: true\n            });\n\n            n.barDom.style['overflow'] = 'visible';\n            parent.el.style['overflow'] = 'hidden';\n\n            var burst = new mojs.Burst({\n                parent  : parent.el,\n                count   : 10,\n                top     : n.barDom.getBoundingClientRect().height + 75,\n                degree  : 90,\n                radius  : 75,\n                angle   : {[-90]: 40},\n                children: {\n                    fill     : '#EBD761',\n                    delay    : 'stagger(500, -50)',\n                    radius   : 'rand(8, 25)',\n                    direction: -1,\n                    isSwirl  : true\n                }\n            });\n\n            var fadeBurst = new mojs.Burst({\n                parent  : parent.el,\n                count   : 2,\n                degree  : 0,\n                angle   : 75,\n                radius  : {0: 100},\n                top     : '90%',\n                children: {\n                    fill     : '#EBD761',\n                    pathScale: [.65, 1],\n                    radius   : 'rand(12, 15)',\n                    direction: [-1, 1],\n                    delay    : .8 * 500,\n                    isSwirl  : true\n                }\n            });\n\n            Timeline.add(body, burst, fadeBurst, parent);\n            Timeline.play();\n        },\n        close: function (promise) {\n            var n = this;\n            new mojs.Html({\n                el        : n.barDom,\n                x         : {0: 500, delay: 10, duration: 500, easing: 'cubic.out'},\n                skewY     : {0: 10, delay: 10, duration: 500, easing: 'cubic.out'},\n                isForce3d : true,\n                onComplete: function () {\n                    promise(function(resolve) {\n                        resolve();\n                    })\n                }\n            }).play();\n        }\n    }\n}).show();\n```\n\n<p>\n<button id=\"example-mojs\" class=\"button\">Run Example</button>\n</p>\n\n\n!> **Important**: You need to resolve promises for this type of usage.\n\n### Animating with velocity\n\n> Get [velocity](http://velocityjs.org/?ref=notyjs), first. Then;\n\n```javascript\nnew Noty({\n    ...\n    text: 'NOTY - animating with velocity!',\n    ...\n    animation: {\n        open: function (promise) {\n            var n = this;\n            Velocity(n.barDom, {\n                left: 450,\n                scaleY: 2\n            }, {\n                duration: 0\n            });\n            Velocity(n.barDom, {\n                left: 0,\n                scaleY: 1\n            }, {\n                easing: [ 8, 8 ],\n                complete: function() {\n                    promise(function(resolve) {\n                        resolve();\n                    })\n                }\n            });\n        },\n        close: function (promise) {\n            var n = this;\n            Velocity(n.barDom, {\n                left: '+=-50'\n            }, {\n                easing: [ 8, 8, 2],\n                duration: 350\n            });\n            Velocity(n.barDom, {\n                left: 450,\n                scaleY: .2,\n                height: 0,\n                margin: 0\n            }, {\n                easing: [ 8, 8 ],\n                complete: function () {\n                    promise(function(resolve) {\n                        resolve();\n                    })\n                }\n            });\n        }\n    }\n}).show();\n```\n\n<p>\n<button id=\"example-velocity\" class=\"button\">Run Example</button>\n</p>\n\n!> **Important**: You need to resolve promises for this type of usage.\n\n"
  },
  {
    "path": "docs/api.md",
    "content": "### API Methods\n\n```javascript\nvar n = new Noty({text: 'Hi!'});\n\nconsole.log(n); // Returns a NOTY javascript object\n\nn.show(); // Show a NOTY\nn.close(); // Close a NOTY\nn.setText('Hi again!'); // Notification text updater. Important: .noty_body class is required for setText API method.\nn.setType('error'); // Notification type updater\nn.setTheme('newTheme'); // Notification theme updater\nn.setTimeout(4500); // false (clears timeout) or integer (clears timer, starts for given value)\nn.stop(); // Clears the timeout\nn.resume(); // Restarts the timeout\n```\n\n> **setText()**, **setType()** and **setTheme()** methods doesn't override NOTY's options.<br>\nIf you wanna override those values pass a second parameter as boolean **true**.\n\n### API Static Methods\n\n```javascript\nNoty.closeAll(); // Closes all notifications\nNoty.closeAll('myCustomQueueName'); // Closes all notifications with queue named 'myCustomQueueName'\n\nNoty.setMaxVisible(10); // Sets the maxVisible notification count for global queue;\nNoty.setMaxVisible(10, 'myCustomQueueName'); // Sets the maxVisible notification count for 'myCustomQueueName' queue;\n```\n\n> Default **maxVisible** value is **5** for all queues.\n\n### Callbacks\n\n```javascript\nnew Noty({\n    ...\n    callbacks: {\n        beforeShow: function() {},\n        onShow: function() {},\n        afterShow: function() {},\n        onClose: function() {},\n        afterClose: function() {},\n        onHover: function() {},\n        onTemplate: function() {\n            this.barDom.innerHTML = '<div class=\"my-custom-template noty_body\">' + this.options.text + '<div>';\n            // Important: .noty_body class is required for setText API method.\n        }\n    }\n    ...\n}).show();\n```\n\n### Callbacks Alternative Usage\n\n```javascript\nnew Noty({\n    ...\n}).on('onShow', function() {\n    ...\n}).on('afterShow', function() {\n    ...\n}).show();\n\n// Important: You need to call on() methods before the show() method.\n```\n\n### Custom Templating\n\n!> Custom templating is possible with **onTemplate** callback.\n\n> **Suggestion**: You can also use a template library as an alternative. \n\n<script async src=\"//jsfiddle.net/needim/jo2t9skf/embed/\"></script>\n"
  },
  {
    "path": "docs/bakers.md",
    "content": "# Support my Projects\n\nHi! Noty.js and [my other libraries](https://github.com/needim) are MIT licensed open source projects and they are completely free to use.\nHowever, the amount of effort needed to maintain and develop new features for these projects is not sustainable without proper financial backing.\nYou can support my works by <a href=\"https://www.patreon.com/bePatron?u=5075261\">pledging on Patreon</a> (recurring, with perks for different tiers).\n\n<a class=\"jmgFob\" href=\"https://www.patreon.com/bePatron?u=5075261\" data-patreon-widget-type=\"become-patron-button\">\n  <span class=\"sc-ifAKCX hyFnYR\"><svg viewBox=\"0 0 569 546\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"><title>Patreon logo</title><g><circle data-color=\"1\" id=\"Oval\" cx=\"362.589996\" cy=\"204.589996\" r=\"204.589996\"></circle><rect data-color=\"2\" id=\"Rectangle\" x=\"0\" y=\"0\" width=\"100\" height=\"545.799988\"></rect></g></svg></span>\n  Become a Sponsor or Baker!\n</a>\n\n## Current Sponsors\n\n<div class=\"supported-by\" style=\"margin-right: 20px\">\n    <a target=\"_blank\" href=\"https://idealecasinos.nl/\">\n        <img src=\"_media/ideal_casinos_logo_140_140.svg\" width=\"120\" alt=\"online casinos met ideal\">\n    </a>\n</div>\n\n<div class=\"supported-by\">\n    <a target=\"_blank\" href=\"https://www.correctcasinos.com/free-slots/\">\n        <img src=\"_media/correct-casino-logo.svg\" width=\"250\" alt=\"Best Free Slots\">\n    </a>\n</div>\n\n<div class=\"supported-by\">\n    <a target=\"_blank\" href=\"https://www.browserstack.com?ref=notyjs\">\n        <img src=\"_media/browserstack.svg\" width=\"220\" alt=\"\">\n    </a>\n</div>\n\n<div class=\"supported-by\">\n    <a target=\"_blank\" href=\"https://www.boostmmr.com/\">\n        <img src=\"https://i.ibb.co/99682Vb/boostmmr.jpg\" width=\"180\" alt=\"\">\n    </a>\n</div>\n\n<div class=\"supported-by\">\n    <a target=\"_blank\" href=\"https://goread.io/buy-instagram-followers\">\n        <img src=\"_media/Favicongoread.png\" width=\"85\" alt=\"Buy Instagram Followers\">\n    </a>\n</div>\n\n<div class=\"supported-by\">\n    <a target=\"_blank\" href=\"https://nettikasinot.org\" style=\"background: #2B5FC1;\n    padding: 9px 10px 13px 10px;\">\n        <img src=\"_media/nettikasinot.svg\" width=\"185\" alt=\"Nettikasinot\">\n    </a>\n</div>\n\n<div class=\"supported-by\">\n    <a target=\"_blank\" href=\"https://www.gambledex.com/\">\n        <img src=\"_media/gambledex.png\" width=\"80\" alt=\"Gambledex\">\n    </a>\n</div>\n\n<div class=\"supported-by\">\n    <a target=\"_blank\" href=\"https://casinoshunter.com/online-casinos/real-money/\">\n        <img src=\"_media/casinoshunter-dark.png\" width=\"150\" alt=\"Casinos Hunter\">\n    </a>\n</div>\n\n<div class=\"supported-by\">\n    <a target=\"_blank\" href=\"https://reddogcasino.com/en/games/blackjack\">\n        <img src=\"_media/Red-Dog-Casino-Logo.png\" width=\"150\" alt=\"RedDogCasino\">\n    </a>\n</div>\n\n<div class=\"supported-by\">\n    <a target=\"_blank\" href=\"https://slotsempire.com\">\n        <img src=\"_media/slots-empire.webp\" width=\"150\" alt=\"Online Slots Empire Casino\">\n    </a>\n</div>\n\n!> **$30 or more per month** <br> I'll put your logo on all my project's websites & GitHub readme pages. (for the period of subscription) (**30k+ unique pageviews**)\n\n## Current Bakers\n\n- Your name\n- Your name\n- ...\n\n!> **$1 or more per month** <br> I'll put your name on all my project's websites bakers page & GitHub repo bakers.md. (for the period of subscription)\n"
  },
  {
    "path": "docs/browsers.md",
    "content": "!> This data is provided by BrowserStack Automate \n\n\n#### Local run  2017 07 27T17:31:03.314Z \n\n| OS | Browser | Result | Details | \n| --- | --- | --- | --- | \n| Windows 10 | opera 46.0  | done | [view](https://www.browserstack.com/automate/builds/7d2483377687d162b9bc20fcaf3cb1bfb8f5bec0/sessions/c259644238854e4628696d8cfea9482b96a78a07?auth_token=f87c9cb1ab62bb7b85af973cc2a1b03bd9d35fbc6a9e38b716fe38b01c4c3480) |\n| Windows 10 | chrome 59.0  | done | [view](https://www.browserstack.com/automate/builds/7d2483377687d162b9bc20fcaf3cb1bfb8f5bec0/sessions/dc87007925cb5729ac8aa2a6136aab1fb6808cc1?auth_token=04d2d0b39bcdbb76153ee28e3acf67099ecbd9a093c6176df9ad892c083663c6) |\n| OS X El Capitan | safari 9.1  | done | [view](https://www.browserstack.com/automate/builds/7d2483377687d162b9bc20fcaf3cb1bfb8f5bec0/sessions/0c60211cab5840456ac824443e3be99b195597b5?auth_token=9daf8b81531fe858108d9d76317b171c7dca69dee3ac3a25e065810fd353b837) |\n| Windows 10 | firefox 54.0  | done | [view](https://www.browserstack.com/automate/builds/7d2483377687d162b9bc20fcaf3cb1bfb8f5bec0/sessions/336cf3a8db5363d7683f01392d4d328fce18838a?auth_token=e93ad65f77003c53f0e7392f2bbd38d56811d1d6ce4e1f9f098494caa240ef21) |\n| Windows 10 | edge 15.0  | done | [view](https://www.browserstack.com/automate/builds/7d2483377687d162b9bc20fcaf3cb1bfb8f5bec0/sessions/a2bb1f252f478c5b5cd4fdc06158830305120ea2?auth_token=c75ad2904602c489145eaf2ce18b8f5723a843cb6c8dcc62a60982dc6109ef27) |\n| Windows 8 | ie 10.0  | done | [view](https://www.browserstack.com/automate/builds/7d2483377687d162b9bc20fcaf3cb1bfb8f5bec0/sessions/d85b895f81c51f9cd5c72c225c9f155b331902c6?auth_token=bd85550ce628686d6485062a32cc869abf2dcb7a2b9862b3884ebc7d4283d344) |\n"
  },
  {
    "path": "docs/confirm.md",
    "content": "We can set button objects with an array like below;\n\n```javascript\nvar n = new Noty({\n  text: 'Do you want to continue? <input id=\"example\" type=\"text\">',\n  buttons: [\n    Noty.button('YES', 'btn btn-success', function () {\n        console.log('button 1 clicked');\n    }, {id: 'button1', 'data-status': 'ok'}),\n\n    Noty.button('NO', 'btn btn-error', function () {\n        console.log('button 2 clicked');\n        n.close();\n    })\n  ]\n});\nn.show();\n```\n\n?> **Noty.button**(**text**:string, **classNames**:string, **cb**:function, **attributes**:object<optional>);\n\n!> **About button styling**: Noty doesn't care about that. You need to pass class names with your styles.\n"
  },
  {
    "path": "docs/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"UTF-8\">\n  <title>NOTY - a dependency-free notification library</title>\n  <meta name=\"description\" content=\"noty is a notification library which is have too many options for display notification\">\n  <meta name=\"viewport\" content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\">\n  <meta name=\"keywords\" content=\"notification, library, opensource, open, source\">\n  <meta name=\"author\" content=\"Nedim Arabacı (http://ned.im)\">\n  <link rel=\"stylesheet\" href=\"_assets/vue.css\">\n  <link rel=\"stylesheet\" href=\"_assets/ps-icon-pack.min.css\">\n  <link href=\"https://fonts.googleapis.com/css?family=Nunito:300,400,600,700|Zilla+Slab:300,400,600,700|Fira+Mono\" rel=\"stylesheet\">\n  <link rel=\"stylesheet\" href=\"//cdn.rawgit.com/needim/noty/77268c46/lib/noty.css\">\n  <link rel=\"stylesheet\" href=\"//cdnjs.cloudflare.com/ajax/libs/animate.css/3.5.2/animate.min.css\">\n  <script async defer src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"></script>\n  <style type=\"text/css\">\n    body {\n      font-family: \"Zilla Slab\", Source Sans Pro, Helvetica Neue, Arial, sans-serif;\n      letter-spacing: .03em;\n      font-size: 17px;\n    }\n\n    h1,\n    h2,\n    h3,\n    h4,\n    h5,\n    h6,\n    .sidebar-nav,\n    .noty_body,\n    .jmgFob,\n    nav,\n    button {\n      font-family: \"Nunito\", Source Sans Pro, Helvetica Neue, Arial, sans-serif !important;\n    }\n\n    .text-center {\n      text-align: center;\n    }\n\n    .app-nav li ul {\n      padding: 0;\n    }\n\n    .app-sub-sidebar .section-link:before {\n      content: \" \";\n    }\n\n    .markdown-section pre>code {\n      font-family: \"Fira Mono\", \"Roboto Mono\", Monaco, courier, monospace;\n    }\n\n    .supported-by {\n      padding: 15px 15px 15px 0;\n      display: inline-block;\n    }\n\n    .supported-by a {\n      text-decoration: none;\n      color: #FF75ED;\n    }\n\n    .supported-by img {\n      vertical-align: middle;\n    }\n\n    .button,\n    .bas {\n      display: inline-block;\n      position: relative;\n      padding: .8em 1.3em;\n      font-size: 11px;\n      letter-spacing: 1px;\n      font-weight: 800;\n      text-transform: uppercase;\n      line-height: 1.2;\n      outline: 0;\n      background: #AC8FFD;\n      border: 2px solid #948CE2;\n      color: #fff;\n      text-shadow: none;\n      border-radius: 2px;\n      cursor: pointer;\n    }\n\n    .bas {\n      background: #fff;\n      color: #AC8FFD;\n      border-color: #AC8FFD;\n      text-transform: none;\n      text-decoration: none;\n      transition: all .2s;\n    }\n\n    .bas:hover {\n      background: #AC8FFD;\n      color: #fff;\n    }\n\n    .button:hover {\n      background-color: #c0a7fd;\n      border-color: #948CE2;\n    }\n\n    a.edit-this-page {\n      float: right;\n      color: #444;\n    }\n\n    .noty_body {\n      font-size: 16px !important;\n    }\n\n    .jmgFob {\n      -webkit-backface-visibility: hidden;\n      backface-visibility: hidden;\n      background-color: #F96854;\n      border: 2px solid #F96854;\n      border-radius: 0;\n      box-sizing: border-box;\n      color: #FFFFFF !important;\n      display: inline-block;\n      font-size: 1rem !important;\n      font-weight: 700 !important;\n      padding: 0.2rem 0.75rem;\n      position: relative;\n      text-align: center;\n      text-decoration: none;\n      text-transform: none;\n      -webkit-transition: all 300ms cubic-bezier(0.19, 1, 0.22, 1);\n      transition: all 300ms cubic-bezier(0.19, 1, 0.22, 1);\n      -webkit-user-select: none;\n      -moz-user-select: none;\n      -ms-user-select: none;\n      user-select: none;\n      white-space: nowrap;\n      cursor: pointer;\n      margin-top: 10px;\n    }\n\n    .jmgFob:hover {\n      background-color: #FA7664;\n      border-color: #FA7664;\n      box-shadow: 0 0.25rem 0.75rem rgba(5, 45, 73, 0.09999999999999998);\n    }\n\n    .hyFnYR svg {\n      -webkit-align-self: center;\n      -ms-flex-item-align: center;\n      align-self: center;\n      height: 0.75rem;\n      width: 0.75rem;\n    }\n\n    .hyFnYR svg *[data-color='1'] {\n      fill: #FFFFFF;\n      -webkit-transition: all 300ms cubic-bezier(0.19, 1, 0.22, 1);\n      transition: all 300ms cubic-bezier(0.19, 1, 0.22, 1);\n    }\n\n    .hyFnYR svg *[data-color='2'] {\n      fill: #052D49;\n      -webkit-transition: all 300ms cubic-bezier(0.19, 1, 0.22, 1);\n      transition: all 300ms cubic-bezier(0.19, 1, 0.22, 1);\n    }\n\n    @media screen and (max-width: 500px) {\n      a.edit-this-page {\n        float: none;\n        display: block;\n      }\n    }\n\n    #carbonads {\n      display: block;\n      overflow: auto;\n      max-width: 400px;\n      border: 1px solid #eaeaea;\n      border-radius: 5px;\n      padding: 5px 5px 1px 5px;\n    }\n\n    .carbon-wrap .carbon-img {\n      float: left;\n      width: 145px;\n    }\n\n    #carbonads a {\n      color: #858585;\n      font-size: .9em;\n    }\n\n    #carbonads a:hover {\n      color: #000;\n    }\n\n    .carbon-wrap .carbon-img img {\n      margin-right: 15px;\n    }\n\n    .carbon-poweredby {\n      display: block;\n      margin-top: 10px;\n      font-size: .8em !important;\n      text-decoration: none;\n    }\n\n    .sidebar li {\n      margin: 0 0 0 24px;\n    }\n\n    .sidebar {\n      padding: 0 0 40px 0;\n    }\n  </style>\n</head>\n\n<body>\n  <div id=\"app\"></div>\n</body>\n<script>\n  window.$docsify = {\n    name: '',\n    auto2top: true,\n    loadSidebar: true,\n    maxLevel: 4,\n    subMaxLevel: 3,\n    themeColor: '#FF75ED',\n    executeScript: true,\n    loadNavbar: true,\n    coverpage: false,\n    autoHeader: true,\n    mergeNavbar: true,\n    formatUpdated: '{MM}/{DD} {HH}:{mm}',\n    ga: 'UA-46744044-1',\n    plugins: [\n      function (hook, vm) {\n        hook.beforeEach(function (html) {\n          var url = 'https://github.com/needim/noty/blob/master/docs/' + vm.route.file\n          var editHtml = '<a class=\"edit-this-page\" href=\"' + url + '\">Edit this page on GitHub<\\/a>\\n'\n          var footer = [\n            '',\n          ]\n          return html\n            + '\\n----\\n'\n            + 'Last modified {docsify-updated} '\n            + editHtml\n            + '\\n----\\n'\n            + footer.join('')\n        })\n      },\n\n      function (hook, vm) {\n        hook.doneEach(function () {\n          try {\n\n            if (vm.route.path === '/') {\n              (function (d, script) {\n                script = d.createElement('script')\n                script.type = 'text/javascript'\n                script.async = true\n                script.setAttribute('id', 'gh-buttons')\n                script.onload = function () { }\n                script.src = 'https://buttons.github.io/buttons.js'\n                d.getElementsByTagName('head')[0].appendChild(script)\n              }(document));\n            }\n\n            if (vm.route.path === '/themes') {\n              console.log(\"wow\")\n              RenderPreviews()\n            }\n\n            if (vm.route.path !== '/bakers') {\n              (function (d, script) {\n                script = d.createElement('script')\n                script.type = 'text/javascript'\n                script.async = true\n                script.setAttribute('id', '_carbonads_js')\n                script.onload = function () { }\n                script.src = '//cdn.carbonads.com/carbon.js?serve=CKYIL2QN&placement=nedimnoty'\n                var p = d.getElementsByClassName('markdown-section')[0]\n                p.insertBefore(script, p.getElementsByTagName('h1')[0].nextSibling)\n              }(document))\n            }\n\n          } catch (err) { }\n        })\n      }\n    ]\n  }\n</script>\n<script src=\"_assets/docsify.js\"></script>\n<script src=\"//unpkg.com/docsify/lib/plugins/emoji.min.js\"></script>\n<script src=\"//unpkg.com/prismjs/components/prism-bash.min.js\"></script>\n<script src=\"//unpkg.com/docsify/lib/plugins/external-script.min.js\"></script>\n<script src=\"//unpkg.com/docsify/lib/plugins/ga.min.js\"></script>\n\n<script src=\"//code.jquery.com/jquery-2.2.4.min.js\" integrity=\"sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=\" crossorigin=\"anonymous\"></script>\n<script src=\"//cdn.rawgit.com/needim/noty/77268c46/lib/noty.min.js\"></script>\n<script src=\"//cdn.jsdelivr.net/mojs/latest/mo.min.js\"></script>\n<script src=\"//cdn.jsdelivr.net/velocity/1.5/velocity.min.js\"></script>\n<script src=\"_assets/bounce.min.js\"></script>\n<script src=\"_assets/docs.js\"></script>\n\n</html>\n"
  },
  {
    "path": "docs/installation.md",
    "content": "Include **lib/noty.css** & **lib/noty.js**\nor use Bower, NPM, Yarn or Composer\n\n```html\n<link href=\"lib/noty.css\" rel=\"stylesheet\">\n<script src=\"lib/noty.js\" type=\"text/javascript\"></script>\n```\n\n!> NOTY v3 **is NOT dependent to jQuery** anymore.\n\n### Install via Bower\n\n```bash\n$ bower install noty\n```\n\n### Install via NPM\n\n```bash\n$ npm install noty\n```\n\n### Install via Yarn\n\n```bash\n$ yarn add noty\n```\n\n### Install via Composer\n\n```bash\n$ composer require needim/noty\n```\n\n#### For the Laravel\n\nAdd to `resources/assets/sass/app.scss`\n```scss\n@import \"~noty/src/noty.scss\";\n@import \"~noty/src/themes/mint.scss\";\n```\n\nAdd to `resources/assets/js/bootstrap.js`\n```javascript\nwindow.Noty = require('noty');\n```\n\nThen run `yarn dev` or `npm run dev`\n\n### Usage: Creating a Notification\n\n```javascript\nnew Noty({\n    ...\n    text: 'Some notification text',\n    ...\n}).show();\n```\n\n### ES6 import & Require Usages\n\n```javascript\nimport Noty from 'noty';\nnew Noty({\n    ...\n    text: 'Some notification text',\n    ...\n}).show();\n\nconst Noty = require('noty');\nnew Noty({\n    ...\n    text: 'Some notification text',\n    ...\n}).show();\n```\n\n### RequireJS\n\n!> While defining path for Noty you should write \"Noty\" with capital letter of N. \n\n```javascript\nrequirejs.config({\n\tpaths: {\n\t\t\"Noty\": \"libs/noty.min\",\n    ...\n\t},\n    ...\n```\n"
  },
  {
    "path": "docs/options.md",
    "content": "Creating a notification;\n\n```javascript\nnew Noty({\n    ...\n    text: 'Some notification text',\n    ...\n}).show();\n```\n\nAvailable options listed below.\n\n| Option | Default | Info |\n| --- | --- | --- |\n| **type**: string | 'alert' | alert, success, error, warning, info - ClassName generator uses this value → `noty_type__${type}` |\n| **layout**: string | 'topRight' | top, topLeft, topCenter, topRight, center, centerLeft, centerRight, bottom, bottomLeft, bottomCenter, bottomRight - ClassName generator uses this value → `noty_layout__${layout}` |\n| **theme**: string | 'mint' | relax, mint, metroui - ClassName generator uses this value → `noty_theme__${theme}` |\n| **text**: string |  '' | This string can contain HTML too. But be careful and don't pass user inputs to this parameter. |\n| **timeout**: boolean,int | false | false, 1000, 3000, 3500, etc. Delay for closing event in milliseconds (ms). Set 'false' for sticky notifications. |\n| **progressBar**: boolean | true | true, false - Displays a progress bar if timeout is not false. |\n| **closeWith**: [...string] | ['click'] | click, button |\n| **animation.open**: string,null,function | 'noty_effects_open' | If **string**, assumed to be CSS class name. If **null**, no animation at all. If **function**, runs the function. (v3.0.1+) You can use animate.css class names or your custom css animations as well. |\n| **animation.close**: string,null,function | 'noty_effects_close' | If **string**, assumed to be CSS class name. If **null**, no animation at all. If **function**, runs the function. (v3.0.1+) You can use animate.css class names or your custom css animations as well. |\n| **sounds.sources**: [...string] | [] | **v3.1.0-beta** Array of audio sources e.g 'some.wav' [Check browser support](http://caniuse.com/#search=audio) |\n| **sounds.volume**: int | 1 | **v3.1.0-beta** Integer value between 0-1 e.g 0.5 [Check browser support](http://caniuse.com/#search=audio) |\n| **sounds.conditions**: [...string] | [] | **v3.1.0-beta** There are two conditions for now: **'docVisible'** & **'docHidden'**. You can use one of them or both. [Check browser support](http://caniuse.com/#search=audio) |\n| **docTitle.conditions**: [...string] | [] | **v3.1.0-beta** There are two conditions for now: **'docVisible'** & **'docHidden'**. You can use one of them or both. |\n| **modal**: boolean | false | **v3.1.0-beta** Behaves like v2 but more stable |\n| **id**: string,boolean | false | You can use this id with querySelectors. Generated automatically if false. |\n| **force**: boolean | false | DOM insert method depends on this parameter. If false uses append, if true uses prepend. |\n| **queue**: string | 'global' | NEW Named queue system. Details are [here](api.md). |\n| **killer**: boolean,string | false | If true closes all **visible** notifications and shows itself. If string(queueName) closes all **visible** notification on this queue and shows itself. |\n| **container**: boolean,string | false | Custom container selector string. Like '.my-custom-container'. Layout parameter will be ignored. |\n| **buttons**: [...Noty.button] | [] | An array of Noty.button, for creating confirmation dialogs. Details are [here](confirm.md). |\n| **callbacks.beforeShow**: function | Default: () => {} | Details are [here](api.md). |\n| **callbacks.onShow**: function | Default: () => {} | Details are [here](api.md). |\n| **callbacks.afterShow**: function | Default: () => {} | Details are [here](api.md). |\n| **callbacks.onClose**: function | Default: () => {} | Details are [here](api.md). |\n| **callbacks.afterClose**: function | Default: () => {} | Details are [here](api.md). |\n| **callbacks.onHover**: function | Default: () => {} | Details are [here](api.md). |\n| **callbacks.onClick**: function | Default: () => {} | Only works if `closeWith` = `['click']`. Details are [here](api.md). | \n| **callbacks.onTemplate**: function | Default: () => {} | Mainly for DOM manipulations. Details are [here](api.md). |\n| **visibilityControl**: boolean | false | If **true** Noty uses PageVisibility API to handle timeout. To ensure that users do not miss their notifications. |\n\n[See a detailed example on Jsfiddle.](https://jsfiddle.net/znyh891t/)\n\n### Overriding Options\n\nOf course, you can override default values;\n\n```javascript\nNoty.overrideDefaults({\n    layout   : 'topRight',\n    theme    : 'mint',\n    closeWith: ['click', 'button'],\n    animation: {\n        open : 'animated fadeInRight',\n        close: 'animated fadeOutRight'\n    }\n});\n```\n"
  },
  {
    "path": "docs/push.md",
    "content": "With v3.1.0-beta push notifications are supported with service worker implementation.\n\n### Preparation Steps\n\n* 1) Create a project on the [Firebase Developer Console](https://console.firebase.google.com/).\n* 2) Go to **Project settings** (The cog near the top left corner), click the ' **Cloud Messaging**' tab.\n* 3) Note that **Server Key** and **Sender ID**.\n* 4) Create a copy of [manifest.json.template](https://github.com/needim/noty/blob/master/manifest.json.template) called **manifest.json** at root folder\n* 5) Replace <your-sender-id> in your new manifest.json with your own Sender ID from the Firebase Developer Console project.\n* 6) Create a copy of [service-worker.js.template](https://github.com/needim/noty/blob/master/service-worker.js.template) called **service-worker.js** at root folder\n* 7) Link your manifest <link rel=\"manifest\" href=\"../manifest.json\">\n\n##### Now half of the job is done.\n\n### Let's create a Noty.Push instance\n\n```javascript\nconst NotyPush = Noty.Push('/service-worker.js')\n  .on('onPermissionGranted', function () {\n    console.log('Perm: granted')\n  })\n  .on('onPermissionDenied', function () {\n    console.log('Perm: denied')\n  })\n  .on('onSubscriptionSuccess', function (subData) {\n    console.log('Subscription:', subData)\n    // (YOU NEED TO STORE THIS VALUES FOR LATER USE)\n  })\n  .on('onSubscriptionCancel', function (subData) {\n    console.log('Subscription: canceled')\n  })\n  .on('onWorkerSuccess', function () {\n    console.log('Worker: installed')\n  })\n  .on('onWorkerError', function (err) {\n    console.log('Worker: failed', err)\n  })\n  .on('onWorkerNotSupported', function (err) {\n    console.log('Worker: not supported', err)\n  })\n```\n\n### Let's Ask User's Permission\n\n```javascript\nNotyPush.requestSubscription()\n```\n\nNow the browser will ask permission. And if the user allows it, the service worker will be registered.\n\n!> **You have to store subData onSubscriptionSuccess callback for later use.**\n\n### Sending push notifications from backend (Node.js)\n\nNow that we have subscription information, we can send notifications with [**web-push**](https://github.com/web-push-libs/web-push) library.\n\nLet's install [**web-push**](https://github.com/web-push-libs/web-push) first.\n\n```\n$ npm install web-push\n```\n\nCreate a JavaScript file called sendPushExample.js\n\n```javascript\nconst webpush = require('web-push')\n\nconst vapidKeys = webpush.generateVAPIDKeys()\n\nwebpush.setGCMAPIKey('YOUR-SERVER-KEY-FROM-FIREBASE-CONSOLE')\n\nwebpush.setVapidDetails(\n  'mailto:your@email.com',\n  vapidKeys.publicKey,\n  vapidKeys.privateKey\n)\n\n// Use your previously saved subscription information\nconst pushSubscription = {\n  endpoint: '',\n  keys: {\n    auth: '',\n    p256dh: ''\n  }\n}\n\n// image & actions are optional\nwebpush.sendNotification(pushSubscription, JSON.stringify({\n  title: 'Noty title',\n  body: 'Noty body',\n  icon: 'https://your-icon0-url.png',\n  image: 'https://your-image-url.png',\n  url: 'http://ned.im/noty/?ref=webPushTest',\n  actions: [\n    {action: 'actionYes', 'title': 'Yes', 'icon': 'https://your-icon1-url.png'},\n    {action: 'actionNo', 'title': 'No', 'icon': 'https://your-icon2-url.png'}\n  ]\n}))\n```\n\nAfter that we can run\n\n```\n$ node sendPushExample.js\n```\n\nNotification should look like this for Chrome\n\n![notification example for chrome](_media/notification-example-chrome.png)\n\n### Checking user's current permission\n\n```javascript\nNotyPush.getPermissionStatus() === 'granted'\nNotyPush.getPermissionStatus() === 'default'\nNotyPush.getPermissionStatus() === 'denied'\n\n// In some cases, you may need to check\n// whether your service worker is running.\nNotyPush.isSWRegistered() === true\n\n// You may ask again for permission,\n// If user's permission granted\n// but service worker unregistered or not working.\n```\n"
  },
  {
    "path": "docs/themes.md",
    "content": "**Available Themes**: <br> `mint`, `sunset`, `relax`, `nest`, `metroui`, `semanticui`, `light`, `bootstrap-v3`, `bootstrap-v4`\n\n**Default Theme**: `mint`\n\nUsage;\n\n```javascript\nnew Noty({\n    theme: 'themeName',\n    text: 'Some notification text'\n}).show();\n```\n\n## Theme Previews {docsify-ignore}\n\n<div class=\"theme-previews flex-grid-thirds\">\n    <div class=\"col theme-preview-mint\" data-theme=\"mint\"></div>\n    <div class=\"col theme-preview-sunset\" data-theme=\"sunset\"></div>\n    <div class=\"col theme-preview-relax\" data-theme=\"relax\"></div>\n</div>\n\n<div class=\"theme-previews flex-grid-thirds\">\n    <div class=\"col theme-preview-nest\" data-theme=\"nest\"></div>\n    <div class=\"col theme-preview-metroui\" data-theme=\"metroui\"></div>\n    <div class=\"col theme-preview-semanticui\" data-theme=\"semanticui\"></div>\n</div>\n\n<div class=\"theme-previews flex-grid-thirds\">\n    <div class=\"col theme-preview-light\" data-theme=\"light\"></div>\n    <div class=\"col theme-preview-bootstrap-v3\" data-theme=\"bootstrap-v3\"></div>\n    <div class=\"col theme-preview-bootstrap-v4\" data-theme=\"bootstrap-v4\"></div>\n</div>"
  },
  {
    "path": "docs/types.md",
    "content": "**Types**: <br> `alert`, `success`, `warning`, `error`, `info/information`\n\n**Layouts**: <br> `top`, `topLeft`, `topCenter`, `topRight`, `center`, `centerLeft`, `centerRight`, `bottom`, `bottomLeft`, `bottomCenter`, `bottomRight`\n\nCreating a notification;\n\n```javascript\nnew Noty({\n    type: 'success',\n    layout: 'topRight',\n    text: 'Some notification text'\n}).show();\n```\n\n### Custom Containers\n\nCustom container usage example;\n\n```javascript\nnew Noty({\n    text     : 'Some notification text',\n    container: '.custom-container'\n}).show();\n```\n"
  },
  {
    "path": "docs/v2/animations.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\">\n    <meta name=\"description\" content=\"noty is a jquery plugin which is have too many options for display notification\">\n    <meta name=\"keywords\" content=\"jquery, notification, plugin, opensource, open, source\">\n    <meta name=\"author\" content=\"Nedim Arabacı (http://ned.im)\">\n\n    <title>noty - a jQuery Notification Plugin</title>\n\n    <link href='https://fonts.googleapis.com/css?family=Nunito' rel='stylesheet' type='text/css'>\n\n    <link rel=\"stylesheet\" href=\"vendor/bootstrap.min.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/animate.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/ps-icon-pack.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/custom.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/google-code-prettify/prettify.css\" />\n\n</head>\n\n<body>\n\n    <div class=\"wrapper\">\n\n        <div class=\"container-fluid\">\n\n            <div class=\"col-md-3\">\n\n                <img src=\"img/projects/noty-v2-logo.png\" alt=\"\" class=\"left-logo\">\n\n                <div class=\"project-info mt10 text-muted small\">\n                    <strong>NOTY</strong> is a <strong>jQuery plugin</strong> that makes it easy to create alert - success - error - warning - information - confirmation messages as an alternative the standard alert dialog. Each notification is added\n                    to a queue. (Optional)\n                    <br><br>\n                </div>\n\n                <ul class=\"top-links\">\n                    <li>\n                        <a class=\"active\" href=\"/noty/v2/\"><span class=\"ps-icon ps-icon-code\"></span> Installation</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/options.html\"><span class=\"ps-icon ps-icon-row-setting\"></span> Options & Defaults</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/layouts.html\"> <span class=\"ps-icon ps-icon-apps\"></span> Types & Layouts</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/themes.html\"><span class=\"ps-icon ps-icon-wand\"></span> Theme Library</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/animations.html\"><span class=\"ps-icon ps-icon-blaster\"></span> Show & Hide Animations</a>\n                    </li>\n                    <!--<li>-->\n                    <!--<a href=\"/noty/v2/queuing.html\"><span class=\"ps-icon ps-icon-retweet-1\"></span> Queue System</a>-->\n                    <!--</li>-->\n                    <li>\n                        <a href=\"/noty/v2/confirmations.html\"><span class=\"ps-icon ps-icon-headset\"></span> Confirm Dialogs</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/api.html\"><span class=\"ps-icon ps-icon-branch\"></span> API & Callbacks</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/releases.html\"><span class=\"ps-icon ps-icon-label\"></span> Release History</a>\n                    </li>\n                    <!--<li>-->\n                    <!--<a href=\"/noty/v2/extra.html\"> <span class=\"ps-icon ps-icon-sale-tag\"></span> Extra</a>-->\n                    <!--</li>-->\n                </ul>\n\n                <div class=\"mt20 supported-by\">\n                    <a target=\"_blank\" href=\"https://www.jetbrains.com?ref=notyjs\">\n                        <img src=\"img/projects/logo_JetBrains_4.svg\" width=\"80\" alt=\"\">\n                        <small class=\"text-muted\">&nbsp; Supported by JetBrains</small>\n                    </a>\n                </div>\n\n                <br>\n                <script async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"></script>\n                <!-- Nedim - 336x280 -->\n                <ins class=\"adsbygoogle\" style=\"display:inline-block;width:336px;height:280px\" data-ad-client=\"ca-pub-6920776915496505\" data-ad-slot=\"4982077735\"></ins>\n                <script>\n                    (adsbygoogle = window.adsbygoogle || []).push({});\n                </script>\n\n            </div>\n\n            <div class=\"col-md-9\">\n\n                <div class=\"right-buttons\">\n                    <div class=\"project-links mt30\">\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;repo=noty&amp;type=watch&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"125px\" height=\"35px\"></iframe>\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;repo=noty&amp;type=fork&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"115px\" height=\"35px\"></iframe>\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;type=follow&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"190px\" height=\"35px\"></iframe>\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;repo=noty&amp;type=download&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"162px\" height=\"35px\"></iframe>\n                        <div class=\"sharer-btn text-center\"></div>\n                    </div>\n\n                </div>\n\n                <div class=\"right-content mt10\">\n\n                    <div id=\"options\">\n\n                        <div class=\"row\">\n                            <div class=\"col-xs-12 col-md-12 col-lg-12\">\n\n                                <h1><span class=\"ps-icon ps-icon-blaster\"></span> Show & Hide Animations</h1>\n\n\n                                <div>\n                                    <p>\n                                        1. Using with <a href=\"http://api.jquery.com/animate/\" target=\"_blank\">jQuery animate properties</a>;\n                                    </p>\n\n\n                                    <pre class=\"prettyprint lang-javascript\">\nvar n = noty({\n    text: 'NOTY - a jquery notification library!',\n    animation: {\n        open: {height: 'toggle'},\n        close: {height: 'toggle'},\n        easing: 'swing',\n        speed: 500 // opening &amp; closing animation speed\n    }\n});\n</pre>\n\n                                    <blockquote>\n                                        <strong>About Easing</strong><br> The remaining parameter of .animate() is a string naming an easing function to use. An easing function specifies the speed at which the animation progresses at different points\n                                        within the animation. The only easing implementations in the jQuery library are the default, called swing, and one that progresses at a constant pace, called linear. More easing functions are available with the\n                                        use of plug-ins, most notably the <a href=\"http://jqueryui.com/\" target=\"_blank\">jQuery UI suite</a>.\n                                    </blockquote>\n\n\n                                    <p>\n                                        2. Using with class names. (like animate.css)\n                                    </p>\n\n                                    <pre class=\"prettyprint lang-javascript\">\nvar n = noty({\n    text: 'NOTY - a jquery notification library!',\n    animation: {\n        open: 'animated bounceInLeft', // Animate.css class names\n        close: 'animated bounceOutLeft', // Animate.css class names\n        easing: 'swing', // unavailable - no need\n        speed: 500 // unavailable - no need\n    }\n});\n</pre>\n\n                                    <blockquote>\n                                        <strong>easing</strong> and <strong>speed</strong> <span class=\"imp\">has no effect</span> when <strong>string class name</strong> is being used.\n                                    </blockquote>\n\n                                </div>\n\n                            </div>\n                        </div>\n                    </div>\n\n                    <div class=\"next-section mt30 mb30\">\n                        Next; <a href=\"/noty/v2/confirmations.html\">Confirm Dialogs</a>\n                    </div>\n\n                </div>\n\n            </div>\n\n        </div>\n\n        <script type=\"text/javascript\" src=\"vendor/jquery-1.10.2.min.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/noty-2.4.1/js/noty/packaged/jquery.noty.packaged.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/google-code-prettify/prettify.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/share.min.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/showdown/showdown.min.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/documentation.js\"></script>\n\n        <script>\n            (function(i, s, o, g, r, a, m) {\n                i['GoogleAnalyticsObject'] = r;\n                i[r] = i[r] || function() {\n                    (i[r].q = i[r].q || []).push(arguments)\n                }, i[r].l = 1 * new Date();\n                a = s.createElement(o),\n                    m = s.getElementsByTagName(o)[0];\n                a.async = 1;\n                a.src = g;\n                m.parentNode.insertBefore(a, m)\n            })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n\n            ga('create', 'UA-46744044-1', 'auto');\n            ga('send', 'pageview');\n        </script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/v2/api.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\">\n    <meta name=\"description\" content=\"noty is a jquery plugin which is have too many options for display notification\">\n    <meta name=\"keywords\" content=\"jquery, notification, plugin, opensource, open, source\">\n    <meta name=\"author\" content=\"Nedim Arabacı (http://ned.im)\">\n\n    <title>noty - a jQuery Notification Plugin</title>\n\n    <link href='https://fonts.googleapis.com/css?family=Nunito' rel='stylesheet' type='text/css'>\n\n    <link rel=\"stylesheet\" href=\"vendor/bootstrap.min.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/animate.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/ps-icon-pack.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/custom.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/google-code-prettify/prettify.css\" />\n\n</head>\n\n<body>\n\n    <div class=\"wrapper\">\n\n        <div class=\"container-fluid\">\n\n            <div class=\"col-md-3\">\n\n                <img src=\"img/projects/noty-v2-logo.png\" alt=\"\" class=\"left-logo\">\n\n                <div class=\"project-info mt10 text-muted small\">\n                    <strong>NOTY</strong> is a <strong>jQuery plugin</strong> that makes it easy to create alert - success - error - warning - information - confirmation messages as an alternative the standard alert dialog. Each notification is added\n                    to a queue. (Optional)\n                    <br><br>\n                </div>\n\n                <ul class=\"top-links\">\n                    <li>\n                        <a class=\"active\" href=\"/noty/v2/\"><span class=\"ps-icon ps-icon-code\"></span> Installation</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/options.html\"><span class=\"ps-icon ps-icon-row-setting\"></span> Options & Defaults</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/layouts.html\"> <span class=\"ps-icon ps-icon-apps\"></span> Types & Layouts</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/themes.html\"><span class=\"ps-icon ps-icon-wand\"></span> Theme Library</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/animations.html\"><span class=\"ps-icon ps-icon-blaster\"></span> Show & Hide Animations</a>\n                    </li>\n                    <!--<li>-->\n                    <!--<a href=\"/noty/v2/queuing.html\"><span class=\"ps-icon ps-icon-retweet-1\"></span> Queue System</a>-->\n                    <!--</li>-->\n                    <li>\n                        <a href=\"/noty/v2/confirmations.html\"><span class=\"ps-icon ps-icon-headset\"></span> Confirm Dialogs</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/api.html\"><span class=\"ps-icon ps-icon-branch\"></span> API & Callbacks</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/releases.html\"><span class=\"ps-icon ps-icon-label\"></span> Release History</a>\n                    </li>\n                    <!--<li>-->\n                    <!--<a href=\"/noty/v2/extra.html\"> <span class=\"ps-icon ps-icon-sale-tag\"></span> Extra</a>-->\n                    <!--</li>-->\n                </ul>\n\n                <div class=\"mt20 supported-by\">\n                    <a target=\"_blank\" href=\"https://www.jetbrains.com?ref=notyjs\">\n                        <img src=\"img/projects/logo_JetBrains_4.svg\" width=\"80\" alt=\"\">\n                        <small class=\"text-muted\">&nbsp; Supported by JetBrains</small>\n                    </a>\n                </div>\n\n                <br>\n                <script async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"></script>\n                <!-- Nedim - 336x280 -->\n                <ins class=\"adsbygoogle\" style=\"display:inline-block;width:336px;height:280px\" data-ad-client=\"ca-pub-6920776915496505\" data-ad-slot=\"4982077735\"></ins>\n                <script>\n                    (adsbygoogle = window.adsbygoogle || []).push({});\n                </script>\n\n            </div>\n\n            <div class=\"col-md-9\">\n\n                <div class=\"right-buttons\">\n                    <div class=\"project-links mt30\">\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;repo=noty&amp;type=watch&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"125px\" height=\"35px\"></iframe>\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;repo=noty&amp;type=fork&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"115px\" height=\"35px\"></iframe>\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;type=follow&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"190px\" height=\"35px\"></iframe>\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;repo=noty&amp;type=download&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"162px\" height=\"35px\"></iframe>\n                        <div class=\"sharer-btn text-center\"></div>\n                    </div>\n\n                </div>\n\n                <div class=\"right-content mt10\">\n\n                    <div id=\"api\">\n\n                        <div class=\"row\">\n                            <div class=\"col-xs-12 col-md-12 col-lg-12\">\n\n                                <h1><span class=\"ps-icon ps-icon-branch\"></span> API & Callbacks</h1>\n\n\n                                <div>\n                                    <p>\n                                        <strong>NOTY</strong> have 5 callback option for now. <strong class=\"imp\">onShow</strong> - <strong class=\"imp\">afterShow</strong> - <strong class=\"imp\">onClose</strong> - <strong class=\"imp\">afterClose</strong>                                        - <strong class=\"imp\">afterCloseClick</strong>\n                                    </p>\n\n                                    <h4 class=\"mt30\">\n                                        API Methods\n                                    </h4>\n\n\n                                    <pre class=\"prettyprint lang-javascript\">\nvar n = noty({text: 'Hi!'});\n\n\nconsole.log($.noty.get(n.id)); // Returns a NOTY javascript object\nconsole.log(n); // Returns a NOTY javascript object\n\n\n$.noty.close(n.id); // Close a NOTY\nn.close(); // same as above\n\n\n$.noty.setText(n.id, 'Hi again!'); // Notification text updater\nn.setText('Hi again!'); // same as above\n\n\n$.noty.setType(n.id, 'error'); // Notification type updater\nn.setType('error'); // same as above\n\n\n$.noty.clearQueue(); // Clears the notification queue\n$.noty.closeAll(); // Close all notifications\n</pre>\n\n                                </div>\n\n                            </div>\n                        </div>\n                    </div>\n\n                    <div class=\"next-section mt30 mb30\">\n                        Next; <a href=\"/releases.html\">Release History</a>\n                    </div>\n\n                </div>\n\n            </div>\n\n        </div>\n\n        <script type=\"text/javascript\" src=\"vendor/jquery-1.10.2.min.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/noty-2.4.1/js/noty/packaged/jquery.noty.packaged.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/google-code-prettify/prettify.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/share.min.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/showdown/showdown.min.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/documentation.js\"></script>\n\n        <script>\n            (function(i, s, o, g, r, a, m) {\n                i['GoogleAnalyticsObject'] = r;\n                i[r] = i[r] || function() {\n                    (i[r].q = i[r].q || []).push(arguments)\n                }, i[r].l = 1 * new Date();\n                a = s.createElement(o),\n                    m = s.getElementsByTagName(o)[0];\n                a.async = 1;\n                a.src = g;\n                m.parentNode.insertBefore(a, m)\n            })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n\n            ga('create', 'UA-46744044-1', 'auto');\n            ga('send', 'pageview');\n        </script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/v2/confirmations.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\">\n    <meta name=\"description\" content=\"noty is a jquery plugin which is have too many options for display notification\">\n    <meta name=\"keywords\" content=\"jquery, notification, plugin, opensource, open, source\">\n    <meta name=\"author\" content=\"Nedim Arabacı (http://ned.im)\">\n\n    <title>noty - a jQuery Notification Plugin</title>\n\n    <link href='https://fonts.googleapis.com/css?family=Nunito' rel='stylesheet' type='text/css'>\n\n    <link rel=\"stylesheet\" href=\"vendor/bootstrap.min.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/animate.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/ps-icon-pack.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/custom.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/google-code-prettify/prettify.css\" />\n\n</head>\n\n<body>\n\n    <div class=\"wrapper\">\n\n        <div class=\"container-fluid\">\n\n            <div class=\"col-md-3\">\n\n                <img src=\"img/projects/noty-v2-logo.png\" alt=\"\" class=\"left-logo\">\n\n                <div class=\"project-info mt10 text-muted small\">\n                    <strong>NOTY</strong> is a <strong>jQuery plugin</strong> that makes it easy to create alert - success - error - warning - information - confirmation messages as an alternative the standard alert dialog. Each notification is added\n                    to a queue. (Optional)\n                    <br><br>\n                </div>\n\n                <ul class=\"top-links\">\n                    <li>\n                        <a class=\"active\" href=\"/noty/v2/\"><span class=\"ps-icon ps-icon-code\"></span> Installation</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/options.html\"><span class=\"ps-icon ps-icon-row-setting\"></span> Options & Defaults</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/layouts.html\"> <span class=\"ps-icon ps-icon-apps\"></span> Types & Layouts</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/themes.html\"><span class=\"ps-icon ps-icon-wand\"></span> Theme Library</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/animations.html\"><span class=\"ps-icon ps-icon-blaster\"></span> Show & Hide Animations</a>\n                    </li>\n                    <!--<li>-->\n                    <!--<a href=\"/noty/v2/queuing.html\"><span class=\"ps-icon ps-icon-retweet-1\"></span> Queue System</a>-->\n                    <!--</li>-->\n                    <li>\n                        <a href=\"/noty/v2/confirmations.html\"><span class=\"ps-icon ps-icon-headset\"></span> Confirm Dialogs</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/api.html\"><span class=\"ps-icon ps-icon-branch\"></span> API & Callbacks</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/releases.html\"><span class=\"ps-icon ps-icon-label\"></span> Release History</a>\n                    </li>\n                    <!--<li>-->\n                    <!--<a href=\"/noty/v2/extra.html\"> <span class=\"ps-icon ps-icon-sale-tag\"></span> Extra</a>-->\n                    <!--</li>-->\n                </ul>\n\n                <div class=\"mt20 supported-by\">\n                    <a target=\"_blank\" href=\"https://www.jetbrains.com?ref=notyjs\">\n                        <img src=\"img/projects/logo_JetBrains_4.svg\" width=\"80\" alt=\"\">\n                        <small class=\"text-muted\">&nbsp; Supported by JetBrains</small>\n                    </a>\n                </div>\n\n                <br>\n                <script async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"></script>\n                <!-- Nedim - 336x280 -->\n                <ins class=\"adsbygoogle\" style=\"display:inline-block;width:336px;height:280px\" data-ad-client=\"ca-pub-6920776915496505\" data-ad-slot=\"4982077735\"></ins>\n                <script>\n                    (adsbygoogle = window.adsbygoogle || []).push({});\n                </script>\n\n            </div>\n\n            <div class=\"col-md-9\">\n\n                <div class=\"right-buttons\">\n                    <div class=\"project-links mt30\">\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;repo=noty&amp;type=watch&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"125px\" height=\"35px\"></iframe>\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;repo=noty&amp;type=fork&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"115px\" height=\"35px\"></iframe>\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;type=follow&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"190px\" height=\"35px\"></iframe>\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;repo=noty&amp;type=download&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"162px\" height=\"35px\"></iframe>\n                        <div class=\"sharer-btn text-center\"></div>\n                    </div>\n\n                </div>\n\n                <div class=\"right-content mt10\">\n\n                    <div id=\"confirmations\">\n\n                        <div class=\"row\">\n                            <div class=\"col-xs-12 col-md-12 col-lg-12\">\n\n                                <h1><span class=\"ps-icon ps-icon-headset\"></span> Confirm Dialogs</h1>\n\n\n                                <div>\n                                    <p>\n                                        We can set button objects with an array like above;\n                                    </p>\n\n\n                                    <pre class=\"prettyprint lang-javascript\">\nnoty({\n  text: 'Do you want to continue? &lt;input id=\"example\" type=\"text\"&gt;',\n  buttons: [\n    {addClass: 'btn btn-primary', text: 'Ok', onClick: function($noty) {\n        // this = button element\n        // $noty = $noty element\n\n        console.log($noty.$bar.find('input#example').val());\n\n        $noty.close();\n        noty({text: 'You clicked \"Ok\" button', type: 'success'});\n      }\n    },\n    {addClass: 'btn btn-danger', text: 'Cancel', onClick: function($noty) {\n        $noty.close();\n        noty({text: 'You clicked \"Cancel\" button', type: 'error'});\n      }\n    }\n  ]\n});\n</pre>\n\n                                </div>\n\n                            </div>\n                        </div>\n                    </div>\n\n                    <div class=\"next-section mt30 mb30\">\n                        Next; <a href=\"/noty/v2/api.html\">API & Callbacks</a>\n                    </div>\n\n                </div>\n\n            </div>\n\n        </div>\n\n        <script type=\"text/javascript\" src=\"vendor/jquery-1.10.2.min.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/noty-2.4.1/js/noty/packaged/jquery.noty.packaged.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/google-code-prettify/prettify.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/share.min.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/showdown/showdown.min.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/documentation.js\"></script>\n\n        <script>\n            (function(i, s, o, g, r, a, m) {\n                i['GoogleAnalyticsObject'] = r;\n                i[r] = i[r] || function() {\n                    (i[r].q = i[r].q || []).push(arguments)\n                }, i[r].l = 1 * new Date();\n                a = s.createElement(o),\n                    m = s.getElementsByTagName(o)[0];\n                a.async = 1;\n                a.src = g;\n                m.parentNode.insertBefore(a, m)\n            })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n\n            ga('create', 'UA-46744044-1', 'auto');\n            ga('send', 'pageview');\n        </script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/v2/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\">\n    <meta name=\"description\" content=\"noty is a jquery plugin which is have too many options for display notification\">\n    <meta name=\"keywords\" content=\"jquery, notification, plugin, opensource, open, source\">\n    <meta name=\"author\" content=\"Nedim Arabacı (http://ned.im)\">\n\n    <title>noty - a jQuery Notification Plugin</title>\n\n    <link href='https://fonts.googleapis.com/css?family=Nunito' rel='stylesheet' type='text/css'>\n\n    <link rel=\"stylesheet\" href=\"vendor/bootstrap.min.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/animate.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/ps-icon-pack.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/custom.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/google-code-prettify/prettify.css\" />\n\n</head>\n\n<body>\n\n    <div class=\"wrapper\">\n\n        <div class=\"container-fluid\">\n\n            <div class=\"col-md-3\">\n\n                <img src=\"img/projects/noty-v2-logo.png\" alt=\"\" class=\"left-logo\">\n\n                <div class=\"project-info mt10 text-muted small\">\n                    <strong>NOTY</strong> is a <strong>jQuery plugin</strong> that makes it easy to create alert - success - error - warning - information - confirmation messages as an alternative the standard alert dialog. Each notification is added\n                    to a queue. (Optional)\n                    <br><br>\n                </div>\n\n                <ul class=\"top-links\">\n                    <li>\n                        <a class=\"active\" href=\"/noty/v2/\"><span class=\"ps-icon ps-icon-code\"></span> Installation</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/options.html\"><span class=\"ps-icon ps-icon-row-setting\"></span> Options & Defaults</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/layouts.html\"> <span class=\"ps-icon ps-icon-apps\"></span> Types & Layouts</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/themes.html\"><span class=\"ps-icon ps-icon-wand\"></span> Theme Library</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/animations.html\"><span class=\"ps-icon ps-icon-blaster\"></span> Show & Hide Animations</a>\n                    </li>\n                    <!--<li>-->\n                    <!--<a href=\"/noty/v2/queuing.html\"><span class=\"ps-icon ps-icon-retweet-1\"></span> Queue System</a>-->\n                    <!--</li>-->\n                    <li>\n                        <a href=\"/noty/v2/confirmations.html\"><span class=\"ps-icon ps-icon-headset\"></span> Confirm Dialogs</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/api.html\"><span class=\"ps-icon ps-icon-branch\"></span> API & Callbacks</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/releases.html\"><span class=\"ps-icon ps-icon-label\"></span> Release History</a>\n                    </li>\n                    <!--<li>-->\n                    <!--<a href=\"/noty/v2/extra.html\"> <span class=\"ps-icon ps-icon-sale-tag\"></span> Extra</a>-->\n                    <!--</li>-->\n                </ul>\n\n                <div class=\"mt20 supported-by\">\n                    <a target=\"_blank\" href=\"https://www.jetbrains.com?ref=notyjs\">\n                        <img src=\"img/projects/logo_JetBrains_4.svg\" width=\"80\" alt=\"\">\n                        <small class=\"text-muted\">&nbsp; Supported by JetBrains</small>\n                    </a>\n                </div>\n\n                <br>\n                <script async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"></script>\n                <!-- Nedim - 336x280 -->\n                <ins class=\"adsbygoogle\" style=\"display:inline-block;width:336px;height:280px\" data-ad-client=\"ca-pub-6920776915496505\" data-ad-slot=\"4982077735\"></ins>\n                <script>\n                    (adsbygoogle = window.adsbygoogle || []).push({});\n                </script>\n\n            </div>\n\n            <div class=\"col-md-9\">\n\n                <div class=\"right-buttons\">\n                    <div class=\"project-links mt30\">\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;repo=noty&amp;type=watch&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"125px\" height=\"35px\"></iframe>\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;repo=noty&amp;type=fork&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"115px\" height=\"35px\"></iframe>\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;type=follow&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"190px\" height=\"35px\"></iframe>\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;repo=noty&amp;type=download&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"162px\" height=\"35px\"></iframe>\n                        <div class=\"sharer-btn text-center\"></div>\n                    </div>\n\n                </div>\n\n                <div class=\"right-content mt10\">\n\n                    <div id=\"installation\">\n\n                        <div class=\"row\">\n                            <div class=\"col-xs-12 col-md-12 col-lg-12\">\n\n                                <h1><span class=\"ps-icon ps-icon-code\"></span> Installation</h1>\n\n                                <p>\n                                    1. Include <strong class=\"imp\">jQuery 1.6+</strong>\n                                </p>\n                                <p>\n                                    2. Include <strong class=\"imp\">noty/packaged/jquery.noty.packaged.min.js</strong>.\n                                </p>\n                                <p>That's It. Your code should then be similar to this:</p>\n\n                                <pre class=\"prettyprint lang-javascript\">\n&lt;script type=\"text/javascript\" src=\"http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js\"&gt;&lt;/script&gt;\n&lt;script type=\"text/javascript\" src=\"js/noty/packaged/jquery.noty.packaged.min.js\"&gt;&lt;/script&gt;\n</pre>\n                                <blockquote>\n                                    NOTY is compatible with <strong class=\"imp\">jQuery 1.6+</strong> for now.\n                                    <strong>But if you are using older version then 1.6 you can add promise.js to your header.</strong>\n                                    <br>(Thanks to <a href=\"https://github.com/MrMaksimize\" target=\"_blank\">Maksim Pecherskiy</a>)\n                                </blockquote>\n                            </div>\n\n\n                            <div class=\"col-xs-12 col-md-12 col-lg-12\">\n                                <h3>Install via <a target=\"_blank\" href=\"http://bower.io/\">Bower</a></h3>\n                                <pre class=\"prettyprint lang-bash\">\n$ <span class=\"lit\">bower</span> install noty\n</pre>\n                            </div>\n\n                            <div class=\"col-xs-12 col-md-12 col-lg-12\">\n                                <h3>Install via <a target=\"_blank\" href=\"https://www.npmjs.org/\">NPM</a></h3>\n                                <pre class=\"prettyprint lang-bash\">\n$ <span class=\"lit\">npm</span> install noty\n</pre>\n                            </div>\n\n                        </div>\n\n\n                        <div class=\"next-section mt30 mb30\">\n                            Next; <a href=\"/noty/v2/options.html\">Options & Defaults</a>\n                        </div>\n\n                    </div>\n\n\n                </div>\n\n            </div>\n\n        </div>\n\n        <script type=\"text/javascript\" src=\"vendor/jquery-1.10.2.min.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/noty-2.4.1/js/noty/packaged/jquery.noty.packaged.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/google-code-prettify/prettify.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/share.min.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/showdown/showdown.min.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/documentation.js\"></script>\n\n        <script>\n            (function(i, s, o, g, r, a, m) {\n                i['GoogleAnalyticsObject'] = r;\n                i[r] = i[r] || function() {\n                    (i[r].q = i[r].q || []).push(arguments)\n                }, i[r].l = 1 * new Date();\n                a = s.createElement(o),\n                    m = s.getElementsByTagName(o)[0];\n                a.async = 1;\n                a.src = g;\n                m.parentNode.insertBefore(a, m)\n            })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n\n            ga('create', 'UA-46744044-1', 'auto');\n            ga('send', 'pageview');\n        </script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/v2/layouts.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\">\n    <meta name=\"description\" content=\"noty is a jquery plugin which is have too many options for display notification\">\n    <meta name=\"keywords\" content=\"jquery, notification, plugin, opensource, open, source\">\n    <meta name=\"author\" content=\"Nedim Arabacı (http://ned.im)\">\n\n    <title>noty - a jQuery Notification Plugin</title>\n\n    <link href='https://fonts.googleapis.com/css?family=Nunito' rel='stylesheet' type='text/css'>\n\n    <link rel=\"stylesheet\" href=\"vendor/bootstrap.min.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/animate.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/ps-icon-pack.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/custom.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/google-code-prettify/prettify.css\" />\n\n</head>\n\n<body>\n\n    <div class=\"wrapper\">\n\n        <div class=\"container-fluid\">\n\n            <div class=\"col-md-3\">\n\n                <img src=\"img/projects/noty-v2-logo.png\" alt=\"\" class=\"left-logo\">\n\n                <div class=\"project-info mt10 text-muted small\">\n                    <strong>NOTY</strong> is a <strong>jQuery plugin</strong> that makes it easy to create alert - success - error - warning - information - confirmation messages as an alternative the standard alert dialog. Each notification is added\n                    to a queue. (Optional)\n                    <br><br>\n                </div>\n\n                <ul class=\"top-links\">\n                    <li>\n                        <a class=\"active\" href=\"/noty/v2/\"><span class=\"ps-icon ps-icon-code\"></span> Installation</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/options.html\"><span class=\"ps-icon ps-icon-row-setting\"></span> Options & Defaults</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/layouts.html\"> <span class=\"ps-icon ps-icon-apps\"></span> Types & Layouts</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/themes.html\"><span class=\"ps-icon ps-icon-wand\"></span> Theme Library</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/animations.html\"><span class=\"ps-icon ps-icon-blaster\"></span> Show & Hide Animations</a>\n                    </li>\n                    <!--<li>-->\n                    <!--<a href=\"/noty/v2/queuing.html\"><span class=\"ps-icon ps-icon-retweet-1\"></span> Queue System</a>-->\n                    <!--</li>-->\n                    <li>\n                        <a href=\"/noty/v2/confirmations.html\"><span class=\"ps-icon ps-icon-headset\"></span> Confirm Dialogs</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/api.html\"><span class=\"ps-icon ps-icon-branch\"></span> API & Callbacks</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/releases.html\"><span class=\"ps-icon ps-icon-label\"></span> Release History</a>\n                    </li>\n                    <!--<li>-->\n                    <!--<a href=\"/noty/v2/extra.html\"> <span class=\"ps-icon ps-icon-sale-tag\"></span> Extra</a>-->\n                    <!--</li>-->\n                </ul>\n\n                <div class=\"mt20 supported-by\">\n                    <a target=\"_blank\" href=\"https://www.jetbrains.com?ref=notyjs\">\n                        <img src=\"img/projects/logo_JetBrains_4.svg\" width=\"80\" alt=\"\">\n                        <small class=\"text-muted\">&nbsp; Supported by JetBrains</small>\n                    </a>\n                </div>\n\n                <br>\n                <script async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"></script>\n                <!-- Nedim - 336x280 -->\n                <ins class=\"adsbygoogle\" style=\"display:inline-block;width:336px;height:280px\" data-ad-client=\"ca-pub-6920776915496505\" data-ad-slot=\"4982077735\"></ins>\n                <script>\n                    (adsbygoogle = window.adsbygoogle || []).push({});\n                </script>\n\n            </div>\n\n            <div class=\"col-md-9\">\n\n                <div class=\"right-buttons\">\n                    <div class=\"project-links mt30\">\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;repo=noty&amp;type=watch&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"125px\" height=\"35px\"></iframe>\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;repo=noty&amp;type=fork&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"115px\" height=\"35px\"></iframe>\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;type=follow&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"190px\" height=\"35px\"></iframe>\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;repo=noty&amp;type=download&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"162px\" height=\"35px\"></iframe>\n                        <div class=\"sharer-btn text-center\"></div>\n                    </div>\n\n                </div>\n\n                <div class=\"right-content mt10\">\n\n                    <div id=\"layouts\">\n\n                        <div class=\"row\">\n\n                            <div class=\"col-md-12\">\n                                <h1><span class=\"ps-icon ps-icon-row-setting\"></span> Types & Layouts</h1>\n\n                                <p class=\"excerpt\">\n                                    <strong>NOTY</strong> has <strong>11</strong> layouts;\n                                    <span class=\"imp\">top</span>, <span class=\"imp\">topLeft</span>, <span class=\"imp\">topCenter</span>, <span class=\"imp\">topRight</span>, <span class=\"imp\">center</span>, <span class=\"imp\">centerLeft</span>, <span class=\"imp\">centerRight</span>,\n                                    <span class=\"imp\">bottom</span>, <span class=\"imp\">bottomLeft</span>, <span class=\"imp\">bottomCenter</span>, <span class=\"imp\">bottomRight</span>\n                                    <br>and 5 types <span class=\"imp\">alert</span>, <span class=\"imp\">success</span>, <span class=\"imp\">warning</span>, <span class=\"imp\">error</span>, <span class=\"imp\">information</span>\n                                </p>\n\n                                <p class=\"mt30\">\n                                    Let's create a notification with layout\n                                    <select class=\"\" name=\"layout\" id=\"layout\">\n                    <option value=\"top\">top</option>\n                    <option value=\"topLeft\">topLeft</option>\n                    <option value=\"topCenter\">topCenter</option>\n                    <option value=\"topRight\" selected>topRight</option>\n                    <option value=\"center\">center</option>\n                    <option value=\"centerLeft\">centerLeft</option>\n                    <option value=\"centerRight\">centerRight</option>\n                    <option value=\"bottom\">bottom</option>\n                    <option value=\"bottomLeft\">bottomLeft</option>\n                    <option value=\"bottomCenter\">bottomCenter</option>\n                    <option value=\"bottomRight\">bottomRight</option>\n                    <optgroup label=\"Custom Container\">\n                      <option value=\"inline\">inline</option>\n                    </optgroup>\n                </select> and type\n                                    <select name=\"type\" id=\"type\">\n                    <option value=\"alert\">alert</option>\n                    <option value=\"success\">success</option>\n                    <option value=\"warning\" selected>warning</option>\n                    <option value=\"error\">error</option>\n                    <option value=\"information\">information</option>\n                </select>\n\n                                    <a href=\"#run\" class=\"btn button runner\" style=\"position: relative; top: -3px; margin-left: 10px; text-decoration: none\">CREATE</a>\n\n                                </p>\n\n                                <p class=\"mt30\">Custom container example for using inline layout;</p>\n                                <div class=\"custom-container\">\n\n                                </div>\n\n                                <p class=\"mt30\">Custom container usage example;</p>\n                                <pre class=\"prettyprint lang-javascript\"><span class=\"kwd\">var</span><span class=\"pln\"> n </span><span class=\"pun\">=</span><span class=\"pln\"> $</span><span class=\"pun\">(</span><span class=\"str\">'.custom-container'</span><span class=\"pun\">).</span><span class=\"pln\">noty</span><span class=\"pun\">({</span><span class=\"pln\">text</span><span class=\"pun\">:</span><span class=\"pln\"> </span><span class=\"str\">'NOTY - a jquery notification library!'</span><span class=\"pun\">});</span></pre>\n\n                            </div>\n\n\n\n                        </div>\n\n                    </div>\n\n                    <div class=\"next-section mt30 mb30\">\n                        Next; <a href=\"/noty/v2/themes.html\">Theme Library</a>\n                    </div>\n\n                </div>\n\n            </div>\n\n        </div>\n\n        <script type=\"text/javascript\" src=\"vendor/jquery-1.10.2.min.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/noty-2.4.1/js/noty/packaged/jquery.noty.packaged.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/google-code-prettify/prettify.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/share.min.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/showdown/showdown.min.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/documentation.js\"></script>\n\n        <script>\n            (function(i, s, o, g, r, a, m) {\n                i['GoogleAnalyticsObject'] = r;\n                i[r] = i[r] || function() {\n                    (i[r].q = i[r].q || []).push(arguments)\n                }, i[r].l = 1 * new Date();\n                a = s.createElement(o),\n                    m = s.getElementsByTagName(o)[0];\n                a.async = 1;\n                a.src = g;\n                m.parentNode.insertBefore(a, m)\n            })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n\n            ga('create', 'UA-46744044-1', 'auto');\n            ga('send', 'pageview');\n        </script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/v2/options.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\">\n    <meta name=\"description\" content=\"noty is a jquery plugin which is have too many options for display notification\">\n    <meta name=\"keywords\" content=\"jquery, notification, plugin, opensource, open, source\">\n    <meta name=\"author\" content=\"Nedim Arabacı (http://ned.im)\">\n\n    <title>noty - a jQuery Notification Plugin</title>\n\n    <link href='https://fonts.googleapis.com/css?family=Nunito' rel='stylesheet' type='text/css'>\n\n    <link rel=\"stylesheet\" href=\"vendor/bootstrap.min.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/animate.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/ps-icon-pack.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/custom.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/google-code-prettify/prettify.css\" />\n\n</head>\n\n<body>\n\n    <div class=\"wrapper\">\n\n        <div class=\"container-fluid\">\n\n            <div class=\"col-md-3\">\n\n                <img src=\"img/projects/noty-v2-logo.png\" alt=\"\" class=\"left-logo\">\n\n                <div class=\"project-info mt10 text-muted small\">\n                    <strong>NOTY</strong> is a <strong>jQuery plugin</strong> that makes it easy to create alert - success - error - warning - information - confirmation messages as an alternative the standard alert dialog. Each notification is added\n                    to a queue. (Optional)\n                    <br><br>\n                </div>\n\n                <ul class=\"top-links\">\n                    <li>\n                        <a class=\"active\" href=\"/noty/v2/\"><span class=\"ps-icon ps-icon-code\"></span> Installation</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/options.html\"><span class=\"ps-icon ps-icon-row-setting\"></span> Options & Defaults</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/layouts.html\"> <span class=\"ps-icon ps-icon-apps\"></span> Types & Layouts</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/themes.html\"><span class=\"ps-icon ps-icon-wand\"></span> Theme Library</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/animations.html\"><span class=\"ps-icon ps-icon-blaster\"></span> Show & Hide Animations</a>\n                    </li>\n                    <!--<li>-->\n                    <!--<a href=\"/noty/v2/queuing.html\"><span class=\"ps-icon ps-icon-retweet-1\"></span> Queue System</a>-->\n                    <!--</li>-->\n                    <li>\n                        <a href=\"/noty/v2/confirmations.html\"><span class=\"ps-icon ps-icon-headset\"></span> Confirm Dialogs</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/api.html\"><span class=\"ps-icon ps-icon-branch\"></span> API & Callbacks</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/releases.html\"><span class=\"ps-icon ps-icon-label\"></span> Release History</a>\n                    </li>\n                    <!--<li>-->\n                    <!--<a href=\"/noty/v2/extra.html\"> <span class=\"ps-icon ps-icon-sale-tag\"></span> Extra</a>-->\n                    <!--</li>-->\n                </ul>\n\n                <div class=\"mt20 supported-by\">\n                    <a target=\"_blank\" href=\"https://www.jetbrains.com?ref=notyjs\">\n                        <img src=\"img/projects/logo_JetBrains_4.svg\" width=\"80\" alt=\"\">\n                        <small class=\"text-muted\">&nbsp; Supported by JetBrains</small>\n                    </a>\n                </div>\n\n                <br>\n                <script async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"></script>\n                <!-- Nedim - 336x280 -->\n                <ins class=\"adsbygoogle\" style=\"display:inline-block;width:336px;height:280px\" data-ad-client=\"ca-pub-6920776915496505\" data-ad-slot=\"4982077735\"></ins>\n                <script>\n                    (adsbygoogle = window.adsbygoogle || []).push({});\n                </script>\n\n            </div>\n\n            <div class=\"col-md-9\">\n\n                <div class=\"right-buttons\">\n                    <div class=\"project-links mt30\">\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;repo=noty&amp;type=watch&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"125px\" height=\"35px\"></iframe>\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;repo=noty&amp;type=fork&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"115px\" height=\"35px\"></iframe>\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;type=follow&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"190px\" height=\"35px\"></iframe>\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;repo=noty&amp;type=download&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"162px\" height=\"35px\"></iframe>\n                        <div class=\"sharer-btn text-center\"></div>\n                    </div>\n\n                </div>\n\n                <div class=\"right-content mt10\">\n\n                    <div id=\"options\">\n\n                        <div class=\"row\">\n                            <div class=\"col-xs-12 col-md-12 col-lg-12\">\n\n                                <h1><span class=\"ps-icon ps-icon-row-setting\"></span> Options & Defaults</h1>\n\n                                <p>\n                                    Available options listed below.\n                                </p>\n\n                                <pre class=\"prettyprint lang-javascript\">\n$.noty.defaults = {\n  layout: 'top',\n  theme: 'defaultTheme', // or relax\n  type: 'alert', // success, error, warning, information, notification\n  text: '', // [string|html] can be HTML or STRING\n\n  dismissQueue: true, // [boolean] If you want to use queue feature set this true\n  force: false, // [boolean] adds notification to the beginning of queue when set to true\n  maxVisible: 5, // [integer] you can set max visible notification count for dismissQueue true option,\n\n  template: '&lt;div class=\"noty_message\"&gt;&lt;span class=\"noty_text\"&gt;&lt;/span&gt;&lt;div class=\"noty_close\"&gt;&lt;/div&gt;&lt;/div&gt;',\n\n  timeout: false, // [integer|boolean] delay for closing event in milliseconds. Set false for sticky notifications\n  progressBar: false, // [boolean] - displays a progress bar\n\n  animation: {\n    open: {height: 'toggle'}, // or Animate.css class names like: 'animated bounceInLeft'\n    close: {height: 'toggle'}, // or Animate.css class names like: 'animated bounceOutLeft'\n    easing: 'swing',\n    speed: 500 // opening &amp; closing animation speed\n  },\n  closeWith: ['click'], // ['click', 'button', 'hover', 'backdrop'] // backdrop click will close all notifications\n\n  modal: false, // [boolean] if true adds an overlay\n  killer: false, // [boolean] if true closes all notifications and shows itself\n\n  callback: {\n    onShow: function() {},\n    afterShow: function() {},\n    onClose: function() {},\n    afterClose: function() {},\n    onCloseClick: function() {},\n  },\n\n  buttons: false // [boolean|array] an array of buttons, for creating confirmation dialogs.\n};\n</pre>\n\n                                <blockquote>\n                                    Of course, you can override default values;<br> $.noty.defaults.theme = 'relax';\n                                </blockquote>\n\n                            </div>\n                        </div>\n                    </div>\n\n                    <div class=\"next-section mt30 mb30\">\n                        Next; <a href=\"/noty/v2/layouts.html\">Types & Layouts</a>\n                    </div>\n\n                </div>\n\n            </div>\n\n        </div>\n\n        <script type=\"text/javascript\" src=\"vendor/jquery-1.10.2.min.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/noty-2.4.1/js/noty/packaged/jquery.noty.packaged.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/google-code-prettify/prettify.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/share.min.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/showdown/showdown.min.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/documentation.js\"></script>\n\n        <script>\n            (function(i, s, o, g, r, a, m) {\n                i['GoogleAnalyticsObject'] = r;\n                i[r] = i[r] || function() {\n                    (i[r].q = i[r].q || []).push(arguments)\n                }, i[r].l = 1 * new Date();\n                a = s.createElement(o),\n                    m = s.getElementsByTagName(o)[0];\n                a.async = 1;\n                a.src = g;\n                m.parentNode.insertBefore(a, m)\n            })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n\n            ga('create', 'UA-46744044-1', 'auto');\n            ga('send', 'pageview');\n        </script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/v2/releases.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\">\n    <meta name=\"description\" content=\"noty is a jquery plugin which is have too many options for display notification\">\n    <meta name=\"keywords\" content=\"jquery, notification, plugin, opensource, open, source\">\n    <meta name=\"author\" content=\"Nedim Arabacı (http://ned.im)\">\n\n    <title>noty - a jQuery Notification Plugin</title>\n\n    <link href='https://fonts.googleapis.com/css?family=Nunito' rel='stylesheet' type='text/css'>\n\n    <link rel=\"stylesheet\" href=\"vendor/bootstrap.min.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/animate.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/ps-icon-pack.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/custom.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/google-code-prettify/prettify.css\" />\n\n</head>\n\n<body>\n\n    <div class=\"wrapper\">\n\n        <div class=\"container-fluid\">\n\n            <div class=\"col-md-3\">\n\n                <img src=\"img/projects/noty-v2-logo.png\" alt=\"\" class=\"left-logo\">\n\n                <div class=\"project-info mt10 text-muted small\">\n                    <strong>NOTY</strong> is a <strong>jQuery plugin</strong> that makes it easy to create alert - success - error - warning - information - confirmation messages as an alternative the standard alert dialog. Each notification is added\n                    to a queue. (Optional)\n                    <br><br>\n                </div>\n\n                <ul class=\"top-links\">\n                    <li>\n                        <a class=\"active\" href=\"/noty/v2/\"><span class=\"ps-icon ps-icon-code\"></span> Installation</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/options.html\"><span class=\"ps-icon ps-icon-row-setting\"></span> Options & Defaults</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/layouts.html\"> <span class=\"ps-icon ps-icon-apps\"></span> Types & Layouts</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/themes.html\"><span class=\"ps-icon ps-icon-wand\"></span> Theme Library</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/animations.html\"><span class=\"ps-icon ps-icon-blaster\"></span> Show & Hide Animations</a>\n                    </li>\n                    <!--<li>-->\n                    <!--<a href=\"/noty/v2/queuing.html\"><span class=\"ps-icon ps-icon-retweet-1\"></span> Queue System</a>-->\n                    <!--</li>-->\n                    <li>\n                        <a href=\"/noty/v2/confirmations.html\"><span class=\"ps-icon ps-icon-headset\"></span> Confirm Dialogs</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/api.html\"><span class=\"ps-icon ps-icon-branch\"></span> API & Callbacks</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/releases.html\"><span class=\"ps-icon ps-icon-label\"></span> Release History</a>\n                    </li>\n                    <!--<li>-->\n                    <!--<a href=\"/noty/v2/extra.html\"> <span class=\"ps-icon ps-icon-sale-tag\"></span> Extra</a>-->\n                    <!--</li>-->\n                </ul>\n\n                <div class=\"mt20 supported-by\">\n                    <a target=\"_blank\" href=\"https://www.jetbrains.com?ref=notyjs\">\n                        <img src=\"img/projects/logo_JetBrains_4.svg\" width=\"80\" alt=\"\">\n                        <small class=\"text-muted\">&nbsp; Supported by JetBrains</small>\n                    </a>\n                </div>\n\n                <br>\n                <script async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"></script>\n                <!-- Nedim - 336x280 -->\n                <ins class=\"adsbygoogle\" style=\"display:inline-block;width:336px;height:280px\" data-ad-client=\"ca-pub-6920776915496505\" data-ad-slot=\"4982077735\"></ins>\n                <script>\n                    (adsbygoogle = window.adsbygoogle || []).push({});\n                </script>\n\n            </div>\n\n            <div class=\"col-md-9\">\n\n                <div class=\"right-buttons\">\n                    <div class=\"project-links mt30\">\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;repo=noty&amp;type=watch&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"125px\" height=\"35px\"></iframe>\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;repo=noty&amp;type=fork&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"115px\" height=\"35px\"></iframe>\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;type=follow&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"190px\" height=\"35px\"></iframe>\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;repo=noty&amp;type=download&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"162px\" height=\"35px\"></iframe>\n                        <div class=\"sharer-btn text-center\"></div>\n                    </div>\n\n                </div>\n\n                <div class=\"right-content mt10\">\n\n                    <div id=\"releases\">\n\n                        <div class=\"row\">\n                            <div class=\"col-xs-12 col-md-12 col-lg-12\">\n\n                                <h1><span class=\"ps-icon ps-icon-label\"></span> Release History</h1>\n\n                                <div class=\"releases-wrapper\">\n\n                                </div>\n\n                            </div>\n                        </div>\n                    </div>\n\n                    <div class=\"next-section mt30 mb30\">\n                        <!--Next; <a href=\"/noty/v2/layouts.html\">Types & Layouts</a>-->\n                    </div>\n\n                </div>\n\n            </div>\n\n        </div>\n\n        <script type=\"text/javascript\" src=\"vendor/jquery-1.10.2.min.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/noty-2.4.1/js/noty/packaged/jquery.noty.packaged.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/google-code-prettify/prettify.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/share.min.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/showdown/showdown.min.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/documentation.js\"></script>\n\n        <script>\n            (function(i, s, o, g, r, a, m) {\n                i['GoogleAnalyticsObject'] = r;\n                i[r] = i[r] || function() {\n                    (i[r].q = i[r].q || []).push(arguments)\n                }, i[r].l = 1 * new Date();\n                a = s.createElement(o),\n                    m = s.getElementsByTagName(o)[0];\n                a.async = 1;\n                a.src = g;\n                m.parentNode.insertBefore(a, m)\n            })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n\n            ga('create', 'UA-46744044-1', 'auto');\n            ga('send', 'pageview');\n        </script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/v2/themes.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\">\n    <meta name=\"description\" content=\"noty is a jquery plugin which is have too many options for display notification\">\n    <meta name=\"keywords\" content=\"jquery, notification, plugin, opensource, open, source\">\n    <meta name=\"author\" content=\"Nedim Arabacı (http://ned.im)\">\n\n    <title>noty - a jQuery Notification Plugin</title>\n\n    <link href='https://fonts.googleapis.com/css?family=Nunito' rel='stylesheet' type='text/css'>\n\n    <link rel=\"stylesheet\" href=\"vendor/bootstrap.min.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/animate.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/ps-icon-pack.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/custom.css\" />\n    <link rel=\"stylesheet\" href=\"vendor/google-code-prettify/prettify.css\" />\n\n</head>\n\n<body>\n\n    <div class=\"wrapper\">\n\n        <div class=\"container-fluid\">\n\n            <div class=\"col-md-3\">\n\n                <img src=\"img/projects/noty-v2-logo.png\" alt=\"\" class=\"left-logo\">\n\n                <div class=\"project-info mt10 text-muted small\">\n                    <strong>NOTY</strong> is a <strong>jQuery plugin</strong> that makes it easy to create alert - success - error - warning - information - confirmation messages as an alternative the standard alert dialog. Each notification is added\n                    to a queue. (Optional)\n                    <br><br>\n                </div>\n\n                <ul class=\"top-links\">\n                    <li>\n                        <a class=\"active\" href=\"/noty/v2/\"><span class=\"ps-icon ps-icon-code\"></span> Installation</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/options.html\"><span class=\"ps-icon ps-icon-row-setting\"></span> Options & Defaults</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/layouts.html\"> <span class=\"ps-icon ps-icon-apps\"></span> Types & Layouts</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/themes.html\"><span class=\"ps-icon ps-icon-wand\"></span> Theme Library</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/animations.html\"><span class=\"ps-icon ps-icon-blaster\"></span> Show & Hide Animations</a>\n                    </li>\n                    <!--<li>-->\n                    <!--<a href=\"/noty/v2/queuing.html\"><span class=\"ps-icon ps-icon-retweet-1\"></span> Queue System</a>-->\n                    <!--</li>-->\n                    <li>\n                        <a href=\"/noty/v2/confirmations.html\"><span class=\"ps-icon ps-icon-headset\"></span> Confirm Dialogs</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/api.html\"><span class=\"ps-icon ps-icon-branch\"></span> API & Callbacks</a>\n                    </li>\n                    <li>\n                        <a href=\"/noty/v2/releases.html\"><span class=\"ps-icon ps-icon-label\"></span> Release History</a>\n                    </li>\n                    <!--<li>-->\n                    <!--<a href=\"/noty/v2/extra.html\"> <span class=\"ps-icon ps-icon-sale-tag\"></span> Extra</a>-->\n                    <!--</li>-->\n                </ul>\n\n                <div class=\"mt20 supported-by\">\n                    <a target=\"_blank\" href=\"https://www.jetbrains.com?ref=notyjs\">\n                        <img src=\"img/projects/logo_JetBrains_4.svg\" width=\"80\" alt=\"\">\n                        <small class=\"text-muted\">&nbsp; Supported by JetBrains</small>\n                    </a>\n                </div>\n\n                <br>\n                <script async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"></script>\n                <!-- Nedim - 336x280 -->\n                <ins class=\"adsbygoogle\" style=\"display:inline-block;width:336px;height:280px\" data-ad-client=\"ca-pub-6920776915496505\" data-ad-slot=\"4982077735\"></ins>\n                <script>\n                    (adsbygoogle = window.adsbygoogle || []).push({});\n                </script>\n\n            </div>\n\n            <div class=\"col-md-9\">\n\n                <div class=\"right-buttons\">\n                    <div class=\"project-links mt30\">\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;repo=noty&amp;type=watch&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"125px\" height=\"35px\"></iframe>\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;repo=noty&amp;type=fork&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"115px\" height=\"35px\"></iframe>\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;type=follow&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"190px\" height=\"35px\"></iframe>\n                        <iframe src=\"http://ned.im/github-buttons/ghbtn.html?user=needim&amp;repo=noty&amp;type=download&amp;count=true\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"0\" width=\"162px\" height=\"35px\"></iframe>\n                        <div class=\"sharer-btn text-center\"></div>\n                    </div>\n\n                </div>\n\n                <div class=\"right-content mt10\">\n\n                    <div id=\"themes\">\n\n                        <div class=\"row\">\n\n                            <div class=\"col-md-12\">\n                                <h1><span class=\"ps-icon ps-icon-wand\"></span> Theme Library</h1>\n\n                                <p class=\"excerpt\">\n                                    <strong>NOTY</strong> comes with <strong>4</strong> themes;\n                                    <span class=\"imp\">defaultTheme</span>, <span class=\"imp\">relax</span>, <span class=\"imp\">bootstrapTheme (v2)</span> and <span class=\"imp\">metroui</span>\n                                </p>\n\n                                <blockquote>If you want to <span class=\"imp\">submit your theme</span> you can create a pull request on Github.</blockquote>\n\n                            </div>\n\n                        </div>\n\n                        <div class=\"row\">\n                            <div class=\"col-md-6\">\n                                <div class=\"mt30 theme-container\" data-theme=\"defaultTheme\">\n                                    <h4>&bull; defaultTheme</h4>\n\n                                    <div class=\"preview-container\">\n\n                                    </div>\n                                </div>\n                            </div>\n\n                            <div class=\"col-md-6\">\n\n                                <div class=\"mt30 theme-container\" data-theme=\"relax\">\n                                    <h4>&bull; relax</h4>\n\n                                    <div class=\"preview-container\">\n\n                                    </div>\n                                </div>\n\n                            </div>\n\n                            <div class=\"col-md-6\">\n\n                                <div class=\"mt30 theme-container\" data-theme=\"bootstrapTheme\">\n                                    <h4>&bull; bootstrapTheme</h4>\n                                    <p>Author: <a target=\"_blank\" href=\"https://github.com/famaridon\">famaridon</a></p>\n\n                                    <div class=\"preview-container\">\n\n                                    </div>\n                                </div>\n\n                            </div>\n\n                            <div class=\"col-md-6\">\n\n                                <div class=\"mt30 theme-container\" data-theme=\"metroui\">\n                                    <h4>&bull; metroui</h4>\n\n                                    <div class=\"preview-container\">\n\n                                    </div>\n                                </div>\n\n                            </div>\n                        </div>\n\n                    </div>\n\n                    <div class=\"next-section mt30 mb30\">\n                        Next; <a href=\"/noty/v2/animations.html\">Show & Hide Animations</a>\n                    </div>\n\n                </div>\n\n            </div>\n\n        </div>\n\n        <script type=\"text/javascript\" src=\"vendor/jquery-1.10.2.min.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/noty-2.4.1/js/noty/packaged/jquery.noty.packaged.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/google-code-prettify/prettify.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/share.min.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/showdown/showdown.min.js\"></script>\n        <script type=\"text/javascript\" src=\"vendor/documentation.js\"></script>\n\n        <script>\n            (function(i, s, o, g, r, a, m) {\n                i['GoogleAnalyticsObject'] = r;\n                i[r] = i[r] || function() {\n                    (i[r].q = i[r].q || []).push(arguments)\n                }, i[r].l = 1 * new Date();\n                a = s.createElement(o),\n                    m = s.getElementsByTagName(o)[0];\n                a.async = 1;\n                a.src = g;\n                m.parentNode.insertBefore(a, m)\n            })(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\n\n            ga('create', 'UA-46744044-1', 'auto');\n            ga('send', 'pageview');\n        </script>\n\n</body>\n\n</html>"
  },
  {
    "path": "docs/v2/vendor/animate.css",
    "content": "/*\r\nAnimate.css - http://daneden.me/animate\r\nLICENSED UNDER THE  MIT LICENSE (MIT)\r\n\r\nCopyright (c) 2012 Dan Eden\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n*/\r\n@charset \"UTF-8\";.animated{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animated.hinge{-webkit-animation-duration:2s;animation-duration:2s}@-webkit-keyframes bounce{0%,20%,50%,80%,100%{-webkit-transform:translateY(0);transform:translateY(0)}40%{-webkit-transform:translateY(-30px);transform:translateY(-30px)}60%{-webkit-transform:translateY(-15px);transform:translateY(-15px)}}@keyframes bounce{0%,20%,50%,80%,100%{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}40%{-webkit-transform:translateY(-30px);-ms-transform:translateY(-30px);transform:translateY(-30px)}60%{-webkit-transform:translateY(-15px);-ms-transform:translateY(-15px);transform:translateY(-15px)}}.bounce{-webkit-animation-name:bounce;animation-name:bounce}@-webkit-keyframes flash{0%,50%,100%{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,50%,100%{opacity:1}25%,75%{opacity:0}}.flash{-webkit-animation-name:flash;animation-name:flash}@-webkit-keyframes pulse{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.1);transform:scale(1.1)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes pulse{0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)}100%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.pulse{-webkit-animation-name:pulse;animation-name:pulse}@-webkit-keyframes shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.shake{-webkit-animation-name:shake;animation-name:shake}@-webkit-keyframes swing{20%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}40%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}60%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}80%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}100%{-webkit-transform:rotate(0);transform:rotate(0)}}@keyframes swing{20%{-webkit-transform:rotate(15deg);-ms-transform:rotate(15deg);transform:rotate(15deg)}40%{-webkit-transform:rotate(-10deg);-ms-transform:rotate(-10deg);transform:rotate(-10deg)}60%{-webkit-transform:rotate(5deg);-ms-transform:rotate(5deg);transform:rotate(5deg)}80%{-webkit-transform:rotate(-5deg);-ms-transform:rotate(-5deg);transform:rotate(-5deg)}100%{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}}.swing{-webkit-transform-origin:top center;-ms-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;animation-name:swing}@-webkit-keyframes tada{0%{-webkit-transform:scale(1);transform:scale(1)}10%,20%{-webkit-transform:scale(.9)rotate(-3deg);transform:scale(.9)rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.1)rotate(3deg);transform:scale(1.1)rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.1)rotate(-3deg);transform:scale(1.1)rotate(-3deg)}100%{-webkit-transform:scale(1)rotate(0);transform:scale(1)rotate(0)}}@keyframes tada{0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}10%,20%{-webkit-transform:scale(.9)rotate(-3deg);-ms-transform:scale(.9)rotate(-3deg);transform:scale(.9)rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.1)rotate(3deg);-ms-transform:scale(1.1)rotate(3deg);transform:scale(1.1)rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.1)rotate(-3deg);-ms-transform:scale(1.1)rotate(-3deg);transform:scale(1.1)rotate(-3deg)}100%{-webkit-transform:scale(1)rotate(0);-ms-transform:scale(1)rotate(0);transform:scale(1)rotate(0)}}.tada{-webkit-animation-name:tada;animation-name:tada}@-webkit-keyframes wobble{0%{-webkit-transform:translateX(0%);transform:translateX(0%)}15%{-webkit-transform:translateX(-25%)rotate(-5deg);transform:translateX(-25%)rotate(-5deg)}30%{-webkit-transform:translateX(20%)rotate(3deg);transform:translateX(20%)rotate(3deg)}45%{-webkit-transform:translateX(-15%)rotate(-3deg);transform:translateX(-15%)rotate(-3deg)}60%{-webkit-transform:translateX(10%)rotate(2deg);transform:translateX(10%)rotate(2deg)}75%{-webkit-transform:translateX(-5%)rotate(-1deg);transform:translateX(-5%)rotate(-1deg)}100%{-webkit-transform:translateX(0%);transform:translateX(0%)}}@keyframes wobble{0%{-webkit-transform:translateX(0%);-ms-transform:translateX(0%);transform:translateX(0%)}15%{-webkit-transform:translateX(-25%)rotate(-5deg);-ms-transform:translateX(-25%)rotate(-5deg);transform:translateX(-25%)rotate(-5deg)}30%{-webkit-transform:translateX(20%)rotate(3deg);-ms-transform:translateX(20%)rotate(3deg);transform:translateX(20%)rotate(3deg)}45%{-webkit-transform:translateX(-15%)rotate(-3deg);-ms-transform:translateX(-15%)rotate(-3deg);transform:translateX(-15%)rotate(-3deg)}60%{-webkit-transform:translateX(10%)rotate(2deg);-ms-transform:translateX(10%)rotate(2deg);transform:translateX(10%)rotate(2deg)}75%{-webkit-transform:translateX(-5%)rotate(-1deg);-ms-transform:translateX(-5%)rotate(-1deg);transform:translateX(-5%)rotate(-1deg)}100%{-webkit-transform:translateX(0%);-ms-transform:translateX(0%);transform:translateX(0%)}}.wobble{-webkit-animation-name:wobble;animation-name:wobble}@-webkit-keyframes bounceIn{0%{opacity:0;-webkit-transform:scale(.3);transform:scale(.3)}50%{opacity:1;-webkit-transform:scale(1.05);transform:scale(1.05)}70%{-webkit-transform:scale(.9);transform:scale(.9)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes bounceIn{0%{opacity:0;-webkit-transform:scale(.3);-ms-transform:scale(.3);transform:scale(.3)}50%{opacity:1;-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}70%{-webkit-transform:scale(.9);-ms-transform:scale(.9);transform:scale(.9)}100%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.bounceIn{-webkit-animation-name:bounceIn;animation-name:bounceIn}@-webkit-keyframes bounceInDown{0%{opacity:0;-webkit-transform:translateY(-2000px);transform:translateY(-2000px)}60%{opacity:1;-webkit-transform:translateY(30px);transform:translateY(30px)}80%{-webkit-transform:translateY(-10px);transform:translateY(-10px)}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes bounceInDown{0%{opacity:0;-webkit-transform:translateY(-2000px);-ms-transform:translateY(-2000px);transform:translateY(-2000px)}60%{opacity:1;-webkit-transform:translateY(30px);-ms-transform:translateY(30px);transform:translateY(30px)}80%{-webkit-transform:translateY(-10px);-ms-transform:translateY(-10px);transform:translateY(-10px)}100%{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.bounceInDown{-webkit-animation-name:bounceInDown;animation-name:bounceInDown}@-webkit-keyframes bounceInLeft{0%{opacity:0;-webkit-transform:translateX(-2000px);transform:translateX(-2000px)}60%{opacity:1;-webkit-transform:translateX(30px);transform:translateX(30px)}80%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes bounceInLeft{0%{opacity:0;-webkit-transform:translateX(-2000px);-ms-transform:translateX(-2000px);transform:translateX(-2000px)}60%{opacity:1;-webkit-transform:translateX(30px);-ms-transform:translateX(30px);transform:translateX(30px)}80%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}.bounceInLeft{-webkit-animation-name:bounceInLeft;animation-name:bounceInLeft}@-webkit-keyframes bounceInRight{0%{opacity:0;-webkit-transform:translateX(2000px);transform:translateX(2000px)}60%{opacity:1;-webkit-transform:translateX(-30px);transform:translateX(-30px)}80%{-webkit-transform:translateX(10px);transform:translateX(10px)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes bounceInRight{0%{opacity:0;-webkit-transform:translateX(2000px);-ms-transform:translateX(2000px);transform:translateX(2000px)}60%{opacity:1;-webkit-transform:translateX(-30px);-ms-transform:translateX(-30px);transform:translateX(-30px)}80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}.bounceInRight{-webkit-animation-name:bounceInRight;animation-name:bounceInRight}@-webkit-keyframes bounceInUp{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}60%{opacity:1;-webkit-transform:translateY(-30px);transform:translateY(-30px)}80%{-webkit-transform:translateY(10px);transform:translateY(10px)}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes bounceInUp{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}60%{opacity:1;-webkit-transform:translateY(-30px);-ms-transform:translateY(-30px);transform:translateY(-30px)}80%{-webkit-transform:translateY(10px);-ms-transform:translateY(10px);transform:translateY(10px)}100%{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.bounceInUp{-webkit-animation-name:bounceInUp;animation-name:bounceInUp}@-webkit-keyframes bounceOut{0%{-webkit-transform:scale(1);transform:scale(1)}25%{-webkit-transform:scale(.95);transform:scale(.95)}50%{opacity:1;-webkit-transform:scale(1.1);transform:scale(1.1)}100%{opacity:0;-webkit-transform:scale(.3);transform:scale(.3)}}@keyframes bounceOut{0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}25%{-webkit-transform:scale(.95);-ms-transform:scale(.95);transform:scale(.95)}50%{opacity:1;-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)}100%{opacity:0;-webkit-transform:scale(.3);-ms-transform:scale(.3);transform:scale(.3)}}.bounceOut{-webkit-animation-name:bounceOut;animation-name:bounceOut}@-webkit-keyframes bounceOutDown{0%{-webkit-transform:translateY(0);transform:translateY(0)}20%{opacity:1;-webkit-transform:translateY(-20px);transform:translateY(-20px)}100%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}}@keyframes bounceOutDown{0%{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}20%{opacity:1;-webkit-transform:translateY(-20px);-ms-transform:translateY(-20px);transform:translateY(-20px)}100%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}}.bounceOutDown{-webkit-animation-name:bounceOutDown;animation-name:bounceOutDown}@-webkit-keyframes bounceOutLeft{0%{-webkit-transform:translateX(0);transform:translateX(0)}20%{opacity:1;-webkit-transform:translateX(20px);transform:translateX(20px)}100%{opacity:0;-webkit-transform:translateX(-2000px);transform:translateX(-2000px)}}@keyframes bounceOutLeft{0%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}20%{opacity:1;-webkit-transform:translateX(20px);-ms-transform:translateX(20px);transform:translateX(20px)}100%{opacity:0;-webkit-transform:translateX(-2000px);-ms-transform:translateX(-2000px);transform:translateX(-2000px)}}.bounceOutLeft{-webkit-animation-name:bounceOutLeft;animation-name:bounceOutLeft}@-webkit-keyframes bounceOutRight{0%{-webkit-transform:translateX(0);transform:translateX(0)}20%{opacity:1;-webkit-transform:translateX(-20px);transform:translateX(-20px)}100%{opacity:0;-webkit-transform:translateX(2000px);transform:translateX(2000px)}}@keyframes bounceOutRight{0%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}20%{opacity:1;-webkit-transform:translateX(-20px);-ms-transform:translateX(-20px);transform:translateX(-20px)}100%{opacity:0;-webkit-transform:translateX(2000px);-ms-transform:translateX(2000px);transform:translateX(2000px)}}.bounceOutRight{-webkit-animation-name:bounceOutRight;animation-name:bounceOutRight}@-webkit-keyframes bounceOutUp{0%{-webkit-transform:translateY(0);transform:translateY(0)}20%{opacity:1;-webkit-transform:translateY(20px);transform:translateY(20px)}100%{opacity:0;-webkit-transform:translateY(-2000px);transform:translateY(-2000px)}}@keyframes bounceOutUp{0%{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}20%{opacity:1;-webkit-transform:translateY(20px);-ms-transform:translateY(20px);transform:translateY(20px)}100%{opacity:0;-webkit-transform:translateY(-2000px);-ms-transform:translateY(-2000px);transform:translateY(-2000px)}}.bounceOutUp{-webkit-animation-name:bounceOutUp;animation-name:bounceOutUp}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-20px);transform:translateY(-20px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-20px);-ms-transform:translateY(-20px);transform:translateY(-20px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}@-webkit-keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translateY(-2000px);transform:translateY(-2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translateY(-2000px);-ms-transform:translateY(-2000px);transform:translateY(-2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.fadeInDownBig{-webkit-animation-name:fadeInDownBig;animation-name:fadeInDownBig}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px);transform:translateX(-20px)}100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px);-ms-transform:translateX(-20px);transform:translateX(-20px)}100%{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translateX(-2000px);transform:translateX(-2000px)}100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translateX(-2000px);-ms-transform:translateX(-2000px);transform:translateX(-2000px)}100%{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}.fadeInLeftBig{-webkit-animation-name:fadeInLeftBig;animation-name:fadeInLeftBig}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(20px);transform:translateX(20px)}100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(20px);-ms-transform:translateX(20px);transform:translateX(20px)}100%{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translateX(2000px);transform:translateX(2000px)}100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translateX(2000px);-ms-transform:translateX(2000px);transform:translateX(2000px)}100%{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}.fadeInRightBig{-webkit-animation-name:fadeInRightBig;animation-name:fadeInRightBig}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(20px);transform:translateY(20px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(20px);-ms-transform:translateY(20px);transform:translateY(20px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.fadeInUpBig{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(20px);transform:translateY(20px)}}@keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(20px);-ms-transform:translateY(20px);transform:translateY(20px)}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}@-webkit-keyframes fadeOutDownBig{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}}@keyframes fadeOutDownBig{0%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}}.fadeOutDownBig{-webkit-animation-name:fadeOutDownBig;animation-name:fadeOutDownBig}@-webkit-keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(-20px);transform:translateX(-20px)}}@keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(-20px);-ms-transform:translateX(-20px);transform:translateX(-20px)}}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}@-webkit-keyframes fadeOutLeftBig{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(-2000px);transform:translateX(-2000px)}}@keyframes fadeOutLeftBig{0%{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(-2000px);-ms-transform:translateX(-2000px);transform:translateX(-2000px)}}.fadeOutLeftBig{-webkit-animation-name:fadeOutLeftBig;animation-name:fadeOutLeftBig}@-webkit-keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(20px);transform:translateX(20px)}}@keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(20px);-ms-transform:translateX(20px);transform:translateX(20px)}}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeOutRightBig{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(2000px);transform:translateX(2000px)}}@keyframes fadeOutRightBig{0%{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(2000px);-ms-transform:translateX(2000px);transform:translateX(2000px)}}.fadeOutRightBig{-webkit-animation-name:fadeOutRightBig;animation-name:fadeOutRightBig}@-webkit-keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-20px);transform:translateY(-20px)}}@keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-20px);-ms-transform:translateY(-20px);transform:translateY(-20px)}}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}@-webkit-keyframes fadeOutUpBig{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-2000px);transform:translateY(-2000px)}}@keyframes fadeOutUpBig{0%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-2000px);-ms-transform:translateY(-2000px);transform:translateY(-2000px)}}.fadeOutUpBig{-webkit-animation-name:fadeOutUpBig;animation-name:fadeOutUpBig}@-webkit-keyframes flip{0%{-webkit-transform:perspective(400px)translateZ(0)rotateY(0)scale(1);transform:perspective(400px)translateZ(0)rotateY(0)scale(1)}0%,40%{-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px)translateZ(150px)rotateY(170deg)scale(1);transform:perspective(400px)translateZ(150px)rotateY(170deg)scale(1)}50%{-webkit-transform:perspective(400px)translateZ(150px)rotateY(190deg)scale(1);transform:perspective(400px)translateZ(150px)rotateY(190deg)scale(1);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px)translateZ(0)rotateY(360deg)scale(.95);transform:perspective(400px)translateZ(0)rotateY(360deg)scale(.95)}80%,100%{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px)translateZ(0)rotateY(360deg)scale(1);transform:perspective(400px)translateZ(0)rotateY(360deg)scale(1)}}@keyframes flip{0%{-webkit-transform:perspective(400px)translateZ(0)rotateY(0)scale(1);-ms-transform:perspective(400px)translateZ(0)rotateY(0)scale(1);transform:perspective(400px)translateZ(0)rotateY(0)scale(1)}0%,40%{-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px)translateZ(150px)rotateY(170deg)scale(1);-ms-transform:perspective(400px)translateZ(150px)rotateY(170deg)scale(1);transform:perspective(400px)translateZ(150px)rotateY(170deg)scale(1)}50%{-webkit-transform:perspective(400px)translateZ(150px)rotateY(190deg)scale(1);-ms-transform:perspective(400px)translateZ(150px)rotateY(190deg)scale(1);transform:perspective(400px)translateZ(150px)rotateY(190deg)scale(1);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px)translateZ(0)rotateY(360deg)scale(.95);-ms-transform:perspective(400px)translateZ(0)rotateY(360deg)scale(.95);transform:perspective(400px)translateZ(0)rotateY(360deg)scale(.95)}80%,100%{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px)translateZ(0)rotateY(360deg)scale(1);-ms-transform:perspective(400px)translateZ(0)rotateY(360deg)scale(1);transform:perspective(400px)translateZ(0)rotateY(360deg)scale(1)}}.animated.flip{-webkit-backface-visibility:visible;-ms-backface-visibility:visible;backface-visibility:visible;-webkit-animation-name:flip;animation-name:flip}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px)rotateX(90deg);transform:perspective(400px)rotateX(90deg);opacity:0}40%{-webkit-transform:perspective(400px)rotateX(-10deg);transform:perspective(400px)rotateX(-10deg)}70%{-webkit-transform:perspective(400px)rotateX(10deg);transform:perspective(400px)rotateX(10deg)}100%{-webkit-transform:perspective(400px)rotateX(0);transform:perspective(400px)rotateX(0);opacity:1}}@keyframes flipInX{0%{-webkit-transform:perspective(400px)rotateX(90deg);-ms-transform:perspective(400px)rotateX(90deg);transform:perspective(400px)rotateX(90deg);opacity:0}40%{-webkit-transform:perspective(400px)rotateX(-10deg);-ms-transform:perspective(400px)rotateX(-10deg);transform:perspective(400px)rotateX(-10deg)}70%{-webkit-transform:perspective(400px)rotateX(10deg);-ms-transform:perspective(400px)rotateX(10deg);transform:perspective(400px)rotateX(10deg)}100%{-webkit-transform:perspective(400px)rotateX(0);-ms-transform:perspective(400px)rotateX(0);transform:perspective(400px)rotateX(0);opacity:1}}.flipInX{-webkit-backface-visibility:visible!important;-ms-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInX;animation-name:flipInX}@-webkit-keyframes flipInY{0%{-webkit-transform:perspective(400px)rotateY(90deg);transform:perspective(400px)rotateY(90deg);opacity:0}40%{-webkit-transform:perspective(400px)rotateY(-10deg);transform:perspective(400px)rotateY(-10deg)}70%{-webkit-transform:perspective(400px)rotateY(10deg);transform:perspective(400px)rotateY(10deg)}100%{-webkit-transform:perspective(400px)rotateY(0);transform:perspective(400px)rotateY(0);opacity:1}}@keyframes flipInY{0%{-webkit-transform:perspective(400px)rotateY(90deg);-ms-transform:perspective(400px)rotateY(90deg);transform:perspective(400px)rotateY(90deg);opacity:0}40%{-webkit-transform:perspective(400px)rotateY(-10deg);-ms-transform:perspective(400px)rotateY(-10deg);transform:perspective(400px)rotateY(-10deg)}70%{-webkit-transform:perspective(400px)rotateY(10deg);-ms-transform:perspective(400px)rotateY(10deg);transform:perspective(400px)rotateY(10deg)}100%{-webkit-transform:perspective(400px)rotateY(0);-ms-transform:perspective(400px)rotateY(0);transform:perspective(400px)rotateY(0);opacity:1}}.flipInY{-webkit-backface-visibility:visible!important;-ms-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInY;animation-name:flipInY}@-webkit-keyframes flipOutX{0%{-webkit-transform:perspective(400px)rotateX(0);transform:perspective(400px)rotateX(0);opacity:1}100%{-webkit-transform:perspective(400px)rotateX(90deg);transform:perspective(400px)rotateX(90deg);opacity:0}}@keyframes flipOutX{0%{-webkit-transform:perspective(400px)rotateX(0);-ms-transform:perspective(400px)rotateX(0);transform:perspective(400px)rotateX(0);opacity:1}100%{-webkit-transform:perspective(400px)rotateX(90deg);-ms-transform:perspective(400px)rotateX(90deg);transform:perspective(400px)rotateX(90deg);opacity:0}}.flipOutX{-webkit-animation-name:flipOutX;animation-name:flipOutX;-webkit-backface-visibility:visible!important;-ms-backface-visibility:visible!important;backface-visibility:visible!important}@-webkit-keyframes flipOutY{0%{-webkit-transform:perspective(400px)rotateY(0);transform:perspective(400px)rotateY(0);opacity:1}100%{-webkit-transform:perspective(400px)rotateY(90deg);transform:perspective(400px)rotateY(90deg);opacity:0}}@keyframes flipOutY{0%{-webkit-transform:perspective(400px)rotateY(0);-ms-transform:perspective(400px)rotateY(0);transform:perspective(400px)rotateY(0);opacity:1}100%{-webkit-transform:perspective(400px)rotateY(90deg);-ms-transform:perspective(400px)rotateY(90deg);transform:perspective(400px)rotateY(90deg);opacity:0}}.flipOutY{-webkit-backface-visibility:visible!important;-ms-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipOutY;animation-name:flipOutY}@-webkit-keyframes lightSpeedIn{0%{-webkit-transform:translateX(100%)skewX(-30deg);transform:translateX(100%)skewX(-30deg);opacity:0}60%{-webkit-transform:translateX(-20%)skewX(30deg);transform:translateX(-20%)skewX(30deg);opacity:1}80%{-webkit-transform:translateX(0%)skewX(-15deg);transform:translateX(0%)skewX(-15deg);opacity:1}100%{-webkit-transform:translateX(0%)skewX(0);transform:translateX(0%)skewX(0);opacity:1}}@keyframes lightSpeedIn{0%{-webkit-transform:translateX(100%)skewX(-30deg);-ms-transform:translateX(100%)skewX(-30deg);transform:translateX(100%)skewX(-30deg);opacity:0}60%{-webkit-transform:translateX(-20%)skewX(30deg);-ms-transform:translateX(-20%)skewX(30deg);transform:translateX(-20%)skewX(30deg);opacity:1}80%{-webkit-transform:translateX(0%)skewX(-15deg);-ms-transform:translateX(0%)skewX(-15deg);transform:translateX(0%)skewX(-15deg);opacity:1}100%{-webkit-transform:translateX(0%)skewX(0);-ms-transform:translateX(0%)skewX(0);transform:translateX(0%)skewX(0);opacity:1}}.lightSpeedIn{-webkit-animation-name:lightSpeedIn;animation-name:lightSpeedIn;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-webkit-keyframes lightSpeedOut{0%{-webkit-transform:translateX(0%)skewX(0);transform:translateX(0%)skewX(0);opacity:1}100%{-webkit-transform:translateX(100%)skewX(-30deg);transform:translateX(100%)skewX(-30deg);opacity:0}}@keyframes lightSpeedOut{0%{-webkit-transform:translateX(0%)skewX(0);-ms-transform:translateX(0%)skewX(0);transform:translateX(0%)skewX(0);opacity:1}100%{-webkit-transform:translateX(100%)skewX(-30deg);-ms-transform:translateX(100%)skewX(-30deg);transform:translateX(100%)skewX(-30deg);opacity:0}}.lightSpeedOut{-webkit-animation-name:lightSpeedOut;animation-name:lightSpeedOut;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}@-webkit-keyframes rotateIn{0%{-webkit-transform:rotate(-200deg);transform:rotate(-200deg);opacity:0}0%,100%{-webkit-transform-origin:center center;transform-origin:center center}100%{-webkit-transform:rotate(0);transform:rotate(0);opacity:1}}@keyframes rotateIn{0%{-webkit-transform:rotate(-200deg);-ms-transform:rotate(-200deg);transform:rotate(-200deg);opacity:0}0%,100%{-webkit-transform-origin:center center;-ms-transform-origin:center center;transform-origin:center center}100%{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);opacity:1}}.rotateIn{-webkit-animation-name:rotateIn;animation-name:rotateIn}@-webkit-keyframes rotateInDownLeft{0%{-webkit-transform:rotate(-90deg);transform:rotate(-90deg);opacity:0}0%,100%{-webkit-transform-origin:left bottom;transform-origin:left bottom}100%{-webkit-transform:rotate(0);transform:rotate(0);opacity:1}}@keyframes rotateInDownLeft{0%{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg);opacity:0}0%,100%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom}100%{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);opacity:1}}.rotateInDownLeft{-webkit-animation-name:rotateInDownLeft;animation-name:rotateInDownLeft}@-webkit-keyframes rotateInDownRight{0%{-webkit-transform:rotate(90deg);transform:rotate(90deg);opacity:0}0%,100%{-webkit-transform-origin:right bottom;transform-origin:right bottom}100%{-webkit-transform:rotate(0);transform:rotate(0);opacity:1}}@keyframes rotateInDownRight{0%{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);opacity:0}0%,100%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom}100%{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);opacity:1}}.rotateInDownRight{-webkit-animation-name:rotateInDownRight;animation-name:rotateInDownRight}@-webkit-keyframes rotateInUpLeft{0%{-webkit-transform:rotate(90deg);transform:rotate(90deg);opacity:0}0%,100%{-webkit-transform-origin:left bottom;transform-origin:left bottom}100%{-webkit-transform:rotate(0);transform:rotate(0);opacity:1}}@keyframes rotateInUpLeft{0%{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);opacity:0}0%,100%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom}100%{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);opacity:1}}.rotateInUpLeft{-webkit-animation-name:rotateInUpLeft;animation-name:rotateInUpLeft}@-webkit-keyframes rotateInUpRight{0%{-webkit-transform:rotate(-90deg);transform:rotate(-90deg);opacity:0}0%,100%{-webkit-transform-origin:right bottom;transform-origin:right bottom}100%{-webkit-transform:rotate(0);transform:rotate(0);opacity:1}}@keyframes rotateInUpRight{0%{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg);opacity:0}0%,100%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom}100%{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);opacity:1}}.rotateInUpRight{-webkit-animation-name:rotateInUpRight;animation-name:rotateInUpRight}@-webkit-keyframes rotateOut{0%{-webkit-transform:rotate(0);transform:rotate(0);opacity:1}0%,100%{-webkit-transform-origin:center center;transform-origin:center center}100%{-webkit-transform:rotate(200deg);transform:rotate(200deg);opacity:0}}@keyframes rotateOut{0%{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);opacity:1}0%,100%{-webkit-transform-origin:center center;-ms-transform-origin:center center;transform-origin:center center}100%{-webkit-transform:rotate(200deg);-ms-transform:rotate(200deg);transform:rotate(200deg);opacity:0}}.rotateOut{-webkit-animation-name:rotateOut;animation-name:rotateOut}@-webkit-keyframes rotateOutDownLeft{0%{-webkit-transform:rotate(0);transform:rotate(0);opacity:1}0%,100%{-webkit-transform-origin:left bottom;transform-origin:left bottom}100%{-webkit-transform:rotate(90deg);transform:rotate(90deg);opacity:0}}@keyframes rotateOutDownLeft{0%{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);opacity:1}0%,100%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom}100%{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);opacity:0}}.rotateOutDownLeft{-webkit-animation-name:rotateOutDownLeft;animation-name:rotateOutDownLeft}@-webkit-keyframes rotateOutDownRight{0%{-webkit-transform:rotate(0);transform:rotate(0);opacity:1}0%,100%{-webkit-transform-origin:right bottom;transform-origin:right bottom}100%{-webkit-transform:rotate(-90deg);transform:rotate(-90deg);opacity:0}}@keyframes rotateOutDownRight{0%{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);opacity:1}0%,100%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom}100%{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg);opacity:0}}.rotateOutDownRight{-webkit-animation-name:rotateOutDownRight;animation-name:rotateOutDownRight}@-webkit-keyframes rotateOutUpLeft{0%{-webkit-transform:rotate(0);transform:rotate(0);opacity:1}0%,100%{-webkit-transform-origin:left bottom;transform-origin:left bottom}100%{-webkit-transform:rotate(-90deg);transform:rotate(-90deg);opacity:0}}@keyframes rotateOutUpLeft{0%{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);opacity:1}0%,100%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom}100%{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg);opacity:0}}.rotateOutUpLeft{-webkit-animation-name:rotateOutUpLeft;animation-name:rotateOutUpLeft}@-webkit-keyframes rotateOutUpRight{0%{-webkit-transform:rotate(0);transform:rotate(0);opacity:1}0%,100%{-webkit-transform-origin:right bottom;transform-origin:right bottom}100%{-webkit-transform:rotate(90deg);transform:rotate(90deg);opacity:0}}@keyframes rotateOutUpRight{0%{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);opacity:1}0%,100%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom}100%{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);opacity:0}}.rotateOutUpRight{-webkit-animation-name:rotateOutUpRight;animation-name:rotateOutUpRight}@-webkit-keyframes slideInDown{0%{opacity:0;-webkit-transform:translateY(-2000px);transform:translateY(-2000px)}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slideInDown{0%{opacity:0;-webkit-transform:translateY(-2000px);-ms-transform:translateY(-2000px);transform:translateY(-2000px)}100%{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.slideInDown{-webkit-animation-name:slideInDown;animation-name:slideInDown}@-webkit-keyframes slideInLeft{0%{opacity:0;-webkit-transform:translateX(-2000px);transform:translateX(-2000px)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInLeft{0%{opacity:0;-webkit-transform:translateX(-2000px);-ms-transform:translateX(-2000px);transform:translateX(-2000px)}100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}.slideInLeft{-webkit-animation-name:slideInLeft;animation-name:slideInLeft}@-webkit-keyframes slideInRight{0%{opacity:0;-webkit-transform:translateX(2000px);transform:translateX(2000px)}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInRight{0%{opacity:0;-webkit-transform:translateX(2000px);-ms-transform:translateX(2000px);transform:translateX(2000px)}100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}.slideInRight{-webkit-animation-name:slideInRight;animation-name:slideInRight}@-webkit-keyframes slideOutLeft{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(-2000px);transform:translateX(-2000px)}}@keyframes slideOutLeft{0%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(-2000px);-ms-transform:translateX(-2000px);transform:translateX(-2000px)}}.slideOutLeft{-webkit-animation-name:slideOutLeft;animation-name:slideOutLeft}@-webkit-keyframes slideOutRight{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(2000px);transform:translateX(2000px)}}@keyframes slideOutRight{0%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(2000px);-ms-transform:translateX(2000px);transform:translateX(2000px)}}.slideOutRight{-webkit-animation-name:slideOutRight;animation-name:slideOutRight}@-webkit-keyframes slideOutUp{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-2000px);transform:translateY(-2000px)}}@keyframes slideOutUp{0%{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-2000px);-ms-transform:translateY(-2000px);transform:translateY(-2000px)}}.slideOutUp{-webkit-animation-name:slideOutUp;animation-name:slideOutUp}@-webkit-keyframes hinge{0%{-webkit-transform:rotate(0);transform:rotate(0)}0%,20%,60%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate(80deg);transform:rotate(80deg)}40%{-webkit-transform:rotate(60deg);transform:rotate(60deg)}40%,80%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}80%{-webkit-transform:rotate(60deg)translateY(0);transform:rotate(60deg)translateY(0);opacity:1}100%{-webkit-transform:translateY(700px);transform:translateY(700px);opacity:0}}@keyframes hinge{0%{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}0%,20%,60%{-webkit-transform-origin:top left;-ms-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate(80deg);-ms-transform:rotate(80deg);transform:rotate(80deg)}40%{-webkit-transform:rotate(60deg);-ms-transform:rotate(60deg);transform:rotate(60deg)}40%,80%{-webkit-transform-origin:top left;-ms-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}80%{-webkit-transform:rotate(60deg)translateY(0);-ms-transform:rotate(60deg)translateY(0);transform:rotate(60deg)translateY(0);opacity:1}100%{-webkit-transform:translateY(700px);-ms-transform:translateY(700px);transform:translateY(700px);opacity:0}}.hinge{-webkit-animation-name:hinge;animation-name:hinge}@-webkit-keyframes rollIn{0%{opacity:0;-webkit-transform:translateX(-100%)rotate(-120deg);transform:translateX(-100%)rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0)rotate(0);transform:translateX(0)rotate(0)}}@keyframes rollIn{0%{opacity:0;-webkit-transform:translateX(-100%)rotate(-120deg);-ms-transform:translateX(-100%)rotate(-120deg);transform:translateX(-100%)rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0)rotate(0);-ms-transform:translateX(0)rotate(0);transform:translateX(0)rotate(0)}}.rollIn{-webkit-animation-name:rollIn;animation-name:rollIn}@-webkit-keyframes rollOut{0%{opacity:1;-webkit-transform:translateX(0)rotate(0);transform:translateX(0)rotate(0)}100%{opacity:0;-webkit-transform:translateX(100%)rotate(120deg);transform:translateX(100%)rotate(120deg)}}@keyframes rollOut{0%{opacity:1;-webkit-transform:translateX(0)rotate(0);-ms-transform:translateX(0)rotate(0);transform:translateX(0)rotate(0)}100%{opacity:0;-webkit-transform:translateX(100%)rotate(120deg);-ms-transform:translateX(100%)rotate(120deg);transform:translateX(100%)rotate(120deg)}}.rollOut{-webkit-animation-name:rollOut;animation-name:rollOut}"
  },
  {
    "path": "docs/v2/vendor/custom.css",
    "content": "/*\n * What follows is the result of much research on cross-browser styling.\n * Credit left inline and big thanks to Nicolas Gallagher, Jonathan Neal,\n * Kroc Camen, and the H5BP dev community and team.\n */\n\n/* ==========================================================================\n   Base styles: opinionated defaults\n   ========================================================================== */\n\nhtml {\n  color: #222;\n  font-size: 1em;\n  line-height: 1.4;\n}\n\n.small {\n  line-height: 1.5rem;\n}\n\n/*\n * Remove text-shadow in selection highlight:\n * https://twitter.com/miketaylr/status/12228805301\n *\n * These selection rule sets have to be separate.\n * Customize the background color to match your design.\n */\n\n::-moz-selection {\n  background: #b3d4fc;\n  text-shadow: none;\n}\n\n::selection {\n  background: #b3d4fc;\n  text-shadow: none;\n}\n\n/*\n * A better looking default horizontal rule\n */\n\nhr {\n  display: block;\n  height: 1px;\n  border: 0;\n  border-top: 1px solid #ccc;\n  margin: 1em 0;\n  padding: 0;\n}\n\n/*\n * Remove the gap between audio, canvas, iframes,\n * images, videos and the bottom of their containers:\n * https://github.com/h5bp/html5-boilerplate/issues/440\n */\n\naudio,\ncanvas,\niframe,\nimg,\nsvg,\nvideo {\n  vertical-align: middle;\n}\n\n/*\n * Remove default fieldset styles.\n */\n\nfieldset {\n  border: 0;\n  margin: 0;\n  padding: 0;\n}\n\n/*\n * Allow only vertical resizing of textareas.\n */\n\ntextarea {\n  resize: vertical;\n}\n\n\n\n/* ==========================================================================\n   Author's custom styles\n   ========================================================================== */\n\n@font-face {\n  font-family: \"Brandon Text Light\";\n  src: url(\"../fonts/brandon-text-light.woff\") format(\"woff\");\n  font-weight: normal;\n  font-style: normal;\n}\n\n@font-face {\n  font-family: \"Brandon Text Regular\";\n  src: url(\"../fonts/brandon-text-regular.woff\") format(\"woff\");\n  font-weight: normal;\n  font-style: normal;\n}\n\n@font-face {\n  font-family: \"Brandon Text Bold\";\n  src: url(\"../fonts/brandon-text-bold.woff\") format(\"woff\");\n  font-weight: normal;\n  font-style: normal;\n}\n\nhtml, body {\n  font-family: 'Brandon Text Light', \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  width: 100%;\n  color: #8c8c8c;\n  font-size: 16px;\n  line-height: 30px;\n  background-color: #2D3134;\n}\n\n\nh1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6 {\n  color: #fff;\n  font-family: 'Nunito', 'Brandon Text Regular', \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n\na, i, input, textarea, .primary, button, .mask {\n  transition: all .15s ease;\n}\n\na {\n  color: #dde4e8;\n  text-decoration: underline;\n}\n\na:hover {\n  text-decoration: underline;\n  color: #fff;\n}\n\n.bold {\n  font-family: 'Brandon Text Regular', \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n\nstrong {\n  font-family: 'Brandon Text Regular', \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-weight: 300;\n}\n\n.profile-bio {\n  width: 50%;\n  margin: 5px auto 10px;\n  color: #444;\n}\n\na.top-link {\n  margin: 0 20px;\n  color: #444;\n  transition: all .3s ease;\n  width: 110px !important;\n  display: inline-block;\n}\n\na.top-link:hover {\n  color: #e7543d;\n}\n\n.container-top {\n  padding-top: 50px;\n  position: fixed;\n  width: 100%;\n  z-index: 3;\n}\n\n.container-top:after {\n  content: \" \";\n  border-bottom: 2px solid rgba(209, 209, 209, 0.26);\n  -webkit-border-radius: 100%;\n  -moz-border-radius: 100%;\n  border-radius: 100%;\n  width: 100%;\n  height: 155px;\n  position: absolute;\n  z-index: -1;\n  top: -20px;\n  left: 0;\n  -webkit-transition: all .4s ease;\n  -moz-transition: all .4s ease;\n  -ms-transition: all .4s ease;\n  -o-transition: all .4s ease;\n  transition: all .4s ease;\n}\n\n.container-top.shown:after,\n.container-top.shown:before {\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n\n.container-top:before {\n  content: \" \";\n  background-color: #fff;\n  -webkit-border-radius: 100%;\n  -moz-border-radius: 100%;\n  border-radius: 100%;\n  width: 100%;\n  height: 155px;\n  position: absolute;\n  z-index: -2;\n  top: -20px;\n  left: 0;\n}\n\n.container-bottom {\n  padding-top: 170px;\n  z-index: 1;\n}\n\n.top-link [class^=\"ps-icon-\"]:before, .top-link [class*=\" ps-icon-\"]:before {\n  position: relative;\n  top: 7px;\n  margin-right: 4px;\n  font-size: 1.4em;\n}\n\na.contact-link {\n  margin: 0 4px;\n  color: #ccc;\n  display: inline-block;\n  width: 25px;\n}\n\n.primary, a.contact-link:hover {\n  color: #e7543d;\n}\n\na.contact-link.wdt img {\n  width: 18px;\n  position: relative;\n  top: -2px;\n}\n\nh3.name {\n  letter-spacing: 1px;\n  font-family: \"Nunito\", \"Brandon Text Light\", sans-serif;\n}\n\nh3.top-name {\n  position: absolute;\n  font-family: \"Nunito\", \"Brandon Text Light\", sans-serif;\n  top: -60px;\n  left: 0;\n  width: 100%;\n  opacity: 0;\n  -webkit-transition: all .3s;\n  -moz-transition: all .3s;\n  -ms-transition: all .3s;\n  -o-transition: all .3s;\n  transition: all .3s;\n  letter-spacing: 1px;\n}\n\n\n\n.mt10 {\n  margin-top: 10px;\n}\n\n.mt20 {\n  margin-top: 20px;\n}\n\n.mt30 {\n  margin-top: 30px;\n}\n\n.mb10 {\n  margin-bottom: 10px;\n}\n\n.mb20 {\n  margin-bottom: 20px;\n}\n\n.mb30 {\n  margin-bottom: 30px;\n}\n\n\n\na.button {\n  display: inline-block;\n  position: relative;\n  padding: .8em 1.3em;\n  font-size: 11px;\n  letter-spacing: 1px;\n  font-weight: 800;\n  text-transform: uppercase;\n  line-height: 1.2;\n  outline: 0;\n  background: #AC8FFD;\n  border: 2px solid #948CE2;\n  color: #fff;\n  text-shadow: none;\n  border-radius: 2px;\n}\n\na.button:hover {\n  color: #fff;\n  background-color: #c0a7fd;\n  border-color: #948CE2;\n}\n\n/* ---- */\n\ni.fa.fa-heart {\n  color: #AC8FFD;\n}\n\n\nh2 i.fa,\nh2 i.ps-icon {\n  font-size: 16px;\n  margin-right: 14px;\n  line-height: 39px;\n  text-align: center;\n  color: #B7C6C9;\n  background: #fff;\n  border-radius: 50%;\n  border: 4px solid #F4F6F7;\n  display: inline-block;\n  width: 47px;\n}\n\n.rainbow_border{\n  border-image: -webkit-linear-gradient(left, #E18728, #BE4C39 33%, #9351A6 66%, #4472B9,#4CA454,#D49B00) 2%; border-image: -ms-linear-gradient(left, #E18728, #BE4C39 33%, #9351A6 66%, #4472B9,#4CA454,#D49B00) 2%; border-image: -moz-linear-gradient(left, #E18728, #BE4C39 33%, #9351A6 66%, #4472B9,#4CA454,#D49B00) 2%;\n}\n\n.imp {\n  color: #FAF46A;\n  border-radius: 3px;\n}\n\n.left-logo {\n  width: 170px;\n  margin: 20px auto;\n  display: block;\n}\n\nul.top-links {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n\nul.top-links li {\n}\n\nul.top-links li a {\n  color: #8c8c8c;\n  display: block;\n  padding: 2px 10px;\n  font-family: \"Nunito\", \"Brandon Text Regular\", sans-serif;\n  text-decoration: none;\n}\n\nul.top-links li a.active {\n  color: #fff;\n  font-weight: bolder\n}\n\nul.top-links li a:hover {\n  color: #fff;\n}\n\nblockquote {\n  font-size: 15px;\n  line-height: 1.5em;\n  margin: 40px 0;\n  background: rgba(0,0,0,.075);\n  border-left: 5px solid #222;\n}\n\n.project-info {\n  text-align: center;\n  padding: 0 5px;\n}\n\npre {\n  display: block;\n  padding: 20px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  color: #dde4e8;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: rgba(22,22,22,.8);\n  border: none;\n  border-radius: 0;\n}\n\n.sharer-btn.text-center.sharer-0 {\n  display: inline-block !important;\n}\n\n.sharer-btn.text-center.sharer-0 label {\n  padding: 2px 13px !important;\n  position: relative;\n  top: 2px !important;\n  background: #eeeeee !important;\n  color: #555555 !important;\n  border-radius: 2px !important;\n}\n\n.sharer-btn.text-center.sharer-0 label span {\n  text-transform: capitalize !important;\n  font-size: .85em !important;\n}\n\n.sharer-btn.text-center.sharer-0 .social.active.bottom {\n  z-index: 9999;\n  position: relative;\n}\n\nspan.ps-icon {\n  position: relative;\n  top: 5px;\n}\n\n.top-links span.ps-icon {\n  position: relative;\n  top: 3px;\n  text-align: center;\n  margin-right: 12px;\n  background: #222;\n  border-radius: 5px;\n  width: 25px;\n  height: 25px;\n  padding-top: 1px;\n  display: inline-block;\n}\n\nselect:focus {\n  outline: none;\n}\n\nselect {\n  /* General styling */\n  height: 30px;\n  width: 137px;\n  padding-left: 10px;\n\n  color: #222;\n  border-radius: 3px;\n  border: 0 solid #222;\n  margin: 0 3px;\n\n  /* Removes the default <select> styling */\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n\n  /* Positions background arrow image */\n  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAh0lEQVQ4T93TMQrCUAzG8V9x8QziiYSuXdzFC7h4AcELOPQAdXYovZCHEATlgQV5GFTe1ozJlz/kS1IpjKqw3wQBVyy++JI0y1GTe7DCBbMAckeNIQKk/BanALBB+16LtnDELoMcsM/BESDlz2heDR3WePwKSLo5eoxz3z6NNcFD+vu3ij14Aqz/DxGbKB7CAAAAAElFTkSuQmCC');\n  background-repeat: no-repeat;\n  background-position: 115px center;\n}\n\n.custom-container {\n  border: 1px solid #fff;\n  background-color: #fff;\n  border-radius: 3px;\n  padding: 10px;\n  min-height: 20px;\n  max-width: 300px;\n}\n\n.theme-container {\n  text-align: center;\n  background: rgba(0,0,0,.2);\n  padding: 10px 20px 20px 20px;\n  border: 3px solid #8c8c86;\n  border-radius: 2px;\n}\n\n.preview-container {\n  max-width: 390px;\n  margin: 0 auto;\n}\n\n.supported-by a {\n  text-decoration: none;\n}\n\na.imp.issue {\n  background: #FAF46A;\n  color: #000;\n  padding: 0 5px;\n  font-family: \"Brandon Text Bold\", sans-serif;\n  text-decoration: none;\n}"
  },
  {
    "path": "docs/v2/vendor/documentation.js",
    "content": "$(function () {\n  if ($('.prettyprint').length) {\n    window.prettyPrint && prettyPrint();\n  }\n\n  noty({\n    text: '<strong>v2.4.0 released!</strong><br> Basic inline timeout <strong>progress bar</strong> added',\n    type: 'information',\n    theme: 'metroui',\n    layout: 'topRight',\n    timeout: 4000,\n    progressBar: true,\n    animation   : {\n      open : 'animated fadeInDown',\n      close: 'animated fadeOutUp'\n    }\n  });\n\n  var $activeLink = $('a[href$=\"' + window.location.pathname + '\"]');\n  if ($activeLink) {\n    $('.top-links a').removeClass('active');\n    $activeLink.addClass('active');\n  }\n\n  $('.runner').on('click', function (e) {\n\n    var notes = [];\n\n    var layout = $('select#layout').val();\n    var type   = $('select#type').val();\n\n    notes['alert']       = 'Best check yo self, you\\'re not looking too good.';\n    notes['error']       = 'Change a few things up and try submitting again.';\n    notes['success']     = 'You successfully read this important alert message.';\n    notes['information'] = 'This alert needs your attention, but it\\'s not super important.';\n    notes['warning']     = '<strong>Warning!</strong> <br /> Best check yo self, you\\'re not looking too good.';\n    notes['confirm']     = 'Do you want to continue?';\n\n    e.preventDefault();\n\n    var self = $(this);\n\n    if (layout == 'inline') {\n      $('.custom-container').noty({\n        text        : notes[type],\n        type        : type,\n        theme       : 'relax',\n        timeout     : 3000,\n        progressBar : true,\n        dismissQueue: true,\n        animation   : {\n          open : 'animated fadeInDown',\n          close: 'animated fadeOutUp'\n        },\n        buttons     : (type != 'confirm') ? false : [\n          {\n            addClass: 'btn btn-primary', text: 'Ok', onClick: function ($noty) {\n\n            // this = button element\n            // $noty = $noty element\n\n            $noty.close();\n            $('.custom-container').noty({force: true, text: 'You clicked \"Ok\" button', type: 'success'});\n          }\n          },\n          {\n            addClass: 'btn btn-danger', text: 'Cancel', onClick: function ($noty) {\n            $noty.close();\n            $('.custom-container').noty({force: true, text: 'You clicked \"Cancel\" button', type: 'error'});\n          }\n          }\n        ]\n      });\n      return false;\n    }\n\n    noty({\n      text        : notes[type],\n      type        : type,\n      theme       : 'relax',\n      dismissQueue: true,\n      timeout     : 3000,\n      progressBar : true,\n      layout      : layout,\n      animation   : {\n        open : 'animated fadeInDown',\n        close: 'animated fadeOutUp'\n      },\n      buttons     : (type != 'confirm') ? false : [\n        {\n          addClass: 'btn btn-primary', text: 'Ok', onClick: function ($noty) {\n\n          // this = button element\n          // $noty = $noty element\n\n          $noty.close();\n          noty({\n            force  : true, theme: 'relax', animation: {\n              open : 'animated fadeInDown',\n              close: 'animated fadeOutUp'\n            }, text: 'You clicked \"Ok\" button', type: 'success', layout: layout\n          });\n        }\n        },\n        {\n          addClass: 'btn btn-danger', text: 'Cancel', onClick: function ($noty) {\n          $noty.close();\n          noty({\n            force  : true, theme: 'relax', animation: {\n              open : 'animated fadeInDown',\n              close: 'animated fadeOutUp'\n            }, text: 'You clicked \"Cancel\" button', type: 'error', layout: layout\n          });\n        }\n        }\n      ]\n    });\n    return false;\n  });\n\n  var $themeContainer = $('.theme-container');\n  if ($themeContainer.length) {\n    $.each($themeContainer, function (i, v) {\n      var $themeContainer   = $(v);\n      var theme             = $themeContainer.data('theme');\n      var $previewContainer = $themeContainer.find('.preview-container');\n\n      generatePreview($previewContainer, theme, 'alert');\n      generatePreview($previewContainer, theme, 'success');\n      generatePreview($previewContainer, theme, 'warning');\n      generatePreview($previewContainer, theme, 'error');\n      generatePreview($previewContainer, theme, 'information');\n      generatePreview($previewContainer, theme, 'confirm');\n\n    });\n  }\n\n  function generatePreview($container, theme, type) {\n    var notes            = [];\n    notes['alert']       = 'Best check yo self, you\\'re not looking too good.';\n    notes['error']       = 'Change a few things up and try submitting again.';\n    notes['success']     = 'You successfully read this important alert message.';\n    notes['information'] = 'This alert needs your attention, but it\\'s not super important.';\n    notes['warning']     = '<strong>Warning!</strong> <br /> Best check yo self, you\\'re not looking too good.';\n    notes['confirm']     = 'Do you want to continue?';\n    $container.noty({\n      text        : notes[type],\n      type        : type,\n      theme       : theme,\n      dismissQueue: true,\n      force       : true,\n      closeWith   : [],\n      maxVisible  : 99999999,\n      animation   : {\n        open  : {height: 'toggle'},\n        close : {height: 'toggle'},\n        easing: 'swing',\n        speed : 500\n      },\n      buttons     : (type != 'confirm') ? false : [\n        {addClass: 'btn btn-primary', text: 'Ok', onClick: function ($noty) {}},\n        {addClass: 'btn btn-danger', text: 'Cancel', onClick: function ($noty) {}}\n      ]\n    });\n  }\n\n  new Share(\".sharer-btn\", {\n    ui         : {\n      flyout: 'bottom center'\n    },\n    title      : 'NOTY - a jQuery Notification Plugin',\n    description: 'notyjs is a jQuery plugin that makes it easy to create alert - success - error - warning - information - confirmation messages as an alternative the standard alert dialog.',\n    image      : 'http://ned.im/noty/v2/images/projects/noty-v2-logo.png',\n    networks   : {\n      pinterest: {\n        enabled: false\n      },\n      facebook : {\n        load_sdk   : true,\n        app_id     : '198259823578303',\n        title      : 'NOTY - a jQuery Notification Plugin',\n        caption    : 'NOTY is a jquery plugin which is have too many options for display notification',\n        description: 'NOTYJS is a jQuery plugin that makes it easy to create alert - success - error - warning - information - confirmation messages as an alternative the standard alert dialog.',\n        image      : 'http://ned.im/noty/v2/images/projects/noty-v2-logo.png'\n      },\n      twitter  : {\n        description: 'NOTYJS - a jQuery Notification Plugin &num;notyjs &num;jquery &num;notification &num;plugin'\n      }\n    }\n  });\n\n\n  var $releasesContainer = $('.releases-wrapper');\n  if ($releasesContainer.length) {\n\n    var github = function () {\n      return [\n        {\n          // strike-through\n          // NOTE: showdown already replaced \"~\" with \"~T\", so we need to adjust accordingly.\n          type   : 'lang',\n          regex  : '(~T){2}([^~]+)(~T){2}',\n          replace: function (match, prefix, content) {\n            return '<del>' + content + '</del>';\n          }\n        }\n      ];\n    };\n\n    var issueLinker = {\n      type   : 'lang',\n      regex  : '#[0-9]+',\n      replace: function (match, prefix, content) {\n        console.log(match);\n        return '<a class=\"imp issue\" target=\"_blank\" href=\"https://github.com/needim/noty/v2/issues/' + match.substr(1) + '\">' + match + '</a>';\n      }\n    };\n\n    showdown.extension('issueLinker', issueLinker);\n\n    var converter = new showdown.Converter({extensions: ['issueLinker']});\n\n    converter.setOption('tasklists', true);\n    converter.setOption('simpleLineBreaks', true);\n\n    $.getJSON(\"../releases\", function (data) {\n      var items = [];\n      $.each(data, function (key, val) {\n        var entry = \"<li><h3>\" + val.tag_name + \"</h3>\";\n        entry += \"<p>\";\n        entry += converter.makeHtml(val.body);\n        entry += \"</p>\";\n        entry += \"</li>\";\n        items.push(entry);\n      });\n\n      $(\"<ul/>\", {\n        \"class\": \"release-list\",\n        html   : items.join(\"\")\n      }).appendTo($releasesContainer);\n    });\n\n  }\n\n\n});"
  },
  {
    "path": "docs/v2/vendor/fastclick.js",
    "content": "/**\r\n * @preserve FastClick: polyfill to remove click delays on browsers with touch UIs.\r\n *\r\n * @version 0.6.11\r\n * @codingstandard ftlabs-jsv2\r\n * @copyright The Financial Times Limited [All Rights Reserved]\r\n * @license MIT License\r\n Copyright (C) 2012 The Financial Times Ltd.\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n */\r\n\r\n/*jslint browser:true, node:true*/\r\n/*global define, Event, Node*/\r\n\r\n\r\n/**\r\n * Instantiate fast-clicking listeners on the specificed layer.\r\n *\r\n * @constructor\r\n * @param {Element} layer The layer to listen on\r\n */\r\nfunction FastClick(layer) {\r\n\t'use strict';\r\n\tvar oldOnClick, self = this;\r\n\r\n\r\n\t/**\r\n\t * Whether a click is currently being tracked.\r\n\t *\r\n\t * @type boolean\r\n\t */\r\n\tthis.trackingClick = false;\r\n\r\n\r\n\t/**\r\n\t * Timestamp for when when click tracking started.\r\n\t *\r\n\t * @type number\r\n\t */\r\n\tthis.trackingClickStart = 0;\r\n\r\n\r\n\t/**\r\n\t * The element being tracked for a click.\r\n\t *\r\n\t * @type EventTarget\r\n\t */\r\n\tthis.targetElement = null;\r\n\r\n\r\n\t/**\r\n\t * X-coordinate of touch start event.\r\n\t *\r\n\t * @type number\r\n\t */\r\n\tthis.touchStartX = 0;\r\n\r\n\r\n\t/**\r\n\t * Y-coordinate of touch start event.\r\n\t *\r\n\t * @type number\r\n\t */\r\n\tthis.touchStartY = 0;\r\n\r\n\r\n\t/**\r\n\t * ID of the last touch, retrieved from Touch.identifier.\r\n\t *\r\n\t * @type number\r\n\t */\r\n\tthis.lastTouchIdentifier = 0;\r\n\r\n\r\n\t/**\r\n\t * Touchmove boundary, beyond which a click will be cancelled.\r\n\t *\r\n\t * @type number\r\n\t */\r\n\tthis.touchBoundary = 10;\r\n\r\n\r\n\t/**\r\n\t * The FastClick layer.\r\n\t *\r\n\t * @type Element\r\n\t */\r\n\tthis.layer = layer;\r\n\r\n\tif (!layer || !layer.nodeType) {\r\n\t\tthrow new TypeError('Layer must be a document node');\r\n\t}\r\n\r\n\t/** @type function() */\r\n\tthis.onClick = function() { return FastClick.prototype.onClick.apply(self, arguments); };\r\n\r\n\t/** @type function() */\r\n\tthis.onMouse = function() { return FastClick.prototype.onMouse.apply(self, arguments); };\r\n\r\n\t/** @type function() */\r\n\tthis.onTouchStart = function() { return FastClick.prototype.onTouchStart.apply(self, arguments); };\r\n\r\n\t/** @type function() */\r\n\tthis.onTouchMove = function() { return FastClick.prototype.onTouchMove.apply(self, arguments); };\r\n\r\n\t/** @type function() */\r\n\tthis.onTouchEnd = function() { return FastClick.prototype.onTouchEnd.apply(self, arguments); };\r\n\r\n\t/** @type function() */\r\n\tthis.onTouchCancel = function() { return FastClick.prototype.onTouchCancel.apply(self, arguments); };\r\n\r\n\tif (FastClick.notNeeded(layer)) {\r\n\t\treturn;\r\n\t}\r\n\r\n\t// Set up event handlers as required\r\n\tif (this.deviceIsAndroid) {\r\n\t\tlayer.addEventListener('mouseover', this.onMouse, true);\r\n\t\tlayer.addEventListener('mousedown', this.onMouse, true);\r\n\t\tlayer.addEventListener('mouseup', this.onMouse, true);\r\n\t}\r\n\r\n\tlayer.addEventListener('click', this.onClick, true);\r\n\tlayer.addEventListener('touchstart', this.onTouchStart, false);\r\n\tlayer.addEventListener('touchmove', this.onTouchMove, false);\r\n\tlayer.addEventListener('touchend', this.onTouchEnd, false);\r\n\tlayer.addEventListener('touchcancel', this.onTouchCancel, false);\r\n\r\n\t// Hack is required for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2)\r\n\t// which is how FastClick normally stops click events bubbling to callbacks registered on the FastClick\r\n\t// layer when they are cancelled.\r\n\tif (!Event.prototype.stopImmediatePropagation) {\r\n\t\tlayer.removeEventListener = function(type, callback, capture) {\r\n\t\t\tvar rmv = Node.prototype.removeEventListener;\r\n\t\t\tif (type === 'click') {\r\n\t\t\t\trmv.call(layer, type, callback.hijacked || callback, capture);\r\n\t\t\t} else {\r\n\t\t\t\trmv.call(layer, type, callback, capture);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tlayer.addEventListener = function(type, callback, capture) {\r\n\t\t\tvar adv = Node.prototype.addEventListener;\r\n\t\t\tif (type === 'click') {\r\n\t\t\t\tadv.call(layer, type, callback.hijacked || (callback.hijacked = function(event) {\r\n\t\t\t\t\tif (!event.propagationStopped) {\r\n\t\t\t\t\t\tcallback(event);\r\n\t\t\t\t\t}\r\n\t\t\t\t}), capture);\r\n\t\t\t} else {\r\n\t\t\t\tadv.call(layer, type, callback, capture);\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\r\n\t// If a handler is already declared in the element's onclick attribute, it will be fired before\r\n\t// FastClick's onClick handler. Fix this by pulling out the user-defined handler function and\r\n\t// adding it as listener.\r\n\tif (typeof layer.onclick === 'function') {\r\n\r\n\t\t// Android browser on at least 3.2 requires a new reference to the function in layer.onclick\r\n\t\t// - the old one won't work if passed to addEventListener directly.\r\n\t\toldOnClick = layer.onclick;\r\n\t\tlayer.addEventListener('click', function(event) {\r\n\t\t\toldOnClick(event);\r\n\t\t}, false);\r\n\t\tlayer.onclick = null;\r\n\t}\r\n}\r\n\r\n\r\n/**\r\n * Android requires exceptions.\r\n *\r\n * @type boolean\r\n */\r\nFastClick.prototype.deviceIsAndroid = navigator.userAgent.indexOf('Android') > 0;\r\n\r\n\r\n/**\r\n * iOS requires exceptions.\r\n *\r\n * @type boolean\r\n */\r\nFastClick.prototype.deviceIsIOS = /iP(ad|hone|od)/.test(navigator.userAgent);\r\n\r\n\r\n/**\r\n * iOS 4 requires an exception for select elements.\r\n *\r\n * @type boolean\r\n */\r\nFastClick.prototype.deviceIsIOS4 = FastClick.prototype.deviceIsIOS && (/OS 4_\\d(_\\d)?/).test(navigator.userAgent);\r\n\r\n\r\n/**\r\n * iOS 6.0(+?) requires the target element to be manually derived\r\n *\r\n * @type boolean\r\n */\r\nFastClick.prototype.deviceIsIOSWithBadTarget = FastClick.prototype.deviceIsIOS && (/OS ([6-9]|\\d{2})_\\d/).test(navigator.userAgent);\r\n\r\n\r\n/**\r\n * Determine whether a given element requires a native click.\r\n *\r\n * @param {EventTarget|Element} target Target DOM element\r\n * @returns {boolean} Returns true if the element needs a native click\r\n */\r\nFastClick.prototype.needsClick = function(target) {\r\n\t'use strict';\r\n\tswitch (target.nodeName.toLowerCase()) {\r\n\r\n\t// Don't send a synthetic click to disabled inputs (issue #62)\r\n\tcase 'button':\r\n\tcase 'select':\r\n\tcase 'textarea':\r\n\t\tif (target.disabled) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tbreak;\r\n\tcase 'input':\r\n\r\n\t\t// File inputs need real clicks on iOS 6 due to a browser bug (issue #68)\r\n\t\tif ((this.deviceIsIOS && target.type === 'file') || target.disabled) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tbreak;\r\n\tcase 'label':\r\n\tcase 'video':\r\n\t\treturn true;\r\n\t}\r\n\r\n\treturn (/\\bneedsclick\\b/).test(target.className);\r\n};\r\n\r\n\r\n/**\r\n * Determine whether a given element requires a call to focus to simulate click into element.\r\n *\r\n * @param {EventTarget|Element} target Target DOM element\r\n * @returns {boolean} Returns true if the element requires a call to focus to simulate native click.\r\n */\r\nFastClick.prototype.needsFocus = function(target) {\r\n\t'use strict';\r\n\tswitch (target.nodeName.toLowerCase()) {\r\n\tcase 'textarea':\r\n\t\treturn true;\r\n\tcase 'select':\r\n\t\treturn !this.deviceIsAndroid;\r\n\tcase 'input':\r\n\t\tswitch (target.type) {\r\n\t\tcase 'button':\r\n\t\tcase 'checkbox':\r\n\t\tcase 'file':\r\n\t\tcase 'image':\r\n\t\tcase 'radio':\r\n\t\tcase 'submit':\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// No point in attempting to focus disabled inputs\r\n\t\treturn !target.disabled && !target.readOnly;\r\n\tdefault:\r\n\t\treturn (/\\bneedsfocus\\b/).test(target.className);\r\n\t}\r\n};\r\n\r\n\r\n/**\r\n * Send a click event to the specified element.\r\n *\r\n * @param {EventTarget|Element} targetElement\r\n * @param {Event} event\r\n */\r\nFastClick.prototype.sendClick = function(targetElement, event) {\r\n\t'use strict';\r\n\tvar clickEvent, touch;\r\n\r\n\t// On some Android devices activeElement needs to be blurred otherwise the synthetic click will have no effect (#24)\r\n\tif (document.activeElement && document.activeElement !== targetElement) {\r\n\t\tdocument.activeElement.blur();\r\n\t}\r\n\r\n\ttouch = event.changedTouches[0];\r\n\r\n\t// Synthesise a click event, with an extra attribute so it can be tracked\r\n\tclickEvent = document.createEvent('MouseEvents');\r\n\tclickEvent.initMouseEvent(this.determineEventType(targetElement), true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null);\r\n\tclickEvent.forwardedTouchEvent = true;\r\n\ttargetElement.dispatchEvent(clickEvent);\r\n};\r\n\r\nFastClick.prototype.determineEventType = function(targetElement) {\r\n\t'use strict';\r\n\r\n\t//Issue #159: Android Chrome Select Box does not open with a synthetic click event\r\n\tif (this.deviceIsAndroid && targetElement.tagName.toLowerCase() === 'select') {\r\n\t\treturn 'mousedown';\r\n\t}\r\n\r\n\treturn 'click';\r\n};\r\n\r\n\r\n/**\r\n * @param {EventTarget|Element} targetElement\r\n */\r\nFastClick.prototype.focus = function(targetElement) {\r\n\t'use strict';\r\n\tvar length;\r\n\r\n\t// Issue #160: on iOS 7, some input elements (e.g. date datetime) throw a vague TypeError on setSelectionRange. These elements don't have an integer value for the selectionStart and selectionEnd properties, but unfortunately that can't be used for detection because accessing the properties also throws a TypeError. Just check the type instead. Filed as Apple bug #15122724.\r\n\tif (this.deviceIsIOS && targetElement.setSelectionRange && targetElement.type.indexOf('date') !== 0 && targetElement.type !== 'time') {\r\n\t\tlength = targetElement.value.length;\r\n\t\ttargetElement.setSelectionRange(length, length);\r\n\t} else {\r\n\t\ttargetElement.focus();\r\n\t}\r\n};\r\n\r\n\r\n/**\r\n * Check whether the given target element is a child of a scrollable layer and if so, set a flag on it.\r\n *\r\n * @param {EventTarget|Element} targetElement\r\n */\r\nFastClick.prototype.updateScrollParent = function(targetElement) {\r\n\t'use strict';\r\n\tvar scrollParent, parentElement;\r\n\r\n\tscrollParent = targetElement.fastClickScrollParent;\r\n\r\n\t// Attempt to discover whether the target element is contained within a scrollable layer. Re-check if the\r\n\t// target element was moved to another parent.\r\n\tif (!scrollParent || !scrollParent.contains(targetElement)) {\r\n\t\tparentElement = targetElement;\r\n\t\tdo {\r\n\t\t\tif (parentElement.scrollHeight > parentElement.offsetHeight) {\r\n\t\t\t\tscrollParent = parentElement;\r\n\t\t\t\ttargetElement.fastClickScrollParent = parentElement;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tparentElement = parentElement.parentElement;\r\n\t\t} while (parentElement);\r\n\t}\r\n\r\n\t// Always update the scroll top tracker if possible.\r\n\tif (scrollParent) {\r\n\t\tscrollParent.fastClickLastScrollTop = scrollParent.scrollTop;\r\n\t}\r\n};\r\n\r\n\r\n/**\r\n * @param {EventTarget} targetElement\r\n * @returns {Element|EventTarget}\r\n */\r\nFastClick.prototype.getTargetElementFromEventTarget = function(eventTarget) {\r\n\t'use strict';\r\n\r\n\t// On some older browsers (notably Safari on iOS 4.1 - see issue #56) the event target may be a text node.\r\n\tif (eventTarget.nodeType === Node.TEXT_NODE) {\r\n\t\treturn eventTarget.parentNode;\r\n\t}\r\n\r\n\treturn eventTarget;\r\n};\r\n\r\n\r\n/**\r\n * On touch start, record the position and scroll offset.\r\n *\r\n * @param {Event} event\r\n * @returns {boolean}\r\n */\r\nFastClick.prototype.onTouchStart = function(event) {\r\n\t'use strict';\r\n\tvar targetElement, touch, selection;\r\n\r\n\t// Ignore multiple touches, otherwise pinch-to-zoom is prevented if both fingers are on the FastClick element (issue #111).\r\n\tif (event.targetTouches.length > 1) {\r\n\t\treturn true;\r\n\t}\r\n\r\n\ttargetElement = this.getTargetElementFromEventTarget(event.target);\r\n\ttouch = event.targetTouches[0];\r\n\r\n\tif (this.deviceIsIOS) {\r\n\r\n\t\t// Only trusted events will deselect text on iOS (issue #49)\r\n\t\tselection = window.getSelection();\r\n\t\tif (selection.rangeCount && !selection.isCollapsed) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tif (!this.deviceIsIOS4) {\r\n\r\n\t\t\t// Weird things happen on iOS when an alert or confirm dialog is opened from a click event callback (issue #23):\r\n\t\t\t// when the user next taps anywhere else on the page, new touchstart and touchend events are dispatched\r\n\t\t\t// with the same identifier as the touch event that previously triggered the click that triggered the alert.\r\n\t\t\t// Sadly, there is an issue on iOS 4 that causes some normal touch events to have the same identifier as an\r\n\t\t\t// immediately preceeding touch event (issue #52), so this fix is unavailable on that platform.\r\n\t\t\tif (touch.identifier === this.lastTouchIdentifier) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tthis.lastTouchIdentifier = touch.identifier;\r\n\r\n\t\t\t// If the target element is a child of a scrollable layer (using -webkit-overflow-scrolling: touch) and:\r\n\t\t\t// 1) the user does a fling scroll on the scrollable layer\r\n\t\t\t// 2) the user stops the fling scroll with another tap\r\n\t\t\t// then the event.target of the last 'touchend' event will be the element that was under the user's finger\r\n\t\t\t// when the fling scroll was started, causing FastClick to send a click event to that layer - unless a check\r\n\t\t\t// is made to ensure that a parent layer was not scrolled before sending a synthetic click (issue #42).\r\n\t\t\tthis.updateScrollParent(targetElement);\r\n\t\t}\r\n\t}\r\n\r\n\tthis.trackingClick = true;\r\n\tthis.trackingClickStart = event.timeStamp;\r\n\tthis.targetElement = targetElement;\r\n\r\n\tthis.touchStartX = touch.pageX;\r\n\tthis.touchStartY = touch.pageY;\r\n\r\n\t// Prevent phantom clicks on fast double-tap (issue #36)\r\n\tif ((event.timeStamp - this.lastClickTime) < 200) {\r\n\t\tevent.preventDefault();\r\n\t}\r\n\r\n\treturn true;\r\n};\r\n\r\n\r\n/**\r\n * Based on a touchmove event object, check whether the touch has moved past a boundary since it started.\r\n *\r\n * @param {Event} event\r\n * @returns {boolean}\r\n */\r\nFastClick.prototype.touchHasMoved = function(event) {\r\n\t'use strict';\r\n\tvar touch = event.changedTouches[0], boundary = this.touchBoundary;\r\n\r\n\tif (Math.abs(touch.pageX - this.touchStartX) > boundary || Math.abs(touch.pageY - this.touchStartY) > boundary) {\r\n\t\treturn true;\r\n\t}\r\n\r\n\treturn false;\r\n};\r\n\r\n\r\n/**\r\n * Update the last position.\r\n *\r\n * @param {Event} event\r\n * @returns {boolean}\r\n */\r\nFastClick.prototype.onTouchMove = function(event) {\r\n\t'use strict';\r\n\tif (!this.trackingClick) {\r\n\t\treturn true;\r\n\t}\r\n\r\n\t// If the touch has moved, cancel the click tracking\r\n\tif (this.targetElement !== this.getTargetElementFromEventTarget(event.target) || this.touchHasMoved(event)) {\r\n\t\tthis.trackingClick = false;\r\n\t\tthis.targetElement = null;\r\n\t}\r\n\r\n\treturn true;\r\n};\r\n\r\n\r\n/**\r\n * Attempt to find the labelled control for the given label element.\r\n *\r\n * @param {EventTarget|HTMLLabelElement} labelElement\r\n * @returns {Element|null}\r\n */\r\nFastClick.prototype.findControl = function(labelElement) {\r\n\t'use strict';\r\n\r\n\t// Fast path for newer browsers supporting the HTML5 control attribute\r\n\tif (labelElement.control !== undefined) {\r\n\t\treturn labelElement.control;\r\n\t}\r\n\r\n\t// All browsers under test that support touch events also support the HTML5 htmlFor attribute\r\n\tif (labelElement.htmlFor) {\r\n\t\treturn document.getElementById(labelElement.htmlFor);\r\n\t}\r\n\r\n\t// If no for attribute exists, attempt to retrieve the first labellable descendant element\r\n\t// the list of which is defined here: http://www.w3.org/TR/html5/forms.html#category-label\r\n\treturn labelElement.querySelector('button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea');\r\n};\r\n\r\n\r\n/**\r\n * On touch end, determine whether to send a click event at once.\r\n *\r\n * @param {Event} event\r\n * @returns {boolean}\r\n */\r\nFastClick.prototype.onTouchEnd = function(event) {\r\n\t'use strict';\r\n\tvar forElement, trackingClickStart, targetTagName, scrollParent, touch, targetElement = this.targetElement;\r\n\r\n\tif (!this.trackingClick) {\r\n\t\treturn true;\r\n\t}\r\n\r\n\t// Prevent phantom clicks on fast double-tap (issue #36)\r\n\tif ((event.timeStamp - this.lastClickTime) < 200) {\r\n\t\tthis.cancelNextClick = true;\r\n\t\treturn true;\r\n\t}\r\n\r\n\t// Reset to prevent wrong click cancel on input (issue #156).\r\n\tthis.cancelNextClick = false;\r\n\r\n\tthis.lastClickTime = event.timeStamp;\r\n\r\n\ttrackingClickStart = this.trackingClickStart;\r\n\tthis.trackingClick = false;\r\n\tthis.trackingClickStart = 0;\r\n\r\n\t// On some iOS devices, the targetElement supplied with the event is invalid if the layer\r\n\t// is performing a transition or scroll, and has to be re-detected manually. Note that\r\n\t// for this to function correctly, it must be called *after* the event target is checked!\r\n\t// See issue #57; also filed as rdar://13048589 .\r\n\tif (this.deviceIsIOSWithBadTarget) {\r\n\t\ttouch = event.changedTouches[0];\r\n\r\n\t\t// In certain cases arguments of elementFromPoint can be negative, so prevent setting targetElement to null\r\n\t\ttargetElement = document.elementFromPoint(touch.pageX - window.pageXOffset, touch.pageY - window.pageYOffset) || targetElement;\r\n\t\ttargetElement.fastClickScrollParent = this.targetElement.fastClickScrollParent;\r\n\t}\r\n\r\n\ttargetTagName = targetElement.tagName.toLowerCase();\r\n\tif (targetTagName === 'label') {\r\n\t\tforElement = this.findControl(targetElement);\r\n\t\tif (forElement) {\r\n\t\t\tthis.focus(targetElement);\r\n\t\t\tif (this.deviceIsAndroid) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\ttargetElement = forElement;\r\n\t\t}\r\n\t} else if (this.needsFocus(targetElement)) {\r\n\r\n\t\t// Case 1: If the touch started a while ago (best guess is 100ms based on tests for issue #36) then focus will be triggered anyway. Return early and unset the target element reference so that the subsequent click will be allowed through.\r\n\t\t// Case 2: Without this exception for input elements tapped when the document is contained in an iframe, then any inputted text won't be visible even though the value attribute is updated as the user types (issue #37).\r\n\t\tif ((event.timeStamp - trackingClickStart) > 100 || (this.deviceIsIOS && window.top !== window && targetTagName === 'input')) {\r\n\t\t\tthis.targetElement = null;\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tthis.focus(targetElement);\r\n\r\n\t\t// Select elements need the event to go through on iOS 4, otherwise the selector menu won't open.\r\n\t\tif (!this.deviceIsIOS4 || targetTagName !== 'select') {\r\n\t\t\tthis.targetElement = null;\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\tif (this.deviceIsIOS && !this.deviceIsIOS4) {\r\n\r\n\t\t// Don't send a synthetic click event if the target element is contained within a parent layer that was scrolled\r\n\t\t// and this tap is being used to stop the scrolling (usually initiated by a fling - issue #42).\r\n\t\tscrollParent = targetElement.fastClickScrollParent;\r\n\t\tif (scrollParent && scrollParent.fastClickLastScrollTop !== scrollParent.scrollTop) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n\r\n\t// Prevent the actual click from going though - unless the target node is marked as requiring\r\n\t// real clicks or if it is in the whitelist in which case only non-programmatic clicks are permitted.\r\n\tif (!this.needsClick(targetElement)) {\r\n\t\tevent.preventDefault();\r\n\t\tthis.sendClick(targetElement, event);\r\n\t}\r\n\r\n\treturn false;\r\n};\r\n\r\n\r\n/**\r\n * On touch cancel, stop tracking the click.\r\n *\r\n * @returns {void}\r\n */\r\nFastClick.prototype.onTouchCancel = function() {\r\n\t'use strict';\r\n\tthis.trackingClick = false;\r\n\tthis.targetElement = null;\r\n};\r\n\r\n\r\n/**\r\n * Determine mouse events which should be permitted.\r\n *\r\n * @param {Event} event\r\n * @returns {boolean}\r\n */\r\nFastClick.prototype.onMouse = function(event) {\r\n\t'use strict';\r\n\r\n\t// If a target element was never set (because a touch event was never fired) allow the event\r\n\tif (!this.targetElement) {\r\n\t\treturn true;\r\n\t}\r\n\r\n\tif (event.forwardedTouchEvent) {\r\n\t\treturn true;\r\n\t}\r\n\r\n\t// Programmatically generated events targeting a specific element should be permitted\r\n\tif (!event.cancelable) {\r\n\t\treturn true;\r\n\t}\r\n\r\n\t// Derive and check the target element to see whether the mouse event needs to be permitted;\r\n\t// unless explicitly enabled, prevent non-touch click events from triggering actions,\r\n\t// to prevent ghost/doubleclicks.\r\n\tif (!this.needsClick(this.targetElement) || this.cancelNextClick) {\r\n\r\n\t\t// Prevent any user-added listeners declared on FastClick element from being fired.\r\n\t\tif (event.stopImmediatePropagation) {\r\n\t\t\tevent.stopImmediatePropagation();\r\n\t\t} else {\r\n\r\n\t\t\t// Part of the hack for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2)\r\n\t\t\tevent.propagationStopped = true;\r\n\t\t}\r\n\r\n\t\t// Cancel the event\r\n\t\tevent.stopPropagation();\r\n\t\tevent.preventDefault();\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\t// If the mouse event is permitted, return true for the action to go through.\r\n\treturn true;\r\n};\r\n\r\n\r\n/**\r\n * On actual clicks, determine whether this is a touch-generated click, a click action occurring\r\n * naturally after a delay after a touch (which needs to be cancelled to avoid duplication), or\r\n * an actual click which should be permitted.\r\n *\r\n * @param {Event} event\r\n * @returns {boolean}\r\n */\r\nFastClick.prototype.onClick = function(event) {\r\n\t'use strict';\r\n\tvar permitted;\r\n\r\n\t// It's possible for another FastClick-like library delivered with third-party code to fire a click event before FastClick does (issue #44). In that case, set the click-tracking flag back to false and return early. This will cause onTouchEnd to return early.\r\n\tif (this.trackingClick) {\r\n\t\tthis.targetElement = null;\r\n\t\tthis.trackingClick = false;\r\n\t\treturn true;\r\n\t}\r\n\r\n\t// Very odd behaviour on iOS (issue #18): if a submit element is present inside a form and the user hits enter in the iOS simulator or clicks the Go button on the pop-up OS keyboard the a kind of 'fake' click event will be triggered with the submit-type input element as the target.\r\n\tif (event.target.type === 'submit' && event.detail === 0) {\r\n\t\treturn true;\r\n\t}\r\n\r\n\tpermitted = this.onMouse(event);\r\n\r\n\t// Only unset targetElement if the click is not permitted. This will ensure that the check for !targetElement in onMouse fails and the browser's click doesn't go through.\r\n\tif (!permitted) {\r\n\t\tthis.targetElement = null;\r\n\t}\r\n\r\n\t// If clicks are permitted, return true for the action to go through.\r\n\treturn permitted;\r\n};\r\n\r\n\r\n/**\r\n * Remove all FastClick's event listeners.\r\n *\r\n * @returns {void}\r\n */\r\nFastClick.prototype.destroy = function() {\r\n\t'use strict';\r\n\tvar layer = this.layer;\r\n\r\n\tif (this.deviceIsAndroid) {\r\n\t\tlayer.removeEventListener('mouseover', this.onMouse, true);\r\n\t\tlayer.removeEventListener('mousedown', this.onMouse, true);\r\n\t\tlayer.removeEventListener('mouseup', this.onMouse, true);\r\n\t}\r\n\r\n\tlayer.removeEventListener('click', this.onClick, true);\r\n\tlayer.removeEventListener('touchstart', this.onTouchStart, false);\r\n\tlayer.removeEventListener('touchmove', this.onTouchMove, false);\r\n\tlayer.removeEventListener('touchend', this.onTouchEnd, false);\r\n\tlayer.removeEventListener('touchcancel', this.onTouchCancel, false);\r\n};\r\n\r\n\r\n/**\r\n * Check whether FastClick is needed.\r\n *\r\n * @param {Element} layer The layer to listen on\r\n */\r\nFastClick.notNeeded = function(layer) {\r\n\t'use strict';\r\n\tvar metaViewport;\r\n\tvar chromeVersion;\r\n\r\n\t// Devices that don't support touch don't need FastClick\r\n\tif (typeof window.ontouchstart === 'undefined') {\r\n\t\treturn true;\r\n\t}\r\n\r\n\t// Chrome version - zero for other browsers\r\n\tchromeVersion = +(/Chrome\\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1];\r\n\r\n\tif (chromeVersion) {\r\n\r\n\t\tif (FastClick.prototype.deviceIsAndroid) {\r\n\t\t\tmetaViewport = document.querySelector('meta[name=viewport]');\r\n\t\t\t\r\n\t\t\tif (metaViewport) {\r\n\t\t\t\t// Chrome on Android with user-scalable=\"no\" doesn't need FastClick (issue #89)\r\n\t\t\t\tif (metaViewport.content.indexOf('user-scalable=no') !== -1) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\t// Chrome 32 and above with width=device-width or less don't need FastClick\r\n\t\t\t\tif (chromeVersion > 31 && window.innerWidth <= window.screen.width) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t// Chrome desktop doesn't need FastClick (issue #15)\r\n\t\t} else {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n\r\n\t// IE10 with -ms-touch-action: none, which disables double-tap-to-zoom (issue #97)\r\n\tif (layer.style.msTouchAction === 'none') {\r\n\t\treturn true;\r\n\t}\r\n\r\n\treturn false;\r\n};\r\n\r\n\r\n/**\r\n * Factory method for creating a FastClick object\r\n *\r\n * @param {Element} layer The layer to listen on\r\n */\r\nFastClick.attach = function(layer) {\r\n\t'use strict';\r\n\treturn new FastClick(layer);\r\n};\r\n\r\n\r\nif (typeof define !== 'undefined' && define.amd) {\r\n\r\n\t// AMD. Register as an anonymous module.\r\n\tdefine(function() {\r\n\t\t'use strict';\r\n\t\treturn FastClick;\r\n\t});\r\n} else if (typeof module !== 'undefined' && module.exports) {\r\n\tmodule.exports = FastClick.attach;\r\n\tmodule.exports.FastClick = FastClick;\r\n} else {\r\n\twindow.FastClick = FastClick;\r\n}\r\n"
  },
  {
    "path": "docs/v2/vendor/google-code-prettify/prettify.css",
    "content": ".str {\r\n  color: #EC7600;\r\n}\r\n\r\n.kwd {\r\n  color: #93C763;\r\n}\r\n\r\n.com {\r\n  color: #66747B;\r\n}\r\n\r\n.typ {\r\n  color: #678CB1;\r\n}\r\n\r\n.lit {\r\n  color: #FACD22;\r\n}\r\n\r\n.pun {\r\n  color: #F1F2F3;\r\n}\r\n\r\n.pln {\r\n  /*color: #F1F2F3;*/\r\n}\r\n\r\n.tag {\r\n  color: #8AC763;\r\n}\r\n\r\n.atn {\r\n  color: #E0E2E4;\r\n}\r\n\r\n.atv {\r\n  color: #EC7600;\r\n}\r\n\r\n.dec {\r\n  color: purple;\r\n}\r\n\r\n.prettyprint {\r\n\r\n}\r\n\r\n.prettyprint.linenums {\r\n  padding: 22px 8px;\r\n  background-size: 100% 1.7em;\r\n  box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0, inset 0 1px 0 #fff, 1px 1px 0 #fff, 2px 2px 0 #ddd, 3px 3px 0 #fff, 4px 4px 0 #ddd;\r\n}\r\n\r\n/* Specify class=linenums on a pre to get line numbering */\r\nol.linenums {\r\n  margin: 0 0 0 33px; /* IE indents via margin-left */\r\n  padding-left: 0;\r\n}\r\n\r\nol.linenums li {\r\n  padding-left: 16px;\r\n  color: #bebec5;\r\n  line-height: 20px;\r\n  text-shadow: 0 1px 0 #fff;\r\n}"
  },
  {
    "path": "docs/v2/vendor/google-code-prettify/prettify.js",
    "content": "var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;\n(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:\"0\"<=b&&b<=\"7\"?parseInt(a.substring(1),8):b===\"u\"||b===\"x\"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?\"\\\\x0\":\"\\\\x\")+a.toString(16);a=String.fromCharCode(a);if(a===\"\\\\\"||a===\"-\"||a===\"[\"||a===\"]\")a=\"\\\\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\\\u[\\dA-Fa-f]{4}|\\\\x[\\dA-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\S\\s]|[^\\\\]/g),a=\n[],b=[],o=f[0]===\"^\",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&\"-\"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=[\"[\"];o&&b.push(\"^\");b.push.apply(b,a);for(c=0;c<\nf.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push(\"-\"),b.push(e(i[1])));b.push(\"]\");return b.join(\"\")}function y(a){for(var f=a.source.match(/\\[(?:[^\\\\\\]]|\\\\[\\S\\s])*]|\\\\u[\\dA-Fa-f]{4}|\\\\x[\\dA-Fa-f]{2}|\\\\\\d+|\\\\[^\\dux]|\\(\\?[!:=]|[()^]|[^()[\\\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j===\"(\"?++i:\"\\\\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j===\"(\"?(++i,d[i]===void 0&&(f[c]=\"(?:\")):\"\\\\\"===j.charAt(0)&&\n(j=+j.substring(1))&&j<=i&&(f[c]=\"\\\\\"+d[i]);for(i=c=0;c<b;++c)\"^\"===f[c]&&\"^\"!==f[c+1]&&(f[c]=\"\");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a===\"[\"?f[c]=h(j):a!==\"\\\\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return\"[\"+String.fromCharCode(a&-33,a|32)+\"]\"}));return f.join(\"\")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\\\u[\\da-f]{4}|\\\\x[\\da-f]{2}|\\\\[^UXux]/gi,\"\"))){s=!0;l=!1;break}}for(var r=\n{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(\"\"+g);n.push(\"(?:\"+y(g)+\")\")}return RegExp(n.join(\"|\"),l?\"gi\":\"g\")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if(\"BR\"===g||\"LI\"===g)h[s]=\"\\n\",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\\r\\n?/g,\"\\n\"):g.replace(/[\\t\\n\\r ]+/g,\" \"),h[s]=g,t[s<<1]=y,y+=g.length,\nt[s++<<1|1]=a)}}var e=/(?:^|\\s)nocode(?:\\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue(\"white-space\"));var p=l&&\"pre\"===l.substring(0,3);m(a);return{a:h.join(\"\").replace(/\\n$/,\"\"),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,\"pln\"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===\n\"string\")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b=\"pln\")}if((c=b.length>=5&&\"lang-\"===b.substring(0,5))&&!(o&&typeof o[1]===\"string\"))c=!1,b=\"src\";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),\nl=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=\"\"+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\\S\\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push([\"str\",/^(?:'''(?:[^'\\\\]|\\\\[\\S\\s]|''?(?=[^']))*(?:'''|$)|\"\"\"(?:[^\"\\\\]|\\\\[\\S\\s]|\"\"?(?=[^\"]))*(?:\"\"\"|$)|'(?:[^'\\\\]|\\\\[\\S\\s])*(?:'|$)|\"(?:[^\"\\\\]|\\\\[\\S\\s])*(?:\"|$))/,q,\"'\\\"\"]):a.multiLineStrings?m.push([\"str\",/^(?:'(?:[^'\\\\]|\\\\[\\S\\s])*(?:'|$)|\"(?:[^\"\\\\]|\\\\[\\S\\s])*(?:\"|$)|`(?:[^\\\\`]|\\\\[\\S\\s])*(?:`|$))/,\nq,\"'\\\"`\"]):m.push([\"str\",/^(?:'(?:[^\\n\\r'\\\\]|\\\\.)*(?:'|$)|\"(?:[^\\n\\r\"\\\\]|\\\\.)*(?:\"|$))/,q,\"\\\"'\"]);a.verbatimStrings&&e.push([\"str\",/^@\"(?:[^\"]|\"\")*(?:\"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push([\"com\",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,\"#\"]):m.push([\"com\",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\\b|[^\\n\\r]*)/,q,\"#\"]),e.push([\"str\",/^<(?:(?:(?:\\.\\.\\/)*|\\/?)(?:[\\w-]+(?:\\/[\\w-]+)+)?[\\w-]+\\.h|[a-z]\\w*)>/,q])):m.push([\"com\",/^#[^\\n\\r]*/,\nq,\"#\"]));a.cStyleComments&&(e.push([\"com\",/^\\/\\/[^\\n\\r]*/,q]),e.push([\"com\",/^\\/\\*[\\S\\s]*?(?:\\*\\/|$)/,q]));a.regexLiterals&&e.push([\"lang-regex\",/^(?:^^\\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|,|-=|->|\\/|\\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\\^=|\\^\\^|\\^\\^=|{|\\||\\|=|\\|\\||\\|\\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*(\\/(?=[^*/])(?:[^/[\\\\]|\\\\[\\S\\s]|\\[(?:[^\\\\\\]]|\\\\[\\S\\s])*(?:]|$))+\\/)/]);(h=a.types)&&e.push([\"typ\",h]);a=(\"\"+a.keywords).replace(/^ | $/g,\n\"\");a.length&&e.push([\"kwd\",RegExp(\"^(?:\"+a.replace(/[\\s,]+/g,\"|\")+\")\\\\b\"),q]);m.push([\"pln\",/^\\s+/,q,\" \\r\\n\\t\\xa0\"]);e.push([\"lit\",/^@[$_a-z][\\w$@]*/i,q],[\"typ\",/^(?:[@_]?[A-Z]+[a-z][\\w$@]*|\\w+_t\\b)/,q],[\"pln\",/^[$_a-z][\\w$@]*/i,q],[\"lit\",/^(?:0x[\\da-f]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+-]?\\d+)?)[a-z]*/i,q,\"0123456789\"],[\"pln\",/^\\\\[\\S\\s]?/,q],[\"pun\",/^.[^\\s\\w\"-$'./@\\\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if(\"BR\"===a.nodeName)h(a),\na.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}\nfor(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\\s)nocode(?:\\s|$)/,t=/\\r\\n?|\\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue(\"white-space\"));var p=l&&\"pre\"===l.substring(0,3);for(l=s.createElement(\"LI\");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute(\"value\",\nm);var r=s.createElement(\"OL\");r.className=\"linenums\";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className=\"L\"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode(\"\\xa0\")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn(\"cannot override language handler %s\",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\\s*</.test(m)?\"default-markup\":\"default-code\";return A[a]}function E(a){var m=\na.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\\bMSIE\\b/.test(navigator.userAgent),m=/\\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,\"\\r\"));i.nodeValue=\nj;var u=i.ownerDocument,v=u.createElement(\"SPAN\");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){\"console\"in window&&console.log(w&&w.stack?w.stack:w)}}var v=[\"break,continue,do,else,for,if,return,while\"],w=[[v,\"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile\"],\n\"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof\"],F=[w,\"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where\"],G=[w,\"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient\"],\nH=[G,\"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var\"],w=[w,\"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN\"],I=[v,\"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None\"],\nJ=[v,\"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END\"],v=[v,\"case,done,elif,esac,eval,fi,function,in,local,set,then,until\"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\\d*)/,N=/\\S/,O=u({keywords:[F,H,w,\"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END\"+\nI,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,[\"default-code\"]);k(x([],[[\"pln\",/^[^<?]+/],[\"dec\",/^<!\\w[^>]*(?:>|$)/],[\"com\",/^<\\!--[\\S\\s]*?(?:--\\>|$)/],[\"lang-\",/^<\\?([\\S\\s]+?)(?:\\?>|$)/],[\"lang-\",/^<%([\\S\\s]+?)(?:%>|$)/],[\"pun\",/^(?:<[%?]|[%?]>)/],[\"lang-\",/^<xmp\\b[^>]*>([\\S\\s]+?)<\\/xmp\\b[^>]*>/i],[\"lang-js\",/^<script\\b[^>]*>([\\S\\s]*?)(<\\/script\\b[^>]*>)/i],[\"lang-css\",/^<style\\b[^>]*>([\\S\\s]*?)(<\\/style\\b[^>]*>)/i],[\"lang-in.tag\",/^(<\\/?[a-z][^<>]*>)/i]]),\n[\"default-markup\",\"htm\",\"html\",\"mxml\",\"xhtml\",\"xml\",\"xsl\"]);k(x([[\"pln\",/^\\s+/,q,\" \\t\\r\\n\"],[\"atv\",/^(?:\"[^\"]*\"?|'[^']*'?)/,q,\"\\\"'\"]],[[\"tag\",/^^<\\/?[a-z](?:[\\w-.:]*\\w)?|\\/?>$/i],[\"atn\",/^(?!style[\\s=]|on)[a-z](?:[\\w:-]*\\w)?/i],[\"lang-uq.val\",/^=\\s*([^\\s\"'>]*(?:[^\\s\"'/>]|\\/(?=\\s)))/],[\"pun\",/^[/<->]+/],[\"lang-js\",/^on\\w+\\s*=\\s*\"([^\"]+)\"/i],[\"lang-js\",/^on\\w+\\s*=\\s*'([^']+)'/i],[\"lang-js\",/^on\\w+\\s*=\\s*([^\\s\"'>]+)/i],[\"lang-css\",/^style\\s*=\\s*\"([^\"]+)\"/i],[\"lang-css\",/^style\\s*=\\s*'([^']+)'/i],[\"lang-css\",\n/^style\\s*=\\s*([^\\s\"'>]+)/i]]),[\"in.tag\"]);k(x([],[[\"atv\",/^[\\S\\s]+/]]),[\"uq.val\"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),[\"c\",\"cc\",\"cpp\",\"cxx\",\"cyc\",\"m\"]);k(u({keywords:\"null,true,false\"}),[\"json\"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),[\"cs\"]);k(u({keywords:G,cStyleComments:!0}),[\"java\"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),[\"bsh\",\"csh\",\"sh\"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),\n[\"cv\",\"py\"]);k(u({keywords:\"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END\",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),[\"perl\",\"pl\",\"pm\"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),[\"rb\"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),[\"js\"]);k(u({keywords:\"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes\",\nhashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),[\"coffee\"]);k(x([],[[\"str\",/^[\\S\\s]+/]]),[\"regex\"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement(\"PRE\");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf(\"prettyprint\")>=0){var k=k.match(g),f,b;if(b=\n!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&\"CODE\"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName===\"pre\"||o.tagName===\"code\"||o.tagName===\"xmp\")&&o.className&&o.className.indexOf(\"prettyprint\")>=0){b=!0;break}b||((b=(b=n.className.match(/\\blinenums\\b(?::(\\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,\n250):a&&a()}for(var e=[document.getElementsByTagName(\"pre\"),document.getElementsByTagName(\"code\"),document.getElementsByTagName(\"xmp\")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\\blang(?:uage)?-([\\w.]+)(?!\\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:\"atn\",PR_ATTRIB_VALUE:\"atv\",PR_COMMENT:\"com\",PR_DECLARATION:\"dec\",PR_KEYWORD:\"kwd\",PR_LITERAL:\"lit\",\nPR_NOCODE:\"nocode\",PR_PLAIN:\"pln\",PR_PUNCTUATION:\"pun\",PR_SOURCE:\"src\",PR_STRING:\"str\",PR_TAG:\"tag\",PR_TYPE:\"typ\"}})();\n"
  },
  {
    "path": "docs/v2/vendor/main.js",
    "content": "/* global variables */\r\nvar classicLayout = false;\r\nvar portfolioKeyword;\r\nvar $container, $blog_container;\r\n\r\nwindow.anim = {};\r\nwindow.anim.open = 'flipInX';\r\nwindow.anim.close = 'flipOutX';\r\n\r\n\r\n(function ($) {\r\n\t\r\n\t\r\n\t/* DOCUMENT LOAD */\r\n\t$(function() {\r\n\r\n\t\tnew Share(\".sharer-btn\", {\r\n\t\t\ttitle: 'NOTY - a jQuery Notification Plugin',\r\n\t\t\tdescription: 'notyjs is a jQuery plugin that makes it easy to create alert - success - error - warning - information - confirmation messages as an alternative the standard alert dialog.',\r\n\t\t\timage: 'http://ned.im/noty/v2/images/projects/noty-v2-logo.png',\r\n\t\t\tnetworks: {\r\n\t\t\t\tpinterest: {\r\n\t\t\t\t\tenabled: false\r\n\t\t\t\t},\r\n\t\t\t\tfacebook: {\r\n\t\t\t\t\tload_sdk: true,\r\n\t\t\t\t\tapp_id: '198259823578303',\r\n\t\t\t\t\ttitle: 'NOTY - a jQuery Notification Plugin',\r\n\t\t\t\t  \tcaption: 'NOTY is a jquery plugin which is have too many options for display notification',\r\n\t\t\t\t  \tdescription: 'NOTYJS is a jQuery plugin that makes it easy to create alert - success - error - warning - information - confirmation messages as an alternative the standard alert dialog.',\r\n\t\t\t\t  \timage: 'http://ned.im/noty/v2/images/projects/noty-v2-logo.png'\r\n\t\t\t\t},\r\n\t\t\t\ttwitter: {\r\n\t\t\t\t\tdescription: 'NOTYJS - a jQuery Notification Plugin &num;notyjs &num;jquery &num;notification &num;plugin'\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n        $('#anim-open').on('change', function (e) {\r\n            window.anim.open = $(this).val();\r\n        });\r\n\r\n        $('#anim-close').on('change', function (e) {\r\n            window.anim.close = $(this).val();\r\n        });\r\n\r\n        $('.runner').on('click', function (e) {\r\n\r\n            var notes = [];\r\n\r\n            notes['alert'] = 'Best check yo self, you\\'re not looking too good.';\r\n            notes['error'] = 'Change a few things up and try submitting again.';\r\n            notes['success'] = 'You successfully read this important alert message.';\r\n            notes['information'] = 'This alert needs your attention, but it\\'s not super important.';\r\n            notes['warning'] = '<strong>Warning!</strong> <br /> Best check yo self, you\\'re not looking too good.';\r\n            notes['confirm'] = 'Do you want to continue?';\r\n\r\n            e.preventDefault();\r\n\r\n            var self = $(this);\r\n\r\n            if (self.data('layout') == 'inline') {\r\n                $(self.data('custom')).noty({\r\n                    text        : notes[self.data('type')],\r\n                    type        : self.data('type'),\r\n                    theme       : 'relax',\r\n                    dismissQueue: true,\r\n                    animation   : {\r\n                        open  : 'animated bounceInRight',\r\n                        close : 'animated bounceOutRight'\r\n                    },\r\n                    buttons     : (self.data('type') != 'confirm') ? false : [\r\n                        {addClass: 'btn btn-primary', text: 'Ok', onClick: function ($noty) {\r\n\r\n                            // this = button element\r\n                            // $noty = $noty element\r\n\r\n                            $noty.close();\r\n                            $(self.data('custom')).noty({force: true, text: 'You clicked \"Ok\" button', type: 'success'});\r\n                        }\r\n                        },\r\n                        {addClass: 'btn btn-danger', text: 'Cancel', onClick: function ($noty) {\r\n                            $noty.close();\r\n                            $(self.data('custom')).noty({force: true, text: 'You clicked \"Cancel\" button', type: 'error'});\r\n                        }\r\n                        }\r\n                    ]\r\n                });\r\n                return false;\r\n            }\r\n\r\n            noty({\r\n                text        : notes[self.data('type')],\r\n                type        : self.data('type'),\r\n                theme       : 'relax',\r\n                dismissQueue: true,\r\n                layout      : self.data('layout'),\r\n                animation   : {\r\n                    open  : 'animated ' + window.anim.open,\r\n                    close : 'animated ' + window.anim.close\r\n                },\r\n                buttons     : (self.data('type') != 'confirm') ? false : [\r\n                    {addClass: 'btn btn-primary', text: 'Ok', onClick: function ($noty) {\r\n\r\n                        // this = button element\r\n                        // $noty = $noty element\r\n\r\n                        $noty.close();\r\n                        noty({force: true, theme: 'relax', animation: {\r\n                            open  : 'animated ' + window.anim.open,\r\n                            close : 'animated ' + window.anim.close\r\n                        }, text: 'You clicked \"Ok\" button', type: 'success', layout: self.data('layout')});\r\n                    }\r\n                    },\r\n                    {addClass: 'btn btn-danger', text: 'Cancel', onClick: function ($noty) {\r\n                        $noty.close();\r\n                        noty({force: true, theme: 'relax', animation: {\r\n                            open  : 'animated bounceIn',\r\n                            close : 'animated bounceOut'\r\n                        }, text: 'You clicked \"Cancel\" button', type: 'error', layout: self.data('layout')});\r\n                    }\r\n                    }\r\n                ]\r\n            });\r\n            return false;\r\n        });\r\n\t\t\r\n\t\t// ------------------------------\r\n\t\t// remove click delay on touch devices\r\n\t\tFastClick.attach(document.body);\r\n\t\t// ------------------------------\r\n\t\t\r\n\t\t// ------------------------------\r\n\t\t// Rotating Words\r\n\t\tvar rotate_words = $('.rotate-words');\r\n\t\tif(rotate_words.length && Modernizr.csstransforms) {\r\n\t\t\trotate_words.find('span').eq(0).addClass('active');\r\n\t\t\tsetInterval(function(){\r\n\t\t\t\tnext_word_index = rotate_words.find('.active').next().length ? rotate_words.find('.active').next().index() : 0;\r\n\t\t\t\trotate_words.find('.active').addClass('rotate-out').removeClass('rotate-in active');\r\n\t\t\t\trotate_words.find('span').eq(next_word_index).addClass('rotate-in active').removeClass('rotate-out');\r\n\t\t\t},3000);\r\n\t\t}\r\n\t\t// ------------------------------\r\n\t\t\r\n\t\t\r\n\t\t// ------------------------------\r\n\t\t/* LATEST TWEETS WIDGET\r\n\t\t  * ### HOW TO CREATE A VALID ID TO USE: ###\r\n\t\t  * Go to www.twitter.com and sign in as normal, go to your settings page.\r\n\t\t  * Go to \"Widgets\" on the left hand side.\r\n\t\t  * Create a new widget for what you need eg \"user timeline\" or \"search\" etc. \r\n\t\t  * Feel free to check \"exclude replies\" if you dont want replies in results.\r\n\t\t  * Now go back to settings page, and then go back to widgets page, you should\r\n\t\t  * see the widget you just created. Click edit.\r\n\t\t  * Now look at the URL in your web browser, you will see a long number like this:\r\n\t\t  * 345735908357048478\r\n\t\t  * Use this as your ID below instead!\r\n\t\t  */\r\n\t\tvar latest_tweets = $('#latest-tweets');\r\n\t\tif(latest_tweets.length) {\r\n\t\t\ttwitterFetcher.fetch(latest_tweets.attr(\"data-twitterId\"), '', latest_tweets.attr(\"data-tweet-count\"), true, false, true, '', false, handleTweets);\r\n\t\t}\r\n\t\tfunction handleTweets(tweets){\r\n\t\t  var x = tweets.length;\r\n\t\t  var n = 0;\r\n\t\t  var html = '<ul>';\r\n\t\t  while(n < x) {\r\n\t\t\thtml += '<li>' + tweets[n] + '</li>';\r\n\t\t\tn++;\r\n\t\t  }\r\n\t\t  html += '</ul>';\r\n\t\t  latest_tweets.html(html);\r\n\t\t}\t\r\n\t\t// ------------------------------  \r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t// ------------------------------\r\n\t\t// SEARCH\r\n\t\t$('.search-link').click(function() {\r\n\t\t\t$(this).toggleClass('active');\r\n\t\t\t$('.header-search').slideToggle();\r\n\t\t});\r\n\t\t// ------------------------------\r\n\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t// ------------------------------\r\n\t\t// ONE PAGE LAYOUT FUNCTIONS\r\n\t\tif($('html').hasClass('one-page-layout')) {\r\n\t\t\t\r\n\t\t\t// ------------------------------\r\n\t\t\t// PORTFOLIO DETAILS\r\n\t\t\t// if url contains a portfolio detail url\r\n\t\t\tportfolioKeyword = $('section.portfolio').attr('id');\r\n\t\t\tinitialize();\r\n\t\t\tvar detailUrl = giveDetailUrl();\r\n\t\t\t// ------------------------------\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t// ------------------------------\r\n\t\t\t// LAYOUT DETECT\r\n\t\t\tvar pagesCount = $('.wrapper > section').length;\r\n\t\t\tvar isIE11 = !!navigator.userAgent.match(/Trident\\/7\\./); \r\n\t\t\tclassicLayout = $('html').attr('data-classic-layout') === 'true';\r\n\t\t\tclassicLayout = classicLayout || ($('html').attr('data-mobile-only-classic-layout') === 'true' && $(window).width() < 768);\r\n\t\t\tclassicLayout = classicLayout || !Modernizr.csstransforms3d ||  pagesCount < 3 || isIE11;\r\n\t\t\tif(classicLayout) {\r\n\t\t\t\t$('html').addClass('classic-layout');\t\r\n\t\t\t\tsetActivePage();\r\n\t\t\t\tsetTimeout(function() { setMasonry(); }, 600);\r\n\t\t\t\tsetTimeout(function() { setBlogMasonry(); }, 600);\t\r\n\t\t\t\t$.address.change(function() {\r\n\t\t\t\t\tsetActivePage();\r\n\t\t\t\t\tinitializeMap();\r\n\t\t\t\t\tsetTimeout(function() { setMasonry(); }, 100);\r\n\t\t\t\t\tsetTimeout(function() { setBlogMasonry(); }, 100);\t\r\n\t\t\t\t\t});\r\n\t\t\t}\r\n\t\t\t// initialize triple layout\r\n\t\t\t$.initTripleLayout(); \r\n\t\t\t// ------------------------------\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t// FULL BROWSER BACK BUTTON SUPPORT \r\n\t\t\t$.address.change(function() {\r\n\t\t\t\t\tvar detailUrl = giveDetailUrl();\r\n\t\t\t\t\tif(detailUrl != -1 ) {\r\n\t\t\t\t\t\tshowProjectDetails(detailUrl);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tif ($.address.path().indexOf(\"/\"+ portfolioKeyword)!=-1) {\r\n\t\t\t\t\t\t\thideProjectDetails(true,false);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}); \r\n\t\t}\r\n\t\t// ------------------------------\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t// ------------------------------\r\n\t\t// PORTFOLIO FILTERING - ISOTOPE\r\n\t\t// cache container\r\n\t\t$container = $('.portfolio-items');\r\n\t\tif($container.length) {\r\n\t\t\t$container.imagesLoaded(function() {\r\n\t\t\t\t\r\n\t\t\t\t// initialize isotope\r\n\t\t\t\t$container.isotope({\r\n\t\t\t\t  itemSelector : '.hentry',\r\n\t\t\t\t  layoutMode : $(this).attr('data-layout')\r\n\t\t\t\t});\r\n\t\t\t\t\r\n\t\t\t\tsetMasonry();\r\n\t\t\t\t$(window).resize(function() {\r\n\t\t\t\t\tsetMasonry();\r\n\t\t\t\t\tsetTimeout(function() { setMasonry(); }, 400);\t\r\n\t\t\t\t});\r\n\t\t\t\t\r\n\t\t\t\t// filter items when filter link is clicked\r\n\t\t\t\t$('#filters a').click(function(){\r\n\t\t\t\t  var selector = $(this).attr('data-filter');\r\n\t\t\t\t  setMasonry();\r\n\t\t\t\t  $container.isotope({ filter: selector });\r\n\t\t\t\t  $(this).parent().addClass('current').siblings().removeClass('current');\r\n\t\t\t\t  return false;\r\n\t\t\t\t});\r\n\t\t\t\t\r\n\t\t\t});\r\n\t\t}\r\n\t\t// ------------------------------\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t// ------------------------------\r\n\t\t// BLOG MASONRY LAYOUT\r\n\t\t// cache container\r\n\t\t$blog_container = $('.latest-posts');\r\n\t\tif($blog_container.length) {\r\n\t\t\t$blog_container.imagesLoaded(function() {\r\n\t\t\t\t\r\n\t\t\t\t// initialize isotope\r\n\t\t\t\t$blog_container.isotope({\r\n\t\t\t\t  itemSelector : '.hentry',\r\n\t\t\t\t  layoutMode : $(this).attr('data-layout')\r\n\t\t\t\t});\r\n\t\t\t\t\r\n\t\t\t\tsetBlogMasonry();\r\n\t\t\t\t$(window).resize(function() {\r\n\t\t\t\t\tsetTimeout(function() { setBlogMasonry(); }, 600);\t\r\n\t\t\t\t});\r\n\t\t\t\t\r\n\t\t\t});\r\n\t\t}\r\n\t\t// ------------------------------\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t// ------------------------------\r\n\t\t// SETUP\r\n\t\tsetup();\r\n\t\t// ------------------------------\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t// ------------------------------\r\n\t\t// PORTFOLIO DETAILS\r\n\t\t// Show details\r\n\t\t$(\".one-page-layout a.ajax\").live('click',function() {\r\n\t\t\t\r\n\t\t\tvar returnVal;\r\n\t\t\tvar url = $(this).attr('href');\r\n\t\t\tvar baseUrl = $.address.baseURL();\r\n\t\t\t\r\n\t\t\tif(url.indexOf(baseUrl) != -1) { // full url\r\n\t\t\t\tvar total = url.length;\r\n\t\t\t\tdetailUrl = url.slice(baseUrl.length+1, total);\t\r\n\t\t\t} else { // relative url\r\n\t\t\t\tdetailUrl = url;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t$.address.path(portfolioKeyword + '/' + detailUrl );\r\n\t\t\t\r\n\t\t\treturn false;\r\n\t\t\t\r\n\t\t});\r\n\t\t// ------------------------------\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t// ------------------------------\r\n\t\t// FORM VALIDATION\r\n\t\t// comment form validation fix\r\n\t\t$('#commentform').addClass('validate-form');\r\n\t\t$('#commentform').find('input,textarea').each(function(index, element) {\r\n            if($(this).attr('aria-required') == \"true\") {\r\n\t\t\t\t$(this).addClass('required');\r\n\t\t\t}\r\n\t\t\tif($(this).attr('name') == \"email\") {\r\n\t\t\t\t$(this).addClass('email');\r\n\t\t\t}\r\n\t\t});\r\n\t\t\r\n\t\t// validate form\r\n\t\tif($('.validate-form').length) {\r\n\t\t\t$('.validate-form').each(function() {\r\n\t\t\t\t\t$(this).validate();\r\n\t\t\t\t});\r\n\t\t}\r\n\t\t// ------------------------------\r\n\t\t\r\n\t\t\r\n\t\t// ------------------------------\r\n\t\t// FILL SKILL BARS\r\n\t\tfillBars();\r\n\t\t// ------------------------------\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t// ------------------------------\r\n\t\t/* TOOLTIPS */\r\n\t\t$('.tooltip').each(function(index, element) {\r\n        \t$(this).tooltipster({\r\n\t\t\tposition: $(this).attr('data-tooltip-pos'),\r\n\t\t\tfixedWidth : 300,\r\n\t\t\toffsetX : 8,\r\n\t\t\tanimation : \"grow\",\r\n\t\t\tdelay : 50\r\n\t\t\t});\r\n\t \r\n        });\t\r\n\t\t// ------------------------------\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t// ------------------------------\r\n\t\t// GOOGLE MAP\r\n\t\t/*\r\n\t\t\tcustom map with google api\r\n\t\t\tcheck out the link below for more information about api usage\r\n\t\t\thttps://developers.google.com/maps/documentation/javascript/examples/marker-simple\r\n\t\t*/\r\n\t\tfunction initializeMap() {\r\n\t\t\tif($('.map').length) {\r\n\t\t\t\tvar mapCanvas = $('#map-canvas');\r\n\t\t\t\tvar myLatlng = new google.maps.LatLng(mapCanvas.data(\"latitude\"),mapCanvas.data(\"longitude\"));\r\n\t\t\t\tvar mapOptions = {\r\n\t\t\t\t\tzoom: mapCanvas.data(\"zoom\"),\r\n\t\t\t\t\tcenter: myLatlng\r\n\t\t\t\t}\r\n\t\t\t\tvar map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);\r\n\t\t\t\t\r\n\t\t\t\tvar marker = new google.maps.Marker({\r\n\t\t\t\t  position: myLatlng,\r\n\t\t\t\t  map: map\r\n\t\t  \t});\r\n\t\t\t}\r\n\t\t  \r\n\t\t}\r\n\t\tgoogle.maps.event.addDomListener(window, 'load', initializeMap);\r\n\t\t// ------------------------------\r\n\t\t\r\n\t\t\r\n\t});\r\n\t// DOCUMENT READY\r\n\t\r\n\r\n\t\r\n\t// WINDOW ONLOAD\r\n\twindow.onload = function() {\r\n\r\n\t\t$('.container').css('visibility', 'visible');\r\n\t\twdtLoading.done();\r\n\r\n\t\tsetTimeout(function() {\r\n\t\t\tnoty({\r\n\t            text     : '<div><img width=\"100\" src=\"http://needim.github.io/noty/v2/images/projects/noty-v2-logo.png\" alt=\"noty\" style=\"float: right\"/> <strong>Hi!</strong> <br /> noty v2.3.0 released!</div>',\r\n\t            layout   : 'topRight',\r\n\t            type     : 'warning',\r\n\t            theme    : 'relax',\r\n\t            timeout  : 5000,\r\n\t            closeWith: ['click'],\r\n\t            animation   : {\r\n\t                open  : 'animated bounceInRight',\r\n\t                close : 'animated bounceOutRight'\r\n\t            }\r\n\t        });\r\n\t\t}, 2000);\r\n\t};\r\n\t// WINDOW ONLOAD\t\r\n\t\r\n\t\r\n\t\r\n\t// ------------------------------\r\n\t// ------------------------------\r\n\t\t// FUNCTIONS\r\n\t// ------------------------------\r\n\t// ------------------------------\r\n\t\r\n\t\r\n\t// ------------------------------\r\n\t// INITIALIZE\r\n\tvar inAnimation, outAnimation;\r\n\tfunction initialize() {\r\n\t\tinAnimation = $('html').attr('data-inAnimation');\r\n\t\toutAnimation = $('html').attr('data-outAnimation');\r\n\t}\r\n\t// ------------------------------\r\n\t\r\n\t\r\n\t// ------------------------------\r\n\t// SETUP : plugins\r\n\tfunction setup() {\r\n\t\t// ------------------------------\r\n\t\t// LIGHTBOX\r\n\t\tsetupLigtbox();\r\n\t\t// ------------------------------\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t// ------------------------------\r\n\t\t// CODE PRETTIFY\r\n\t\tif($('.prettyprint').length) {\r\n\t\t\twindow.prettyPrint && prettyPrint();\r\n\t\t}\r\n\t\t// ------------------------------\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t// ------------------------------\r\n\t\t// TABS\r\n\t\t$('.tabs').each(function() {\r\n\t\t\tif(!$(this).find('.tab-titles li a.active').length) {\r\n\t\t\t\t$(this).find('.tab-titles li:first-child a').addClass('active');\r\n\t\t\t\t$(this).find('.tab-content > div:first-child').show();\r\n\t\t\t} else {\r\n\t\t\t\t$(this).find('.tab-content > div').eq($(this).find('.tab-titles li a.active').parent().index()).show();\t\r\n\t\t\t}\r\n\t\t});\r\n\t\t\r\n\t\t$('.tabs .tab-titles li a').click(function() {\r\n\t\t\tif($(this).hasClass('active')) { return; }\r\n\t\t\t$(this).parent().siblings().find('a').removeClass('active');\r\n\t\t\t$(this).addClass('active');\r\n\t\t\t$(this).parents('.tabs').find('.tab-content > div').hide().eq($(this).parent().index()).show();\r\n\t\t\treturn false;\r\n\t\t});\r\n\t\t// ------------------------------\r\n\t\t\r\n\t\t\r\n\t\t// ------------------------------\r\n\t\t// TOGGLES\r\n\t\tvar toggleSpeed = 300;\r\n\t\t$('.toggle h4.active + .toggle-content').show();\r\n\t\r\n\t\t$('.toggle h4').click(function() {\r\n\t\t\tif($(this).hasClass('active')) { \r\n\t\t\t\t$(this).removeClass('active');\r\n\t\t\t\t$(this).next('.toggle-content').stop(true,true).slideUp(toggleSpeed);\r\n\t\t\t} else {\r\n\t\t\t\t\r\n\t\t\t\t$(this).addClass('active');\r\n\t\t\t\t$(this).next('.toggle-content').stop(true,true).slideDown(toggleSpeed);\r\n\t\t\t\t\r\n\t\t\t\t//accordion\r\n\t\t\t\tif($(this).parents('.toggle-group').hasClass('accordion')) {\r\n\t\t\t\t\t$(this).parent().siblings().find('h4').removeClass('active');\r\n\t\t\t\t\t$(this).parent().siblings().find('.toggle-content').stop(true,true).slideUp(toggleSpeed);\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t});\r\n\t\t// ------------------------------\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t// ------------------------------\r\n\t\t// RESPONSIVE VIDEOS\r\n\t\tif($('.media-wrap, .portfolio-single').length) {\r\n\t\t\t$(\".media-wrap, .portfolio-single\").fitVids();\r\n\t\t}\r\n\t\t// ------------------------------\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t// ------------------------------\r\n\t\t// UNIFORM\r\n\t\t$(\"select:not([multiple]), input:checkbox, input:radio, input:file\").uniform();\r\n\t\tvar ua = navigator.userAgent.toLowerCase();\r\n\t\tvar isAndroid = ua.indexOf(\"android\") > -1;\r\n\t\tif(isAndroid) {\r\n\t\t\t$('html').addClass('android');\r\n\t\t}\r\n\t\t// ------------------------------\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t// ------------------------------\r\n\t\t/* FLEX SLIDER */\r\n\t\t// cache container\r\n\t\tvar $flexslider = $('.flexslider');\r\n\t\tif($flexslider.length) {\r\n\t\t\t\r\n\t\t\t$flexslider.each(function() {\r\n\t\t\t\r\n\t\t\t\t//wait for images\r\n\t\t\t\t$(this).imagesLoaded(function() {\r\n\t\t\t\t\t\r\n\t\t\t\t\t//remove loading\r\n\t\t\t\t\t$(this).find('.loading').remove();\r\n\t\t\t\t\t\r\n\t\t\t\t\t//setup slider\r\n\t\t\t\t\t$(this).flexslider({ \r\n\t\t\t\t\t\tsmoothHeight: true,\r\n\t\t\t\t\t\tslideshow: $(this).attr('data-autoplay') != \"false\",\r\n\t\t\t\t\t\tslideshowSpeed: $(this).attr('data-interval'), \r\n\t\t\t\t\t\tanimationSpeed : $(this).attr('data-animationSpeed'),\r\n\t\t\t\t\t\tanimation: $(this).attr('data-animation'), \r\n\t\t\t\t\t\tdirection : $(this).attr('data-direction'),\r\n\t\t\t\t\t\tdirectionNav : $(this).attr('data-directionNav') != \"false\",\r\n\t\t\t\t\t\tcontrolNav : $(this).attr('data-controlNav') != \"false\",\r\n\t\t\t\t\t\trandomize : $(this).attr('data-randomize') == \"true\",\r\n\t\t\t\t\t\tstartAt : $(this).attr('data-startAt') != null ? parseInt($(this).attr('data-startAt')) : 0,\r\n\t\t\t\t\t\tanimationLoop : $(this).attr('data-animationLoop') != \"false\",\r\n\t\t\t\t\t\tpauseOnHover : $(this).attr('data-pauseOnHover') != \"false\",\r\n\t\t\t\t\t\treverse : $(this).attr('data-reverse') == \"true\",\r\n\t\t\t\t\t\tprevText: \"\",\r\n\t\t\t\t\t\tnextText: \"\",\r\n\t\t\t\t\t\tstart: function(slider) {\r\n\t\t\t\t\t\t\t\t$('.slides li img').click(function(event){\r\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\t\t\t\t\tslider.flexAnimate(slider.getTarget(\"next\"));\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\r\n\t\t\t\t});\r\n\t\t\t\r\n\t\t\t});\r\n\t\t}\r\n\t\t// ------------------------------\r\n\t\t\r\n\t\t\r\n\t\t// ------------------------------\r\n\t\t/* MEDIAELEMENT.JS - self hosted html5 video and audio player */\r\n\t\tif($('video,audio').length) {\r\n\t\t\t$('video,audio').mediaelementplayer({ audioHeight: 50 });\t\r\n\t\t}\r\n\t\t// ------------------------------\r\n\t}\r\n\t// ------------------------------\r\n\t\r\n\t\r\n\t\r\n\t// ------------------------------\r\n\t// CHANGE PAGE\r\n\tfunction setActivePage() {\r\n\t\t\r\n\t\t\t$('.page').removeClass('active').hide();\r\n\t\t\tvar path = $.address.path();\r\n\t\t\tpath = path.slice(1, path.length);\r\n\t\t\tpath = giveDetailUrl() != -1 ? portfolioKeyword : path;\r\n\t\t\tif(path == \"\") {  // if hash tag doesnt exists - go to first page\r\n\t\t\t\tvar firstPage = $('.vs-nav li').first().find('a').attr('href');\r\n\t\t\t\tpath = firstPage.slice(2,firstPage.length);\r\n\t\t\t\t$.address.path(path);\r\n\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\r\n\t\t\t// show page\r\n\t\t\t$('#'+ path).fadeIn();\r\n\t\t\t$('.page.active').hide();\r\n\t\t\t$('#'+ path).addClass('active');\r\n\t\t\tsetCurrentMenuItem();\r\n\t\t\t\r\n\t\t\tif(path.indexOf(portfolioKeyword) != -1) {\r\n\t\t\t\tsetTimeout(function() { setMasonry(); }, 100);\r\n\t\t\t} \r\n\t\t\t$(\"body\").scrollTop(0);\r\n\r\n\t}\t\r\n\t// ------------------------------\r\n\t\r\n\t\r\n\t// ------------------------------\r\n\t// PORTFOLIO MASONRY LAYOUT : change the number of masonry columns based on the current container's width\r\n\tfunction setMasonry() {\r\n\t\t\r\n\t\tvar itemPerRow = 4;\r\n\t\tvar containerW = $container.width();\r\n\t\tvar items = $container.children('.hentry');\r\n\t\tvar columns, columnWidth;\r\n\t\tvar viewports = [ {\r\n\t\t\t\twidth : 1300,\r\n\t\t\t\tcolumns : itemPerRow\r\n\t\t\t}, {\r\n\t\t\t\twidth : 900,\r\n\t\t\t\tcolumns : itemPerRow-1\r\n\t\t\t}, {\r\n\t\t\t\twidth : 480,\r\n\t\t\t\tcolumns : itemPerRow - 2\r\n\t\t\t}, { \r\n\t\t\t\twidth : 0,\r\n\t\t\t\tcolumns : itemPerRow - 3\r\n\t\t\t} ];\r\n\t\r\n\t\tfor( var i = 0, len = viewports.length; i < len; ++i ) {\r\n\t\r\n\t\t\tvar viewport = viewports[i];\r\n\t\r\n\t\t\tif( containerW > viewport.width ) {\r\n\t\r\n\t\t\t\tcolumns = viewport.columns;\r\n\t\t\t\tbreak;\r\n\t\r\n\t\t\t}\r\n\t\t}\r\n\t\r\n\t\t// set the widths (%) for each of item\r\n\t\titems.each(function(index, element) {\r\n\t\t\tvar multiplier = $(this).hasClass('x2') && columns > 1 ? 2 : 1;\r\n\t\t\tvar itemWidth = (Math.floor( containerW / columns ) * 100 / containerW) * multiplier ;\r\n\t\t\t$(this).css( 'width', itemWidth + '%' );\r\n\t\t});\r\n\t\r\n\t\tcolumnWidth = Math.floor( containerW / columns );\r\n\t\t$container.isotope( 'reLayout' ).isotope( 'option', { masonry: { columnWidth: columnWidth } } );\r\n\t\r\n\t}\r\n\t// ------------------------------\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t// ------------------------------\r\n\t// BLOG MASONRY LAYOUT : change the number of masonry columns based on the current container's width\r\n\tfunction setBlogMasonry() {\r\n\t\t\r\n\t\tvar itemPerRow = 4;\r\n\t\tvar containerW = $blog_container.width();\r\n\t\tvar items = $blog_container.children('.hentry');\r\n\t\tvar columns, columnWidth;\r\n\t\tvar viewports = [ {\r\n\t\t\t\twidth : 1300,\r\n\t\t\t\tcolumns : itemPerRow\r\n\t\t\t}, {\r\n\t\t\t\twidth : 900,\r\n\t\t\t\tcolumns : itemPerRow-1\r\n\t\t\t}, {\r\n\t\t\t\twidth : 480,\r\n\t\t\t\tcolumns : itemPerRow - 2\r\n\t\t\t}, { \r\n\t\t\t\twidth : 0,\r\n\t\t\t\tcolumns : itemPerRow - 3\r\n\t\t\t} ];\r\n\t\r\n\t\tfor( var i = 0, len = viewports.length; i < len; ++i ) {\r\n\t\r\n\t\t\tvar viewport = viewports[i];\r\n\t\r\n\t\t\tif( containerW > viewport.width ) {\r\n\t\r\n\t\t\t\tcolumns = viewport.columns;\r\n\t\t\t\tbreak;\r\n\t\r\n\t\t\t}\r\n\t\t}\r\n\t\r\n\t\t// set the widths (%) for each of item\r\n\t\titems.each(function(index, element) {\r\n\t\t\tvar multiplier = $(this).hasClass('x2') && columns > 1 ? 2 : 1;\r\n\t\t\tvar itemWidth = (Math.floor( containerW / columns ) * 100 / containerW) * multiplier ;\r\n\t\t\t$(this).css( 'width', itemWidth + '%' );\r\n\t\t});\r\n\t\r\n\t\tcolumnWidth = Math.floor( containerW / columns );\r\n\t\t$blog_container.isotope( 'reLayout' ).isotope( 'option', { masonry: { columnWidth: columnWidth } } );\r\n\t\r\n\t}\r\n\t// ------------------------------\r\n\t\r\n\t\r\n\t\r\n\t// ------------------------------\r\n\t// FILL PROGRESS BARS\r\n\tfunction fillBars() {\r\n\t\t$('.bar').each(function() {\r\n\t\t\t var bar = $(this);\r\n\t\t\t bar.find('.progress').css('width', bar.attr('data-percent') + '%' );\r\n\t\t\t});\r\n\t}\t\r\n\t// ------------------------------\t\r\n\t\r\n\t\r\n\t\r\n\t// ------------------------------\r\n\t// LIGHTBOX\r\n\tfunction setupLigtbox() {\r\n\t\t\r\n\t\t//html5 validate fix\r\n\t\t$('.lightbox').each(function(index, element) {\r\n\t\t\t$(this).attr('rel', $(this).attr('data-lightbox-gallery'));\r\n\t\t});\r\n\t\t\r\n\t\tif($(\"a[rel^='fancybox']\").length) {\r\n\t\t\t$(\"a[rel^='fancybox']\").fancybox({\r\n\t\t\t\tcenterOnScroll : true,\r\n\t\t\t\tpadding : 10,\r\n\t\t\t\tmargin : 44,\r\n\t\t\t\twidth : 640,\r\n\t\t\t\theight : 360,\r\n\t\t\t\ttransitionOut : 'none',\r\n\t\t\t\toverlayColor : '#BEBD97',\r\n\t\t\t\toverlayOpacity : '.6',\r\n\t\t\t\tonStart : function() {\r\n\t\t\t\t\t$( 'body' ).addClass( 'lightbox-active' );\r\n\t\t\t\t},\r\n\t\t\t\tonClosed : function() {\r\n\t\t\t\t\t$( 'body' ).removeClass( 'lightbox-active' );\r\n\t\t\t\t},\r\n\t\t\t\tonComplete : function() {\r\n\t\t\t\t\tif ($(this).attr('href').indexOf(\"soundcloud.com\") >= 0) {\r\n\t\t\t\t\t\t$('#fancybox-content').height(166);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\t\r\n\t}\r\n\t// ------------------------------\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t// ------------------------------\r\n\t// SET CURRENT MENU ITEM\r\n\tfunction setCurrentMenuItem() {\r\n\t\tvar activePageId = $('.page.active').attr('id');\r\n\t\t// set default nav menu\r\n\t\t$('.vs-nav a[href$=' + activePageId +']').parent().addClass('current_page_item').siblings().removeClass('current_page_item');\r\n\t}\t\r\n\t// ------------------------------\r\n\t\r\n\t\r\n\t// ------------------------------\r\n\t// AJAX PORTFOLIO DETAILS\r\n\tvar pActive;\r\n\t\r\n\tfunction showProjectDetails(url) {\r\n\t\t\r\n\t\tshowLoader();\r\n\t\t\r\n\t\tvar p = $('.p-overlay:not(.active)').first();\r\n\t\tpActive = $('.p-overlay.active');\r\n\t\t\r\n\t\tif(pActive.length) {\r\n\t\t\thideProjectDetails();\t  \r\n\t\t}\r\n\t\t\r\n\t\t// ajax : fill data\r\n\t\tp.empty().load(url + ' .portfolio-single', function() {\t\r\n\t\t\t// wait for images to be loaded\r\n\t\t\tp.imagesLoaded(function() {\r\n\t\t\t\t\r\n\t\t\t\thideLoader();\r\n\t\t\t\t\r\n\t\t\t\t$('html').addClass('p-overlay-on');\r\n\t\t\t\t\r\n\t\t\t\t$(\"body\").scrollTop(0);\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t// setup plugins\r\n\t\t\t\tsetup();\r\n\t\t\t\t\r\n\t\t\t\tif(Modernizr.csstransforms && Modernizr.csstransforms3d) { // modern browser\r\n\t\t\t\tp.removeClass('animated '+ outAnimation + \" \" + inAnimation ).addClass('animated '+ inAnimation).show();\r\n\t\t\t\t} else { //old browser\r\n\t\t\t\t\tp.fadeIn();\t\r\n\t\t\t\t}\r\n\t\t\t\tp.addClass('active');\r\n\t\t\t\t\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\t\r\n\tfunction hideProjectDetails(forever, safeClose) {\r\n\t\t\r\n\t\t$(\"body\").scrollTop(0);\r\n\t\t\r\n\t\t// close completely by back link.\r\n\t\tif(forever) {\r\n\t\t\tpActive = $('.p-overlay.active');\r\n\t\t\t\r\n\t\t\t$('html').removeClass('p-overlay-on');\r\n\t\t\t\r\n\t\t\tif(!safeClose) {\r\n\t\t\t\t// remove detail url\r\n\t\t\t\t$.address.path(portfolioKeyword);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tpActive.removeClass('active');\r\n\t\t\r\n\t\tif(Modernizr.csstransforms && Modernizr.csstransforms3d) { // modern browser\r\n\t\t\tpActive.removeClass('animated '+ inAnimation).addClass('animated '+ outAnimation);\r\n\t\t\tsetTimeout(function() { pActive.hide().removeClass(outAnimation).empty(); } ,1010)\r\n\t\t} else { //old browser\r\n\t\t\tpActive.fadeOut().empty();\t\r\n\t\t}\r\n\t}\r\n\t\r\n\tfunction giveDetailUrl() {\r\n\t\r\n\t\tvar address = $.address.value();\r\n\t\tvar detailUrl;\r\n\t\t\r\n\t\tif (address.indexOf(\"/\"+ portfolioKeyword + \"/\")!=-1 && address.length > portfolioKeyword.length + 2 ) {\r\n\t\t\tvar total = address.length;\r\n\t\t\tdetailUrl = address.slice(portfolioKeyword.length+2,total);\r\n\t\t} else {\r\n\t\t\tdetailUrl = -1;\t\r\n\t\t}\r\n\t\treturn detailUrl;\r\n\t}\r\n\t// ------------------------------\r\n\t\r\n\t// ------------------------------\r\n\t// AJAX LOADER\r\n\tfunction showLoader() {\r\n\t\t$('body').removeClass('loaded');\r\n\t}\r\n\tfunction hideLoader() {\r\n\t\t$('windo').addClass('loaded');\r\n\t}\r\n\t// ------------------------------\r\n\r\n})(jQuery);"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/.gitignore",
    "content": "child/\n\n.DS_Store\n\n.idea/\n\nnode_modules/\n_SpecRunner.html\n/.vscode/\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/Gruntfile.js",
    "content": "module.exports = function(grunt) {\n    grunt.initConfig({\n\n        bump  : {\n            options: {\n                files             : ['package.json', 'noty.jquery.json', 'js/noty/v2/jquery.noty.js'],\n                updateConfigs     : [],\n                commit            : false,\n                commitMessage     : 'Release v%VERSION%',\n                commitFiles       : ['-a'],\n                createTag         : false,\n                tagName           : 'v%VERSION%',\n                tagMessage        : 'Version %VERSION%',\n                push              : false,\n                pushTo            : 'upstream',\n                gitDescribeOptions: '--tags --always --abbrev=1 --dirty=-d'\n            }\n        },\n        concat: {\n            dist: {\n                src : ['js/noty/v2/jquery.noty.js', 'js/noty/v2/layouts/*.js', 'js/noty/v2/themes/*.js'],\n                dest: 'js/noty/packaged/jquery.noty.packaged.js'\n            }\n        },\n\n        wrap: {\n            basic: {\n                src: 'js/noty/packaged/jquery.noty.packaged.js',\n                dest: 'js/noty/packaged/jquery.noty.packaged.js',\n                options: {\n                    wrapper: [\"!function(root, factory) {\\n\\t if (typeof define === 'function' && define.amd) {\\n\\t\\t define(['jquery'], factory);\\n\\t } else if (typeof exports === 'object') {\\n\\t\\t module.exports = factory(require('jquery'));\\n\\t } else {\\n\\t\\t factory(root.jQuery);\\n\\t }\\n}(this, function($) {\\n\", \"\\nreturn window.noty;\\n\\n});\"]\n                }\n            }\n        },\n\n        uglify: {\n            //options : {\n            //    preserveComments: function(a) {\n            //        return !!(a.start.file == 'js/noty/v2/jquery.noty.js' && a.start.line == 11);\n            //    }\n            //},\n            minifyJS: {\n                files: {\n                    'js/noty/packaged/jquery.noty.packaged.min.js': ['js/noty/packaged/jquery.noty.packaged.js']\n                }\n            }\n        }\n    });\n\n    grunt.loadNpmTasks('grunt-contrib-uglify');\n    grunt.loadNpmTasks('grunt-contrib-concat');\n    grunt.loadNpmTasks('grunt-bump');\n    grunt.loadNpmTasks('grunt-wrap');\n\n    grunt.registerTask('build', ['bump', 'concat', 'wrap', 'uglify:minifyJS']);\n    grunt.registerTask('conc', ['concat', 'wrap']);\n    grunt.registerTask('ugly', ['uglify:minifyJS']);\n};\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/LICENSE.txt",
    "content": "Copyright (c) 2012 Nedim Arabacı\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."
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/README.markdown",
    "content": "# noty - A jQuery Notification Plugin\n\n![noty v2 logo](http://ned.im/noty/v2/img/projects/noty-v2-logo.png \"noty v2\")\n\n***\n Need some help on **push5** branch. Trying to implement html5 notifications with service worker support.\n***\n\n\n## Hi\n\n**noty** is a jQuery plugin that makes it easy to create **alert** - **success** - **error** - **warning** - **information** - **confirmation** messages as an alternative the standard alert dialog. Each notification is added to a **queue**. (**Optional**)\n\nThe notifications can be positioned at the;\n**top** - **topLeft** - **topCenter** - **topRight** - **center** - **centerLeft** - **centerRight** - **bottom** - **bottomLeft** - **bottomCenter** - **bottomRight**\n\nThere are lots of other options in the API to customise the text, animation, speed, buttons and much more.\n\nIt also has various callbacks for the buttons, opening closing the notifications and queue control.\n\n***\n\n### Documentation\n\nDocumentation and examples are here: <http://needim.github.io/noty>\n\n***\n\n### Pull Requests\n\n1. [Fork](http://help.github.com/fork-a-repo/) the project, clone your fork,\n   and configure the remotes:\n\n   ```bash\n   # Clone your fork of the repo into the current directory\n   git clone https://github.com/<your-username>/noty.git\n   # Navigate to the newly cloned directory\n   cd noty\n   # Assign the original repo to a remote called \"upstream\"\n   git remote add upstream https://github.com/needim/noty.git\n   ```\n\n2. If you cloned a while ago, get the latest changes from upstream:\n\n   ```bash\n   git checkout master\n   git pull upstream master\n   ```\n\n3. Create a new topic branch (off the main project development branch)\n   to contain your feature, change, or fix:\n\n   ```bash\n   git checkout -b <topic-branch-name>\n   ```\n\n4. Commit your changes in logical chunks. Please adhere to these [git commit\n   message guidelines](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)\n   or your code is unlikely be merged into the main project. Use Git's\n   [interactive rebase](https://help.github.com/articles/interactive-rebase)\n   feature to tidy up your commits before making them public.\n\n5. Locally merge (or rebase) the upstream master branch into your topic branch:\n\n   ```bash\n   git pull [--rebase] upstream master\n   ```\n\n6. Push your topic branch up to your fork:\n\n   ```bash\n   git push origin <topic-branch-name>\n   ```\n\n7. [Open a Pull Request](https://help.github.com/articles/using-pull-requests/)\n    with a clear title and description against the `master` branch.\n\n**IMPORTANT**: By submitting a patch, you agree to allow the project owners to\nlicense your work under the the terms of the [MIT License](LICENSE.txt).\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/bower.json",
    "content": "{\n    \"name\"       : \"noty\",\n    \"main\"       : \"js/noty/packaged/jquery.noty.packaged.js\",\n    \"ignore\"     : [],\n    \"authors\"    : [\n        \"Nedim Arabacı\"\n    ],\n    \"description\": \"noty - a jQuery notification plugin\"\n}\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/composer.json",
    "content": "{\n\t\"name\": \"needim/noty\",\n\t\"description\": \"noty is a jQuery plugin that makes it easy to create alert - success - error - warning - information - confirmation messages as an alternative the standard alert dialog.\",\n\t\"type\": \"library\",\n\t\"license\": \"MIT\",\n\t\"homepage\": \"https://github.com/needim/noty\",\n\t\"keywords\": [\n\t\t\"noty\",\n\t\t\"notification\"\n\t],\n\t\"authors\": [\n\t\t{\n\t\t\t\"name\": \"Nedim Arabaci\",\n\t\t\t\"homepage\": \"https://github.com/needim\",\n\t\t\t\"role\": \"Developer\"\n\t\t}\n\t],\n\t\"minimum-stability\": \"dev\",\n\t\"suggest\": {\n\t\t\"components/jquery\": \">=1.8\",\n\t\t\"twbs/bootstrap\": \"~3.0.0\"\n\t}\n}\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/demo/allLayouts.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta charset=\"utf-8\">\n    <title>Notification Layouts</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"demonstration of some noty capabilities\">\n\n    <link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic&amp;subset=latin,latin-ext,cyrillic' rel='stylesheet' type='text/css'>\n    <style type=\"text/css\">\n\n        html {\n            height: 100%;\n            width: 100%;\n        }\n\n        body {\n            font-family: 'PT Sans', Tahoma, Arial, serif;\n            line-height: 13px\n        }\n\n    </style>\n\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"buttons.css\"/>\n\n</head>\n<body>\n\n<div class=\"container\">\n\n    <div id=\"customContainer\"></div>\n\n</div>\n\n<script src=\"jquery-1.7.2.min.js\"></script>\n\n<!-- noty -->\n<script type=\"text/javascript\" src=\"../js/noty/packaged/jquery.noty.packaged.js\"></script>\n\n<script type=\"text/javascript\">\n\n    function generate(layout) {\n        var n = noty({\n            text        : layout,\n            type        : 'alert',\n            dismissQueue: true,\n            layout      : layout,\n            theme       : 'relax'\n        });\n        console.log('html: ' + n.options.id);\n    }\n\n    function generateAll() {\n        generate('top');\n        generate('topCenter');\n        generate('topLeft');\n        generate('topRight');\n        generate('center');\n        generate('centerLeft');\n        generate('centerRight');\n        generate('bottom');\n        generate('bottomCenter');\n        generate('bottomLeft');\n        generate('bottomRight');\n    }\n\n    $(document).ready(function () {\n\n        generateAll();\n\n    });\n\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/demo/allTypes.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta charset=\"utf-8\">\n    <title>Notification Types</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"demonstration of some noty capabilities\">\n\n    <link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic&amp;subset=latin,latin-ext,cyrillic' rel='stylesheet' type='text/css'>\n    <style type=\"text/css\">\n\n        html {\n            height: 100%;\n            width: 100%;\n        }\n\n        body {\n            font-family: 'PT Sans', Tahoma, Arial, serif;\n            line-height: 13px\n        }\n\n    </style>\n\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"buttons.css\"/>\n\n</head>\n<body>\n\n<div class=\"container\">\n\n    <div id=\"customContainer\"></div>\n\n</div>\n\n\n<script src=\"jquery-1.8.0.js\"></script>\n\n<!-- noty -->\n<script type=\"text/javascript\" src=\"../js/noty/packaged/jquery.noty.packaged.js\"></script>\n\n<script type=\"text/javascript\">\n\n    function generate(type) {\n        var n = noty({\n            text        : type,\n            type        : type,\n            dismissQueue: true,\n            timeout     : 10000,\n            closeWith   : ['click'],\n            layout      : 'topCenter',\n            theme       : 'relax',\n            maxVisible  : 10\n        });\n        console.log('html: ' + n.options.id);\n    }\n\n    function generateAll() {\n        generate('alert');\n        generate('information');\n        generate('error');\n        generate('warning');\n        generate('notification');\n        generate('success');\n    }\n\n    $(document).ready(function () {\n\n        generateAll();\n\n    });\n\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/demo/animate.css",
    "content": "@charset \"UTF-8\";\n/*!\nAnimate.css - http://daneden.me/animate\nLicensed under the MIT license - http://opensource.org/licenses/MIT\n\nCopyright (c) 2014 Daniel Eden\n*/\n\n.animated {\n  -webkit-animation-duration: 1s;\n          animation-duration: 1s;\n  -webkit-animation-fill-mode: both;\n          animation-fill-mode: both;\n}\n\n.animated.infinite {\n  -webkit-animation-iteration-count: infinite;\n          animation-iteration-count: infinite;\n}\n\n.animated.hinge {\n  -webkit-animation-duration: 2s;\n          animation-duration: 2s;\n}\n\n@-webkit-keyframes bounce {\n  0%, 20%, 53%, 80%, 100% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n            transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    -webkit-transform: translate3d(0,0,0);\n            transform: translate3d(0,0,0);\n  }\n\n  40%, 43% {\n    -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n            transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n    -webkit-transform: translate3d(0, -30px, 0);\n            transform: translate3d(0, -30px, 0);\n  }\n\n  70% {\n    -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n            transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n    -webkit-transform: translate3d(0, -15px, 0);\n            transform: translate3d(0, -15px, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(0,-4px,0);\n            transform: translate3d(0,-4px,0);\n  }\n}\n\n@keyframes bounce {\n  0%, 20%, 53%, 80%, 100% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n            transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n    -webkit-transform: translate3d(0,0,0);\n            transform: translate3d(0,0,0);\n  }\n\n  40%, 43% {\n    -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n            transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n    -webkit-transform: translate3d(0, -30px, 0);\n            transform: translate3d(0, -30px, 0);\n  }\n\n  70% {\n    -webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n            transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);\n    -webkit-transform: translate3d(0, -15px, 0);\n            transform: translate3d(0, -15px, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(0,-4px,0);\n            transform: translate3d(0,-4px,0);\n  }\n}\n\n.bounce {\n  -webkit-animation-name: bounce;\n          animation-name: bounce;\n  -webkit-transform-origin: center bottom;\n      -ms-transform-origin: center bottom;\n          transform-origin: center bottom;\n}\n\n@-webkit-keyframes flash {\n  0%, 50%, 100% {\n    opacity: 1;\n  }\n\n  25%, 75% {\n    opacity: 0;\n  }\n}\n\n@keyframes flash {\n  0%, 50%, 100% {\n    opacity: 1;\n  }\n\n  25%, 75% {\n    opacity: 0;\n  }\n}\n\n.flash {\n  -webkit-animation-name: flash;\n          animation-name: flash;\n}\n\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n\n@-webkit-keyframes pulse {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n            transform: scale3d(1, 1, 1);\n  }\n\n  50% {\n    -webkit-transform: scale3d(1.05, 1.05, 1.05);\n            transform: scale3d(1.05, 1.05, 1.05);\n  }\n\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n            transform: scale3d(1, 1, 1);\n  }\n}\n\n@keyframes pulse {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n            transform: scale3d(1, 1, 1);\n  }\n\n  50% {\n    -webkit-transform: scale3d(1.05, 1.05, 1.05);\n            transform: scale3d(1.05, 1.05, 1.05);\n  }\n\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n            transform: scale3d(1, 1, 1);\n  }\n}\n\n.pulse {\n  -webkit-animation-name: pulse;\n          animation-name: pulse;\n}\n\n@-webkit-keyframes rubberBand {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n            transform: scale3d(1, 1, 1);\n  }\n\n  30% {\n    -webkit-transform: scale3d(1.25, 0.75, 1);\n            transform: scale3d(1.25, 0.75, 1);\n  }\n\n  40% {\n    -webkit-transform: scale3d(0.75, 1.25, 1);\n            transform: scale3d(0.75, 1.25, 1);\n  }\n\n  50% {\n    -webkit-transform: scale3d(1.15, 0.85, 1);\n            transform: scale3d(1.15, 0.85, 1);\n  }\n\n  65% {\n    -webkit-transform: scale3d(.95, 1.05, 1);\n            transform: scale3d(.95, 1.05, 1);\n  }\n\n  75% {\n    -webkit-transform: scale3d(1.05, .95, 1);\n            transform: scale3d(1.05, .95, 1);\n  }\n\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n            transform: scale3d(1, 1, 1);\n  }\n}\n\n@keyframes rubberBand {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n            transform: scale3d(1, 1, 1);\n  }\n\n  30% {\n    -webkit-transform: scale3d(1.25, 0.75, 1);\n            transform: scale3d(1.25, 0.75, 1);\n  }\n\n  40% {\n    -webkit-transform: scale3d(0.75, 1.25, 1);\n            transform: scale3d(0.75, 1.25, 1);\n  }\n\n  50% {\n    -webkit-transform: scale3d(1.15, 0.85, 1);\n            transform: scale3d(1.15, 0.85, 1);\n  }\n\n  65% {\n    -webkit-transform: scale3d(.95, 1.05, 1);\n            transform: scale3d(.95, 1.05, 1);\n  }\n\n  75% {\n    -webkit-transform: scale3d(1.05, .95, 1);\n            transform: scale3d(1.05, .95, 1);\n  }\n\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n            transform: scale3d(1, 1, 1);\n  }\n}\n\n.rubberBand {\n  -webkit-animation-name: rubberBand;\n          animation-name: rubberBand;\n}\n\n@-webkit-keyframes shake {\n  0%, 100% {\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0);\n  }\n\n  10%, 30%, 50%, 70%, 90% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n            transform: translate3d(-10px, 0, 0);\n  }\n\n  20%, 40%, 60%, 80% {\n    -webkit-transform: translate3d(10px, 0, 0);\n            transform: translate3d(10px, 0, 0);\n  }\n}\n\n@keyframes shake {\n  0%, 100% {\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0);\n  }\n\n  10%, 30%, 50%, 70%, 90% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n            transform: translate3d(-10px, 0, 0);\n  }\n\n  20%, 40%, 60%, 80% {\n    -webkit-transform: translate3d(10px, 0, 0);\n            transform: translate3d(10px, 0, 0);\n  }\n}\n\n.shake {\n  -webkit-animation-name: shake;\n          animation-name: shake;\n}\n\n@-webkit-keyframes swing {\n  20% {\n    -webkit-transform: rotate3d(0, 0, 1, 15deg);\n            transform: rotate3d(0, 0, 1, 15deg);\n  }\n\n  40% {\n    -webkit-transform: rotate3d(0, 0, 1, -10deg);\n            transform: rotate3d(0, 0, 1, -10deg);\n  }\n\n  60% {\n    -webkit-transform: rotate3d(0, 0, 1, 5deg);\n            transform: rotate3d(0, 0, 1, 5deg);\n  }\n\n  80% {\n    -webkit-transform: rotate3d(0, 0, 1, -5deg);\n            transform: rotate3d(0, 0, 1, -5deg);\n  }\n\n  100% {\n    -webkit-transform: rotate3d(0, 0, 1, 0deg);\n            transform: rotate3d(0, 0, 1, 0deg);\n  }\n}\n\n@keyframes swing {\n  20% {\n    -webkit-transform: rotate3d(0, 0, 1, 15deg);\n            transform: rotate3d(0, 0, 1, 15deg);\n  }\n\n  40% {\n    -webkit-transform: rotate3d(0, 0, 1, -10deg);\n            transform: rotate3d(0, 0, 1, -10deg);\n  }\n\n  60% {\n    -webkit-transform: rotate3d(0, 0, 1, 5deg);\n            transform: rotate3d(0, 0, 1, 5deg);\n  }\n\n  80% {\n    -webkit-transform: rotate3d(0, 0, 1, -5deg);\n            transform: rotate3d(0, 0, 1, -5deg);\n  }\n\n  100% {\n    -webkit-transform: rotate3d(0, 0, 1, 0deg);\n            transform: rotate3d(0, 0, 1, 0deg);\n  }\n}\n\n.swing {\n  -webkit-transform-origin: top center;\n      -ms-transform-origin: top center;\n          transform-origin: top center;\n  -webkit-animation-name: swing;\n          animation-name: swing;\n}\n\n@-webkit-keyframes tada {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n            transform: scale3d(1, 1, 1);\n  }\n\n  10%, 20% {\n    -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);\n            transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);\n  }\n\n  30%, 50%, 70%, 90% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n            transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n  }\n\n  40%, 60%, 80% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n            transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n  }\n\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n            transform: scale3d(1, 1, 1);\n  }\n}\n\n@keyframes tada {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n            transform: scale3d(1, 1, 1);\n  }\n\n  10%, 20% {\n    -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);\n            transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);\n  }\n\n  30%, 50%, 70%, 90% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n            transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n  }\n\n  40%, 60%, 80% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n            transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n  }\n\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n            transform: scale3d(1, 1, 1);\n  }\n}\n\n.tada {\n  -webkit-animation-name: tada;\n          animation-name: tada;\n}\n\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n\n@-webkit-keyframes wobble {\n  0% {\n    -webkit-transform: none;\n            transform: none;\n  }\n\n  15% {\n    -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n            transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n  }\n\n  30% {\n    -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n            transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n  }\n\n  45% {\n    -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n            transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n  }\n\n  60% {\n    -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n            transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n  }\n\n  75% {\n    -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n            transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n  }\n\n  100% {\n    -webkit-transform: none;\n            transform: none;\n  }\n}\n\n@keyframes wobble {\n  0% {\n    -webkit-transform: none;\n            transform: none;\n  }\n\n  15% {\n    -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n            transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n  }\n\n  30% {\n    -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n            transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n  }\n\n  45% {\n    -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n            transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n  }\n\n  60% {\n    -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n            transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n  }\n\n  75% {\n    -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n            transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n  }\n\n  100% {\n    -webkit-transform: none;\n            transform: none;\n  }\n}\n\n.wobble {\n  -webkit-animation-name: wobble;\n          animation-name: wobble;\n}\n\n@-webkit-keyframes bounceIn {\n  0%, 20%, 40%, 60%, 80%, 100% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n            transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(.3, .3, .3);\n            transform: scale3d(.3, .3, .3);\n  }\n\n  20% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n            transform: scale3d(1.1, 1.1, 1.1);\n  }\n\n  40% {\n    -webkit-transform: scale3d(.9, .9, .9);\n            transform: scale3d(.9, .9, .9);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.03, 1.03, 1.03);\n            transform: scale3d(1.03, 1.03, 1.03);\n  }\n\n  80% {\n    -webkit-transform: scale3d(.97, .97, .97);\n            transform: scale3d(.97, .97, .97);\n  }\n\n  100% {\n    opacity: 1;\n    -webkit-transform: scale3d(1, 1, 1);\n            transform: scale3d(1, 1, 1);\n  }\n}\n\n@keyframes bounceIn {\n  0%, 20%, 40%, 60%, 80%, 100% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n            transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(.3, .3, .3);\n            transform: scale3d(.3, .3, .3);\n  }\n\n  20% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n            transform: scale3d(1.1, 1.1, 1.1);\n  }\n\n  40% {\n    -webkit-transform: scale3d(.9, .9, .9);\n            transform: scale3d(.9, .9, .9);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.03, 1.03, 1.03);\n            transform: scale3d(1.03, 1.03, 1.03);\n  }\n\n  80% {\n    -webkit-transform: scale3d(.97, .97, .97);\n            transform: scale3d(.97, .97, .97);\n  }\n\n  100% {\n    opacity: 1;\n    -webkit-transform: scale3d(1, 1, 1);\n            transform: scale3d(1, 1, 1);\n  }\n}\n\n.bounceIn {\n  -webkit-animation-name: bounceIn;\n          animation-name: bounceIn;\n  -webkit-animation-duration: .75s;\n          animation-duration: .75s;\n}\n\n@-webkit-keyframes bounceInDown {\n  0%, 60%, 75%, 90%, 100% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n            transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -3000px, 0);\n            transform: translate3d(0, -3000px, 0);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 25px, 0);\n            transform: translate3d(0, 25px, 0);\n  }\n\n  75% {\n    -webkit-transform: translate3d(0, -10px, 0);\n            transform: translate3d(0, -10px, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(0, 5px, 0);\n            transform: translate3d(0, 5px, 0);\n  }\n\n  100% {\n    -webkit-transform: none;\n            transform: none;\n  }\n}\n\n@keyframes bounceInDown {\n  0%, 60%, 75%, 90%, 100% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n            transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -3000px, 0);\n            transform: translate3d(0, -3000px, 0);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 25px, 0);\n            transform: translate3d(0, 25px, 0);\n  }\n\n  75% {\n    -webkit-transform: translate3d(0, -10px, 0);\n            transform: translate3d(0, -10px, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(0, 5px, 0);\n            transform: translate3d(0, 5px, 0);\n  }\n\n  100% {\n    -webkit-transform: none;\n            transform: none;\n  }\n}\n\n.bounceInDown {\n  -webkit-animation-name: bounceInDown;\n          animation-name: bounceInDown;\n}\n\n@-webkit-keyframes bounceInLeft {\n  0%, 60%, 75%, 90%, 100% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n            transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-3000px, 0, 0);\n            transform: translate3d(-3000px, 0, 0);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(25px, 0, 0);\n            transform: translate3d(25px, 0, 0);\n  }\n\n  75% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n            transform: translate3d(-10px, 0, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(5px, 0, 0);\n            transform: translate3d(5px, 0, 0);\n  }\n\n  100% {\n    -webkit-transform: none;\n            transform: none;\n  }\n}\n\n@keyframes bounceInLeft {\n  0%, 60%, 75%, 90%, 100% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n            transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-3000px, 0, 0);\n            transform: translate3d(-3000px, 0, 0);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(25px, 0, 0);\n            transform: translate3d(25px, 0, 0);\n  }\n\n  75% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n            transform: translate3d(-10px, 0, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(5px, 0, 0);\n            transform: translate3d(5px, 0, 0);\n  }\n\n  100% {\n    -webkit-transform: none;\n            transform: none;\n  }\n}\n\n.bounceInLeft {\n  -webkit-animation-name: bounceInLeft;\n          animation-name: bounceInLeft;\n}\n\n@-webkit-keyframes bounceInRight {\n  0%, 60%, 75%, 90%, 100% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n            transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(3000px, 0, 0);\n            transform: translate3d(3000px, 0, 0);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(-25px, 0, 0);\n            transform: translate3d(-25px, 0, 0);\n  }\n\n  75% {\n    -webkit-transform: translate3d(10px, 0, 0);\n            transform: translate3d(10px, 0, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(-5px, 0, 0);\n            transform: translate3d(-5px, 0, 0);\n  }\n\n  100% {\n    -webkit-transform: none;\n            transform: none;\n  }\n}\n\n@keyframes bounceInRight {\n  0%, 60%, 75%, 90%, 100% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n            transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(3000px, 0, 0);\n            transform: translate3d(3000px, 0, 0);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(-25px, 0, 0);\n            transform: translate3d(-25px, 0, 0);\n  }\n\n  75% {\n    -webkit-transform: translate3d(10px, 0, 0);\n            transform: translate3d(10px, 0, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(-5px, 0, 0);\n            transform: translate3d(-5px, 0, 0);\n  }\n\n  100% {\n    -webkit-transform: none;\n            transform: none;\n  }\n}\n\n.bounceInRight {\n  -webkit-animation-name: bounceInRight;\n          animation-name: bounceInRight;\n}\n\n@-webkit-keyframes bounceInUp {\n  0%, 60%, 75%, 90%, 100% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n            transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 3000px, 0);\n            transform: translate3d(0, 3000px, 0);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n            transform: translate3d(0, -20px, 0);\n  }\n\n  75% {\n    -webkit-transform: translate3d(0, 10px, 0);\n            transform: translate3d(0, 10px, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(0, -5px, 0);\n            transform: translate3d(0, -5px, 0);\n  }\n\n  100% {\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0);\n  }\n}\n\n@keyframes bounceInUp {\n  0%, 60%, 75%, 90%, 100% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n            transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);\n  }\n\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 3000px, 0);\n            transform: translate3d(0, 3000px, 0);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n            transform: translate3d(0, -20px, 0);\n  }\n\n  75% {\n    -webkit-transform: translate3d(0, 10px, 0);\n            transform: translate3d(0, 10px, 0);\n  }\n\n  90% {\n    -webkit-transform: translate3d(0, -5px, 0);\n            transform: translate3d(0, -5px, 0);\n  }\n\n  100% {\n    -webkit-transform: translate3d(0, 0, 0);\n            transform: translate3d(0, 0, 0);\n  }\n}\n\n.bounceInUp {\n  -webkit-animation-name: bounceInUp;\n          animation-name: bounceInUp;\n}\n\n@-webkit-keyframes bounceOut {\n  20% {\n    -webkit-transform: scale3d(.9, .9, .9);\n            transform: scale3d(.9, .9, .9);\n  }\n\n  50%, 55% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n            transform: scale3d(1.1, 1.1, 1.1);\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(.3, .3, .3);\n            transform: scale3d(.3, .3, .3);\n  }\n}\n\n@keyframes bounceOut {\n  20% {\n    -webkit-transform: scale3d(.9, .9, .9);\n            transform: scale3d(.9, .9, .9);\n  }\n\n  50%, 55% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n            transform: scale3d(1.1, 1.1, 1.1);\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(.3, .3, .3);\n            transform: scale3d(.3, .3, .3);\n  }\n}\n\n.bounceOut {\n  -webkit-animation-name: bounceOut;\n          animation-name: bounceOut;\n  -webkit-animation-duration: .75s;\n          animation-duration: .75s;\n}\n\n@-webkit-keyframes bounceOutDown {\n  20% {\n    -webkit-transform: translate3d(0, 10px, 0);\n            transform: translate3d(0, 10px, 0);\n  }\n\n  40%, 45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n            transform: translate3d(0, -20px, 0);\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n            transform: translate3d(0, 2000px, 0);\n  }\n}\n\n@keyframes bounceOutDown {\n  20% {\n    -webkit-transform: translate3d(0, 10px, 0);\n            transform: translate3d(0, 10px, 0);\n  }\n\n  40%, 45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n            transform: translate3d(0, -20px, 0);\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n            transform: translate3d(0, 2000px, 0);\n  }\n}\n\n.bounceOutDown {\n  -webkit-animation-name: bounceOutDown;\n          animation-name: bounceOutDown;\n}\n\n@-webkit-keyframes bounceOutLeft {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(20px, 0, 0);\n            transform: translate3d(20px, 0, 0);\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n            transform: translate3d(-2000px, 0, 0);\n  }\n}\n\n@keyframes bounceOutLeft {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(20px, 0, 0);\n            transform: translate3d(20px, 0, 0);\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n            transform: translate3d(-2000px, 0, 0);\n  }\n}\n\n.bounceOutLeft {\n  -webkit-animation-name: bounceOutLeft;\n          animation-name: bounceOutLeft;\n}\n\n@-webkit-keyframes bounceOutRight {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(-20px, 0, 0);\n            transform: translate3d(-20px, 0, 0);\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n            transform: translate3d(2000px, 0, 0);\n  }\n}\n\n@keyframes bounceOutRight {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(-20px, 0, 0);\n            transform: translate3d(-20px, 0, 0);\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n            transform: translate3d(2000px, 0, 0);\n  }\n}\n\n.bounceOutRight {\n  -webkit-animation-name: bounceOutRight;\n          animation-name: bounceOutRight;\n}\n\n@-webkit-keyframes bounceOutUp {\n  20% {\n    -webkit-transform: translate3d(0, -10px, 0);\n            transform: translate3d(0, -10px, 0);\n  }\n\n  40%, 45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 20px, 0);\n            transform: translate3d(0, 20px, 0);\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n            transform: translate3d(0, -2000px, 0);\n  }\n}\n\n@keyframes bounceOutUp {\n  20% {\n    -webkit-transform: translate3d(0, -10px, 0);\n            transform: translate3d(0, -10px, 0);\n  }\n\n  40%, 45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 20px, 0);\n            transform: translate3d(0, 20px, 0);\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n            transform: translate3d(0, -2000px, 0);\n  }\n}\n\n.bounceOutUp {\n  -webkit-animation-name: bounceOutUp;\n          animation-name: bounceOutUp;\n}\n\n@-webkit-keyframes fadeIn {\n  0% {opacity: 0;}\n  100% {opacity: 1;}\n}\n\n@keyframes fadeIn {\n  0% {opacity: 0;}\n  100% {opacity: 1;}\n}\n\n.fadeIn {\n  -webkit-animation-name: fadeIn;\n          animation-name: fadeIn;\n}\n\n@-webkit-keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n            transform: translate3d(0, -100%, 0);\n  }\n\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n            transform: none;\n  }\n}\n\n@keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n            transform: translate3d(0, -100%, 0);\n  }\n\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n            transform: none;\n  }\n}\n\n.fadeInDown {\n  -webkit-animation-name: fadeInDown;\n          animation-name: fadeInDown;\n}\n\n@-webkit-keyframes fadeInDownBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n            transform: translate3d(0, -2000px, 0);\n  }\n\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n            transform: none;\n  }\n}\n\n@keyframes fadeInDownBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n            transform: translate3d(0, -2000px, 0);\n  }\n\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n            transform: none;\n  }\n}\n\n.fadeInDownBig {\n  -webkit-animation-name: fadeInDownBig;\n          animation-name: fadeInDownBig;\n}\n\n@-webkit-keyframes fadeInLeft {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n            transform: translate3d(-100%, 0, 0);\n  }\n\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n            transform: none;\n  }\n}\n\n@keyframes fadeInLeft {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n            transform: translate3d(-100%, 0, 0);\n  }\n\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n            transform: none;\n  }\n}\n\n.fadeInLeft {\n  -webkit-animation-name: fadeInLeft;\n          animation-name: fadeInLeft;\n}\n\n@-webkit-keyframes fadeInLeftBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n            transform: translate3d(-2000px, 0, 0);\n  }\n\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n            transform: none;\n  }\n}\n\n@keyframes fadeInLeftBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n            transform: translate3d(-2000px, 0, 0);\n  }\n\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n            transform: none;\n  }\n}\n\n.fadeInLeftBig {\n  -webkit-animation-name: fadeInLeftBig;\n          animation-name: fadeInLeftBig;\n}\n\n@-webkit-keyframes fadeInRight {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n            transform: translate3d(100%, 0, 0);\n  }\n\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n            transform: none;\n  }\n}\n\n@keyframes fadeInRight {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n            transform: translate3d(100%, 0, 0);\n  }\n\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n            transform: none;\n  }\n}\n\n.fadeInRight {\n  -webkit-animation-name: fadeInRight;\n          animation-name: fadeInRight;\n}\n\n@-webkit-keyframes fadeInRightBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n            transform: translate3d(2000px, 0, 0);\n  }\n\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n            transform: none;\n  }\n}\n\n@keyframes fadeInRightBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n            transform: translate3d(2000px, 0, 0);\n  }\n\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n            transform: none;\n  }\n}\n\n.fadeInRightBig {\n  -webkit-animation-name: fadeInRightBig;\n          animation-name: fadeInRightBig;\n}\n\n@-webkit-keyframes fadeInUp {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n            transform: translate3d(0, 100%, 0);\n  }\n\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n            transform: none;\n  }\n}\n\n@keyframes fadeInUp {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n            transform: translate3d(0, 100%, 0);\n  }\n\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n            transform: none;\n  }\n}\n\n.fadeInUp {\n  -webkit-animation-name: fadeInUp;\n          animation-name: fadeInUp;\n}\n\n@-webkit-keyframes fadeInUpBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n            transform: translate3d(0, 2000px, 0);\n  }\n\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n            transform: none;\n  }\n}\n\n@keyframes fadeInUpBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n            transform: translate3d(0, 2000px, 0);\n  }\n\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n            transform: none;\n  }\n}\n\n.fadeInUpBig {\n  -webkit-animation-name: fadeInUpBig;\n          animation-name: fadeInUpBig;\n}\n\n@-webkit-keyframes fadeOut {\n  0% {opacity: 1;}\n  100% {opacity: 0;}\n}\n\n@keyframes fadeOut {\n  0% {opacity: 1;}\n  100% {opacity: 0;}\n}\n\n.fadeOut {\n  -webkit-animation-name: fadeOut;\n          animation-name: fadeOut;\n}\n\n@-webkit-keyframes fadeOutDown {\n  0% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n            transform: translate3d(0, 100%, 0);\n  }\n}\n\n@keyframes fadeOutDown {\n  0% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n            transform: translate3d(0, 100%, 0);\n  }\n}\n\n.fadeOutDown {\n  -webkit-animation-name: fadeOutDown;\n          animation-name: fadeOutDown;\n}\n\n@-webkit-keyframes fadeOutDownBig {\n  0% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n            transform: translate3d(0, 2000px, 0);\n  }\n}\n\n@keyframes fadeOutDownBig {\n  0% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n            transform: translate3d(0, 2000px, 0);\n  }\n}\n\n.fadeOutDownBig {\n  -webkit-animation-name: fadeOutDownBig;\n          animation-name: fadeOutDownBig;\n}\n\n@-webkit-keyframes fadeOutLeft {\n  0% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n            transform: translate3d(-100%, 0, 0);\n  }\n}\n\n@keyframes fadeOutLeft {\n  0% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n            transform: translate3d(-100%, 0, 0);\n  }\n}\n\n.fadeOutLeft {\n  -webkit-animation-name: fadeOutLeft;\n          animation-name: fadeOutLeft;\n}\n\n@-webkit-keyframes fadeOutLeftBig {\n  0% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n            transform: translate3d(-2000px, 0, 0);\n  }\n}\n\n@keyframes fadeOutLeftBig {\n  0% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n            transform: translate3d(-2000px, 0, 0);\n  }\n}\n\n.fadeOutLeftBig {\n  -webkit-animation-name: fadeOutLeftBig;\n          animation-name: fadeOutLeftBig;\n}\n\n@-webkit-keyframes fadeOutRight {\n  0% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n            transform: translate3d(100%, 0, 0);\n  }\n}\n\n@keyframes fadeOutRight {\n  0% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n            transform: translate3d(100%, 0, 0);\n  }\n}\n\n.fadeOutRight {\n  -webkit-animation-name: fadeOutRight;\n          animation-name: fadeOutRight;\n}\n\n@-webkit-keyframes fadeOutRightBig {\n  0% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n            transform: translate3d(2000px, 0, 0);\n  }\n}\n\n@keyframes fadeOutRightBig {\n  0% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n            transform: translate3d(2000px, 0, 0);\n  }\n}\n\n.fadeOutRightBig {\n  -webkit-animation-name: fadeOutRightBig;\n          animation-name: fadeOutRightBig;\n}\n\n@-webkit-keyframes fadeOutUp {\n  0% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n            transform: translate3d(0, -100%, 0);\n  }\n}\n\n@keyframes fadeOutUp {\n  0% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n            transform: translate3d(0, -100%, 0);\n  }\n}\n\n.fadeOutUp {\n  -webkit-animation-name: fadeOutUp;\n          animation-name: fadeOutUp;\n}\n\n@-webkit-keyframes fadeOutUpBig {\n  0% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n            transform: translate3d(0, -2000px, 0);\n  }\n}\n\n@keyframes fadeOutUpBig {\n  0% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n            transform: translate3d(0, -2000px, 0);\n  }\n}\n\n.fadeOutUpBig {\n  -webkit-animation-name: fadeOutUpBig;\n          animation-name: fadeOutUpBig;\n}\n\n@-webkit-keyframes flip {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n            transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    -webkit-animation-timing-function: ease-out;\n            animation-timing-function: ease-out;\n  }\n\n  40% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n            transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    -webkit-animation-timing-function: ease-out;\n            animation-timing-function: ease-out;\n  }\n\n  50% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n            transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    -webkit-animation-timing-function: ease-in;\n            animation-timing-function: ease-in;\n  }\n\n  80% {\n    -webkit-transform: perspective(400px) scale3d(.95, .95, .95);\n            transform: perspective(400px) scale3d(.95, .95, .95);\n    -webkit-animation-timing-function: ease-in;\n            animation-timing-function: ease-in;\n  }\n\n  100% {\n    -webkit-transform: perspective(400px);\n            transform: perspective(400px);\n    -webkit-animation-timing-function: ease-in;\n            animation-timing-function: ease-in;\n  }\n}\n\n@keyframes flip {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n            transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    -webkit-animation-timing-function: ease-out;\n            animation-timing-function: ease-out;\n  }\n\n  40% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n            transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    -webkit-animation-timing-function: ease-out;\n            animation-timing-function: ease-out;\n  }\n\n  50% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n            transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    -webkit-animation-timing-function: ease-in;\n            animation-timing-function: ease-in;\n  }\n\n  80% {\n    -webkit-transform: perspective(400px) scale3d(.95, .95, .95);\n            transform: perspective(400px) scale3d(.95, .95, .95);\n    -webkit-animation-timing-function: ease-in;\n            animation-timing-function: ease-in;\n  }\n\n  100% {\n    -webkit-transform: perspective(400px);\n            transform: perspective(400px);\n    -webkit-animation-timing-function: ease-in;\n            animation-timing-function: ease-in;\n  }\n}\n\n.animated.flip {\n  -webkit-backface-visibility: visible;\n          backface-visibility: visible;\n  -webkit-animation-name: flip;\n          animation-name: flip;\n}\n\n@-webkit-keyframes flipInX {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n            transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n            transition-timing-function: ease-in;\n    opacity: 0;\n  }\n\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n            transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n            transition-timing-function: ease-in;\n  }\n\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n            transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    opacity: 1;\n  }\n\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n            transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n  }\n\n  100% {\n    -webkit-transform: perspective(400px);\n            transform: perspective(400px);\n  }\n}\n\n@keyframes flipInX {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n            transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n            transition-timing-function: ease-in;\n    opacity: 0;\n  }\n\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n            transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n            transition-timing-function: ease-in;\n  }\n\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n            transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    opacity: 1;\n  }\n\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n            transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n  }\n\n  100% {\n    -webkit-transform: perspective(400px);\n            transform: perspective(400px);\n  }\n}\n\n.flipInX {\n  -webkit-backface-visibility: visible !important;\n          backface-visibility: visible !important;\n  -webkit-animation-name: flipInX;\n          animation-name: flipInX;\n}\n\n@-webkit-keyframes flipInY {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n            transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n            transition-timing-function: ease-in;\n    opacity: 0;\n  }\n\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n            transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n            transition-timing-function: ease-in;\n  }\n\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n            transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    opacity: 1;\n  }\n\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n            transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n  }\n\n  100% {\n    -webkit-transform: perspective(400px);\n            transform: perspective(400px);\n  }\n}\n\n@keyframes flipInY {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n            transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n            transition-timing-function: ease-in;\n    opacity: 0;\n  }\n\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n            transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n            transition-timing-function: ease-in;\n  }\n\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n            transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    opacity: 1;\n  }\n\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n            transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n  }\n\n  100% {\n    -webkit-transform: perspective(400px);\n            transform: perspective(400px);\n  }\n}\n\n.flipInY {\n  -webkit-backface-visibility: visible !important;\n          backface-visibility: visible !important;\n  -webkit-animation-name: flipInY;\n          animation-name: flipInY;\n}\n\n@-webkit-keyframes flipOutX {\n  0% {\n    -webkit-transform: perspective(400px);\n            transform: perspective(400px);\n  }\n\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n            transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    opacity: 1;\n  }\n\n  100% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n            transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    opacity: 0;\n  }\n}\n\n@keyframes flipOutX {\n  0% {\n    -webkit-transform: perspective(400px);\n            transform: perspective(400px);\n  }\n\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n            transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    opacity: 1;\n  }\n\n  100% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n            transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    opacity: 0;\n  }\n}\n\n.flipOutX {\n  -webkit-animation-name: flipOutX;\n          animation-name: flipOutX;\n  -webkit-animation-duration: .75s;\n          animation-duration: .75s;\n  -webkit-backface-visibility: visible !important;\n          backface-visibility: visible !important;\n}\n\n@-webkit-keyframes flipOutY {\n  0% {\n    -webkit-transform: perspective(400px);\n            transform: perspective(400px);\n  }\n\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n            transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    opacity: 1;\n  }\n\n  100% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n            transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    opacity: 0;\n  }\n}\n\n@keyframes flipOutY {\n  0% {\n    -webkit-transform: perspective(400px);\n            transform: perspective(400px);\n  }\n\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n            transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    opacity: 1;\n  }\n\n  100% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n            transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    opacity: 0;\n  }\n}\n\n.flipOutY {\n  -webkit-backface-visibility: visible !important;\n          backface-visibility: visible !important;\n  -webkit-animation-name: flipOutY;\n          animation-name: flipOutY;\n  -webkit-animation-duration: .75s;\n          animation-duration: .75s;\n}\n\n@-webkit-keyframes lightSpeedIn {\n  0% {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);\n            transform: translate3d(100%, 0, 0) skewX(-30deg);\n    opacity: 0;\n  }\n\n  60% {\n    -webkit-transform: skewX(20deg);\n            transform: skewX(20deg);\n    opacity: 1;\n  }\n\n  80% {\n    -webkit-transform: skewX(-5deg);\n            transform: skewX(-5deg);\n    opacity: 1;\n  }\n\n  100% {\n    -webkit-transform: none;\n            transform: none;\n    opacity: 1;\n  }\n}\n\n@keyframes lightSpeedIn {\n  0% {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);\n            transform: translate3d(100%, 0, 0) skewX(-30deg);\n    opacity: 0;\n  }\n\n  60% {\n    -webkit-transform: skewX(20deg);\n            transform: skewX(20deg);\n    opacity: 1;\n  }\n\n  80% {\n    -webkit-transform: skewX(-5deg);\n            transform: skewX(-5deg);\n    opacity: 1;\n  }\n\n  100% {\n    -webkit-transform: none;\n            transform: none;\n    opacity: 1;\n  }\n}\n\n.lightSpeedIn {\n  -webkit-animation-name: lightSpeedIn;\n          animation-name: lightSpeedIn;\n  -webkit-animation-timing-function: ease-out;\n          animation-timing-function: ease-out;\n}\n\n@-webkit-keyframes lightSpeedOut {\n  0% {\n    opacity: 1;\n  }\n\n  100% {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);\n            transform: translate3d(100%, 0, 0) skewX(30deg);\n    opacity: 0;\n  }\n}\n\n@keyframes lightSpeedOut {\n  0% {\n    opacity: 1;\n  }\n\n  100% {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);\n            transform: translate3d(100%, 0, 0) skewX(30deg);\n    opacity: 0;\n  }\n}\n\n.lightSpeedOut {\n  -webkit-animation-name: lightSpeedOut;\n          animation-name: lightSpeedOut;\n  -webkit-animation-timing-function: ease-in;\n          animation-timing-function: ease-in;\n}\n\n@-webkit-keyframes rotateIn {\n  0% {\n    -webkit-transform-origin: center;\n            transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, -200deg);\n            transform: rotate3d(0, 0, 1, -200deg);\n    opacity: 0;\n  }\n\n  100% {\n    -webkit-transform-origin: center;\n            transform-origin: center;\n    -webkit-transform: none;\n            transform: none;\n    opacity: 1;\n  }\n}\n\n@keyframes rotateIn {\n  0% {\n    -webkit-transform-origin: center;\n            transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, -200deg);\n            transform: rotate3d(0, 0, 1, -200deg);\n    opacity: 0;\n  }\n\n  100% {\n    -webkit-transform-origin: center;\n            transform-origin: center;\n    -webkit-transform: none;\n            transform: none;\n    opacity: 1;\n  }\n}\n\n.rotateIn {\n  -webkit-animation-name: rotateIn;\n          animation-name: rotateIn;\n}\n\n@-webkit-keyframes rotateInDownLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n            transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n            transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n\n  100% {\n    -webkit-transform-origin: left bottom;\n            transform-origin: left bottom;\n    -webkit-transform: none;\n            transform: none;\n    opacity: 1;\n  }\n}\n\n@keyframes rotateInDownLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n            transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n            transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n\n  100% {\n    -webkit-transform-origin: left bottom;\n            transform-origin: left bottom;\n    -webkit-transform: none;\n            transform: none;\n    opacity: 1;\n  }\n}\n\n.rotateInDownLeft {\n  -webkit-animation-name: rotateInDownLeft;\n          animation-name: rotateInDownLeft;\n}\n\n@-webkit-keyframes rotateInDownRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n            transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n            transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n\n  100% {\n    -webkit-transform-origin: right bottom;\n            transform-origin: right bottom;\n    -webkit-transform: none;\n            transform: none;\n    opacity: 1;\n  }\n}\n\n@keyframes rotateInDownRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n            transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n            transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n\n  100% {\n    -webkit-transform-origin: right bottom;\n            transform-origin: right bottom;\n    -webkit-transform: none;\n            transform: none;\n    opacity: 1;\n  }\n}\n\n.rotateInDownRight {\n  -webkit-animation-name: rotateInDownRight;\n          animation-name: rotateInDownRight;\n}\n\n@-webkit-keyframes rotateInUpLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n            transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n            transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n\n  100% {\n    -webkit-transform-origin: left bottom;\n            transform-origin: left bottom;\n    -webkit-transform: none;\n            transform: none;\n    opacity: 1;\n  }\n}\n\n@keyframes rotateInUpLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n            transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n            transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n\n  100% {\n    -webkit-transform-origin: left bottom;\n            transform-origin: left bottom;\n    -webkit-transform: none;\n            transform: none;\n    opacity: 1;\n  }\n}\n\n.rotateInUpLeft {\n  -webkit-animation-name: rotateInUpLeft;\n          animation-name: rotateInUpLeft;\n}\n\n@-webkit-keyframes rotateInUpRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n            transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -90deg);\n            transform: rotate3d(0, 0, 1, -90deg);\n    opacity: 0;\n  }\n\n  100% {\n    -webkit-transform-origin: right bottom;\n            transform-origin: right bottom;\n    -webkit-transform: none;\n            transform: none;\n    opacity: 1;\n  }\n}\n\n@keyframes rotateInUpRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n            transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -90deg);\n            transform: rotate3d(0, 0, 1, -90deg);\n    opacity: 0;\n  }\n\n  100% {\n    -webkit-transform-origin: right bottom;\n            transform-origin: right bottom;\n    -webkit-transform: none;\n            transform: none;\n    opacity: 1;\n  }\n}\n\n.rotateInUpRight {\n  -webkit-animation-name: rotateInUpRight;\n          animation-name: rotateInUpRight;\n}\n\n@-webkit-keyframes rotateOut {\n  0% {\n    -webkit-transform-origin: center;\n            transform-origin: center;\n    opacity: 1;\n  }\n\n  100% {\n    -webkit-transform-origin: center;\n            transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, 200deg);\n            transform: rotate3d(0, 0, 1, 200deg);\n    opacity: 0;\n  }\n}\n\n@keyframes rotateOut {\n  0% {\n    -webkit-transform-origin: center;\n            transform-origin: center;\n    opacity: 1;\n  }\n\n  100% {\n    -webkit-transform-origin: center;\n            transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, 200deg);\n            transform: rotate3d(0, 0, 1, 200deg);\n    opacity: 0;\n  }\n}\n\n.rotateOut {\n  -webkit-animation-name: rotateOut;\n          animation-name: rotateOut;\n}\n\n@-webkit-keyframes rotateOutDownLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n            transform-origin: left bottom;\n    opacity: 1;\n  }\n\n  100% {\n    -webkit-transform-origin: left bottom;\n            transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n            transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n}\n\n@keyframes rotateOutDownLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n            transform-origin: left bottom;\n    opacity: 1;\n  }\n\n  100% {\n    -webkit-transform-origin: left bottom;\n            transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n            transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n}\n\n.rotateOutDownLeft {\n  -webkit-animation-name: rotateOutDownLeft;\n          animation-name: rotateOutDownLeft;\n}\n\n@-webkit-keyframes rotateOutDownRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n            transform-origin: right bottom;\n    opacity: 1;\n  }\n\n  100% {\n    -webkit-transform-origin: right bottom;\n            transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n            transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n\n@keyframes rotateOutDownRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n            transform-origin: right bottom;\n    opacity: 1;\n  }\n\n  100% {\n    -webkit-transform-origin: right bottom;\n            transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n            transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n\n.rotateOutDownRight {\n  -webkit-animation-name: rotateOutDownRight;\n          animation-name: rotateOutDownRight;\n}\n\n@-webkit-keyframes rotateOutUpLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n            transform-origin: left bottom;\n    opacity: 1;\n  }\n\n  100% {\n    -webkit-transform-origin: left bottom;\n            transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n            transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n\n@keyframes rotateOutUpLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n            transform-origin: left bottom;\n    opacity: 1;\n  }\n\n  100% {\n    -webkit-transform-origin: left bottom;\n            transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n            transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n\n.rotateOutUpLeft {\n  -webkit-animation-name: rotateOutUpLeft;\n          animation-name: rotateOutUpLeft;\n}\n\n@-webkit-keyframes rotateOutUpRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n            transform-origin: right bottom;\n    opacity: 1;\n  }\n\n  100% {\n    -webkit-transform-origin: right bottom;\n            transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 90deg);\n            transform: rotate3d(0, 0, 1, 90deg);\n    opacity: 0;\n  }\n}\n\n@keyframes rotateOutUpRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n            transform-origin: right bottom;\n    opacity: 1;\n  }\n\n  100% {\n    -webkit-transform-origin: right bottom;\n            transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 90deg);\n            transform: rotate3d(0, 0, 1, 90deg);\n    opacity: 0;\n  }\n}\n\n.rotateOutUpRight {\n  -webkit-animation-name: rotateOutUpRight;\n          animation-name: rotateOutUpRight;\n}\n\n@-webkit-keyframes hinge {\n  0% {\n    -webkit-transform-origin: top left;\n            transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n            animation-timing-function: ease-in-out;\n  }\n\n  20%, 60% {\n    -webkit-transform: rotate3d(0, 0, 1, 80deg);\n            transform: rotate3d(0, 0, 1, 80deg);\n    -webkit-transform-origin: top left;\n            transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n            animation-timing-function: ease-in-out;\n  }\n\n  40%, 80% {\n    -webkit-transform: rotate3d(0, 0, 1, 60deg);\n            transform: rotate3d(0, 0, 1, 60deg);\n    -webkit-transform-origin: top left;\n            transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n            animation-timing-function: ease-in-out;\n    opacity: 1;\n  }\n\n  100% {\n    -webkit-transform: translate3d(0, 700px, 0);\n            transform: translate3d(0, 700px, 0);\n    opacity: 0;\n  }\n}\n\n@keyframes hinge {\n  0% {\n    -webkit-transform-origin: top left;\n            transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n            animation-timing-function: ease-in-out;\n  }\n\n  20%, 60% {\n    -webkit-transform: rotate3d(0, 0, 1, 80deg);\n            transform: rotate3d(0, 0, 1, 80deg);\n    -webkit-transform-origin: top left;\n            transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n            animation-timing-function: ease-in-out;\n  }\n\n  40%, 80% {\n    -webkit-transform: rotate3d(0, 0, 1, 60deg);\n            transform: rotate3d(0, 0, 1, 60deg);\n    -webkit-transform-origin: top left;\n            transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n            animation-timing-function: ease-in-out;\n    opacity: 1;\n  }\n\n  100% {\n    -webkit-transform: translate3d(0, 700px, 0);\n            transform: translate3d(0, 700px, 0);\n    opacity: 0;\n  }\n}\n\n.hinge {\n  -webkit-animation-name: hinge;\n          animation-name: hinge;\n}\n\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n\n@-webkit-keyframes rollIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n            transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n  }\n\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n            transform: none;\n  }\n}\n\n@keyframes rollIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n            transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n  }\n\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n            transform: none;\n  }\n}\n\n.rollIn {\n  -webkit-animation-name: rollIn;\n          animation-name: rollIn;\n}\n\n/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */\n\n@-webkit-keyframes rollOut {\n  0% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n            transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n  }\n}\n\n@keyframes rollOut {\n  0% {\n    opacity: 1;\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n            transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n  }\n}\n\n.rollOut {\n  -webkit-animation-name: rollOut;\n          animation-name: rollOut;\n}\n\n@-webkit-keyframes zoomIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(.3, .3, .3);\n            transform: scale3d(.3, .3, .3);\n  }\n\n  50% {\n    opacity: 1;\n  }\n}\n\n@keyframes zoomIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(.3, .3, .3);\n            transform: scale3d(.3, .3, .3);\n  }\n\n  50% {\n    opacity: 1;\n  }\n}\n\n.zoomIn {\n  -webkit-animation-name: zoomIn;\n          animation-name: zoomIn;\n}\n\n@-webkit-keyframes zoomInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);\n            transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n            animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n            transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n            animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n@keyframes zoomInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);\n            transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n            animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n            transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n            animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n.zoomInDown {\n  -webkit-animation-name: zoomInDown;\n          animation-name: zoomInDown;\n}\n\n@-webkit-keyframes zoomInLeft {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);\n            transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n            animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);\n            transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n            animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n@keyframes zoomInLeft {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);\n            transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n            animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);\n            transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n            animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n.zoomInLeft {\n  -webkit-animation-name: zoomInLeft;\n          animation-name: zoomInLeft;\n}\n\n@-webkit-keyframes zoomInRight {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);\n            transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n            animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);\n            transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n            animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n@keyframes zoomInRight {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);\n            transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n            animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);\n            transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n            animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n.zoomInRight {\n  -webkit-animation-name: zoomInRight;\n          animation-name: zoomInRight;\n}\n\n@-webkit-keyframes zoomInUp {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);\n            transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n            animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n            transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n            animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n@keyframes zoomInUp {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);\n            transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n            animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n            transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n            animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n.zoomInUp {\n  -webkit-animation-name: zoomInUp;\n          animation-name: zoomInUp;\n}\n\n@-webkit-keyframes zoomOut {\n  0% {\n    opacity: 1;\n  }\n\n  50% {\n    opacity: 0;\n    -webkit-transform: scale3d(.3, .3, .3);\n            transform: scale3d(.3, .3, .3);\n  }\n\n  100% {\n    opacity: 0;\n  }\n}\n\n@keyframes zoomOut {\n  0% {\n    opacity: 1;\n  }\n\n  50% {\n    opacity: 0;\n    -webkit-transform: scale3d(.3, .3, .3);\n            transform: scale3d(.3, .3, .3);\n  }\n\n  100% {\n    opacity: 0;\n  }\n}\n\n.zoomOut {\n  -webkit-animation-name: zoomOut;\n          animation-name: zoomOut;\n}\n\n@-webkit-keyframes zoomOutDown {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n            transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n            animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);\n            transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);\n    -webkit-transform-origin: center bottom;\n            transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n            animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n@keyframes zoomOutDown {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n            transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n            animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);\n            transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);\n    -webkit-transform-origin: center bottom;\n            transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n            animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n.zoomOutDown {\n  -webkit-animation-name: zoomOutDown;\n          animation-name: zoomOutDown;\n}\n\n@-webkit-keyframes zoomOutLeft {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);\n            transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: scale(.1) translate3d(-2000px, 0, 0);\n            transform: scale(.1) translate3d(-2000px, 0, 0);\n    -webkit-transform-origin: left center;\n            transform-origin: left center;\n  }\n}\n\n@keyframes zoomOutLeft {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);\n            transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: scale(.1) translate3d(-2000px, 0, 0);\n            transform: scale(.1) translate3d(-2000px, 0, 0);\n    -webkit-transform-origin: left center;\n            transform-origin: left center;\n  }\n}\n\n.zoomOutLeft {\n  -webkit-animation-name: zoomOutLeft;\n          animation-name: zoomOutLeft;\n}\n\n@-webkit-keyframes zoomOutRight {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);\n            transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: scale(.1) translate3d(2000px, 0, 0);\n            transform: scale(.1) translate3d(2000px, 0, 0);\n    -webkit-transform-origin: right center;\n            transform-origin: right center;\n  }\n}\n\n@keyframes zoomOutRight {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);\n            transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: scale(.1) translate3d(2000px, 0, 0);\n            transform: scale(.1) translate3d(2000px, 0, 0);\n    -webkit-transform-origin: right center;\n            transform-origin: right center;\n  }\n}\n\n.zoomOutRight {\n  -webkit-animation-name: zoomOutRight;\n          animation-name: zoomOutRight;\n}\n\n@-webkit-keyframes zoomOutUp {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n            transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n            animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);\n            transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);\n    -webkit-transform-origin: center bottom;\n            transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n            animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n@keyframes zoomOutUp {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n            transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n            animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);\n            transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);\n    -webkit-transform-origin: center bottom;\n            transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n            animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);\n  }\n}\n\n.zoomOutUp {\n  -webkit-animation-name: zoomOutUp;\n          animation-name: zoomOutUp;\n}\n\n@-webkit-keyframes slideInDown {\n  0% {\n    -webkit-transform: translateY(-100%);\n            transform: translateY(-100%);\n    visibility: visible;\n  }\n\n  100% {\n    -webkit-transform: translateY(0);\n            transform: translateY(0);\n  }\n}\n\n@keyframes slideInDown {\n  0% {\n    -webkit-transform: translateY(-100%);\n            transform: translateY(-100%);\n    visibility: visible;\n  }\n\n  100% {\n    -webkit-transform: translateY(0);\n            transform: translateY(0);\n  }\n}\n\n.slideInDown {\n  -webkit-animation-name: slideInDown;\n          animation-name: slideInDown;\n}\n\n@-webkit-keyframes slideInLeft {\n  0% {\n    -webkit-transform: translateX(-100%);\n            transform: translateX(-100%);\n    visibility: visible;\n  }\n\n  100% {\n    -webkit-transform: translateX(0);\n            transform: translateX(0);\n  }\n}\n\n@keyframes slideInLeft {\n  0% {\n    -webkit-transform: translateX(-100%);\n            transform: translateX(-100%);\n    visibility: visible;\n  }\n\n  100% {\n    -webkit-transform: translateX(0);\n            transform: translateX(0);\n  }\n}\n\n.slideInLeft {\n  -webkit-animation-name: slideInLeft;\n          animation-name: slideInLeft;\n}\n\n@-webkit-keyframes slideInRight {\n  0% {\n    -webkit-transform: translateX(100%);\n            transform: translateX(100%);\n    visibility: visible;\n  }\n\n  100% {\n    -webkit-transform: translateX(0);\n            transform: translateX(0);\n  }\n}\n\n@keyframes slideInRight {\n  0% {\n    -webkit-transform: translateX(100%);\n            transform: translateX(100%);\n    visibility: visible;\n  }\n\n  100% {\n    -webkit-transform: translateX(0);\n            transform: translateX(0);\n  }\n}\n\n.slideInRight {\n  -webkit-animation-name: slideInRight;\n          animation-name: slideInRight;\n}\n\n@-webkit-keyframes slideInUp {\n  0% {\n    -webkit-transform: translateY(100%);\n            transform: translateY(100%);\n    visibility: visible;\n  }\n\n  100% {\n    -webkit-transform: translateY(0);\n            transform: translateY(0);\n  }\n}\n\n@keyframes slideInUp {\n  0% {\n    -webkit-transform: translateY(100%);\n            transform: translateY(100%);\n    visibility: visible;\n  }\n\n  100% {\n    -webkit-transform: translateY(0);\n            transform: translateY(0);\n  }\n}\n\n.slideInUp {\n  -webkit-animation-name: slideInUp;\n          animation-name: slideInUp;\n}\n\n@-webkit-keyframes slideOutDown {\n  0% {\n    -webkit-transform: translateY(0);\n            transform: translateY(0);\n  }\n\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateY(100%);\n            transform: translateY(100%);\n  }\n}\n\n@keyframes slideOutDown {\n  0% {\n    -webkit-transform: translateY(0);\n            transform: translateY(0);\n  }\n\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateY(100%);\n            transform: translateY(100%);\n  }\n}\n\n.slideOutDown {\n  -webkit-animation-name: slideOutDown;\n          animation-name: slideOutDown;\n}\n\n@-webkit-keyframes slideOutLeft {\n  0% {\n    -webkit-transform: translateX(0);\n            transform: translateX(0);\n  }\n\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateX(-100%);\n            transform: translateX(-100%);\n  }\n}\n\n@keyframes slideOutLeft {\n  0% {\n    -webkit-transform: translateX(0);\n            transform: translateX(0);\n  }\n\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateX(-100%);\n            transform: translateX(-100%);\n  }\n}\n\n.slideOutLeft {\n  -webkit-animation-name: slideOutLeft;\n          animation-name: slideOutLeft;\n}\n\n@-webkit-keyframes slideOutRight {\n  0% {\n    -webkit-transform: translateX(0);\n            transform: translateX(0);\n  }\n\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateX(100%);\n            transform: translateX(100%);\n  }\n}\n\n@keyframes slideOutRight {\n  0% {\n    -webkit-transform: translateX(0);\n            transform: translateX(0);\n  }\n\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateX(100%);\n            transform: translateX(100%);\n  }\n}\n\n.slideOutRight {\n  -webkit-animation-name: slideOutRight;\n          animation-name: slideOutRight;\n}\n\n@-webkit-keyframes slideOutUp {\n  0% {\n    -webkit-transform: translateY(0);\n            transform: translateY(0);\n  }\n\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateY(-100%);\n            transform: translateY(-100%);\n  }\n}\n\n@keyframes slideOutUp {\n  0% {\n    -webkit-transform: translateY(0);\n            transform: translateY(0);\n  }\n\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateY(-100%);\n            transform: translateY(-100%);\n  }\n}\n\n.slideOutUp {\n  -webkit-animation-name: slideOutUp;\n          animation-name: slideOutUp;\n}\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/demo/api.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta charset=\"utf-8\">\n    <title>API</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"demonstration of some noty capabilities\">\n\n    <link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic&amp;subset=latin,latin-ext,cyrillic' rel='stylesheet' type='text/css'>\n    <style type=\"text/css\">\n\n        html {\n            height: 100%;\n            width: 100%;\n        }\n\n        body {\n            font-family: 'PT Sans', Tahoma, Arial, serif;\n            line-height: 13px\n        }\n\n    </style>\n\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"buttons.css\"/>\n\n</head>\n<body>\n\n<div class=\"container\">\n\n    <div id=\"customContainer\"></div>\n\n</div>\n\n<script src=\"jquery-1.7.2.min.js\"></script>\n\n<!-- noty -->\n<script type=\"text/javascript\" src=\"../js/noty/packaged/jquery.noty.packaged.js\"></script>\n\n<script type=\"text/javascript\">\n\n    function generate(type) {\n        var n = noty({\n            text        : type,\n            type        : type,\n            dismissQueue: false,\n            layout      : 'topCenter',\n            theme       : 'relax'\n        });\n        console.log(type + ' - ' + n.options.id);\n        return n;\n    }\n\n    $(document).ready(function () {\n\n        var alert = generate('alert');\n        var information = generate('information');\n        var error = generate('error');\n        var warning = generate('warning');\n        var notification = generate('notification');\n        var success = generate('success');\n\n        setTimeout(function () {\n            $.noty.setText(alert.options.id, 'I\\'m closing now!'); // same as alert.setText('Text Override')\n        }, 1000);\n\n        setTimeout(function () {\n            $.noty.close(alert.options.id);\n        }, 3000);\n\n        setTimeout(function () {\n            $.noty.setType(information.options.id, 'warning'); // same as information.setType('warning')\n        }, 5000);\n\n        setTimeout(function () {\n            $.noty.setText(information.options.id, 'I\\'m closing too. Goodbye!'); // same as information.setType('warning')\n        }, 7000);\n\n        setTimeout(function () {\n            $.noty.closeAll();\n        }, 10000);\n\n    });\n\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/demo/buttons.css",
    "content": "/*!\n * Bootstrap Buttons v2.0.2\n *\n * Copyright 2012 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world @twitter by @mdo and @fat.\n */\n\n.btn {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  padding: 4px 10px 4px;\n  margin-bottom: 0;\n  font-size: 13px;\n  line-height: 18px;\n  color: #333333;\n  text-align: center;\n  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);\n  vertical-align: middle;\n  background-color: #f5f5f5;\n  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));\n  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: linear-gradient(top, #ffffff, #e6e6e6);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);\n  border-color: #e6e6e6 #e6e6e6 #bfbfbf;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:dximagetransform.microsoft.gradient(enabled=false);\n  border: 1px solid #cccccc;\n  border-bottom-color: #b3b3b3;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);\n  -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);\n  cursor: pointer;\n  *margin-left: .3em;\n}\n\n.btn:hover,\n.btn:active,\n.btn.active,\n.btn.disabled,\n.btn[disabled] {\n  background-color: #e6e6e6;\n}\n\n.btn:active,\n.btn.active {\n  background-color: #cccccc \\9;\n}\n\n.btn:first-child {\n  *margin-left: 0;\n}\n\n.btn:hover {\n  color: #333333;\n  text-decoration: none;\n  background-color: #e6e6e6;\n  background-position: 0 -15px;\n  -webkit-transition: background-position 0.1s linear;\n  -moz-transition: background-position 0.1s linear;\n  -ms-transition: background-position 0.1s linear;\n  -o-transition: background-position 0.1s linear;\n  transition: background-position 0.1s linear;\n}\n\n.btn:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n.btn.active,\n.btn:active {\n  background-image: none;\n  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);\n  -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);\n  box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);\n  background-color: #e6e6e6;\n  background-color: #d9d9d9 \\9;\n  outline: 0;\n}\n\n.btn.disabled,\n.btn[disabled] {\n  cursor: default;\n  background-image: none;\n  background-color: #e6e6e6;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n}\n\n.btn-large {\n  padding: 9px 14px;\n  font-size: 15px;\n  line-height: normal;\n  -webkit-border-radius: 5px;\n  -moz-border-radius: 5px;\n  border-radius: 5px;\n}\n\n.btn-large [class^=\"icon-\"] {\n  margin-top: 1px;\n}\n\n.btn-small {\n  padding: 5px 9px;\n  font-size: 11px;\n  line-height: 16px;\n}\n\n.btn-small [class^=\"icon-\"] {\n  margin-top: -1px;\n}\n\n.btn-mini {\n  padding: 2px 6px;\n  font-size: 11px;\n  line-height: 14px;\n}\n\n.btn-primary,\n.btn-primary:hover,\n.btn-warning,\n.btn-warning:hover,\n.btn-danger,\n.btn-danger:hover,\n.btn-success,\n.btn-success:hover,\n.btn-info,\n.btn-info:hover,\n.btn-inverse,\n.btn-inverse:hover {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  color: #ffffff;\n}\n\n.btn-primary.active,\n.btn-warning.active,\n.btn-danger.active,\n.btn-success.active,\n.btn-info.active,\n.btn-inverse.active {\n  color: rgba(255, 255, 255, 0.75);\n}\n\n.btn-primary {\n  background-color: #0074cc;\n  background-image: -moz-linear-gradient(top, #0088cc, #0055cc);\n  background-image: -ms-linear-gradient(top, #0088cc, #0055cc);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0055cc));\n  background-image: -webkit-linear-gradient(top, #0088cc, #0055cc);\n  background-image: -o-linear-gradient(top, #0088cc, #0055cc);\n  background-image: linear-gradient(top, #0088cc, #0055cc);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0055cc', GradientType=0);\n  border-color: #0055cc #0055cc #003580;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:dximagetransform.microsoft.gradient(enabled=false);\n}\n\n.btn-primary:hover,\n.btn-primary:active,\n.btn-primary.active,\n.btn-primary.disabled,\n.btn-primary[disabled] {\n  background-color: #0055cc;\n}\n\n.btn-primary:active,\n.btn-primary.active {\n  background-color: #004099 \\9;\n}\n\n.btn-warning {\n  background-color: #faa732;\n  background-image: -moz-linear-gradient(top, #fbb450, #f89406);\n  background-image: -ms-linear-gradient(top, #fbb450, #f89406);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));\n  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);\n  background-image: -o-linear-gradient(top, #fbb450, #f89406);\n  background-image: linear-gradient(top, #fbb450, #f89406);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);\n  border-color: #f89406 #f89406 #ad6704;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:dximagetransform.microsoft.gradient(enabled=false);\n}\n\n.btn-warning:hover,\n.btn-warning:active,\n.btn-warning.active,\n.btn-warning.disabled,\n.btn-warning[disabled] {\n  background-color: #f89406;\n}\n\n.btn-warning:active,\n.btn-warning.active {\n  background-color: #c67605 \\9;\n}\n\n.btn-danger {\n  background-color: #da4f49;\n  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));\n  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: linear-gradient(top, #ee5f5b, #bd362f);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);\n  border-color: #bd362f #bd362f #802420;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:dximagetransform.microsoft.gradient(enabled=false);\n}\n\n.btn-danger:hover,\n.btn-danger:active,\n.btn-danger.active,\n.btn-danger.disabled,\n.btn-danger[disabled] {\n  background-color: #bd362f;\n}\n\n.btn-danger:active,\n.btn-danger.active {\n  background-color: #942a25 \\9;\n}\n\n.btn-success {\n  background-color: #5bb75b;\n  background-image: -moz-linear-gradient(top, #62c462, #51a351);\n  background-image: -ms-linear-gradient(top, #62c462, #51a351);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));\n  background-image: -webkit-linear-gradient(top, #62c462, #51a351);\n  background-image: -o-linear-gradient(top, #62c462, #51a351);\n  background-image: linear-gradient(top, #62c462, #51a351);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);\n  border-color: #51a351 #51a351 #387038;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:dximagetransform.microsoft.gradient(enabled=false);\n}\n\n.btn-success:hover,\n.btn-success:active,\n.btn-success.active,\n.btn-success.disabled,\n.btn-success[disabled] {\n  background-color: #51a351;\n}\n\n.btn-success:active,\n.btn-success.active {\n  background-color: #408140 \\9;\n}\n\n.btn-info {\n  background-color: #49afcd;\n  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));\n  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: linear-gradient(top, #5bc0de, #2f96b4);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);\n  border-color: #2f96b4 #2f96b4 #1f6377;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:dximagetransform.microsoft.gradient(enabled=false);\n}\n\n.btn-info:hover,\n.btn-info:active,\n.btn-info.active,\n.btn-info.disabled,\n.btn-info[disabled] {\n  background-color: #2f96b4;\n}\n\n.btn-info:active,\n.btn-info.active {\n  background-color: #24748c \\9;\n}\n\n.btn-inverse {\n  background-color: #414141;\n  background-image: -moz-linear-gradient(top, #555555, #222222);\n  background-image: -ms-linear-gradient(top, #555555, #222222);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222));\n  background-image: -webkit-linear-gradient(top, #555555, #222222);\n  background-image: -o-linear-gradient(top, #555555, #222222);\n  background-image: linear-gradient(top, #555555, #222222);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#555555', endColorstr='#222222', GradientType=0);\n  border-color: #222222 #222222 #000000;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:dximagetransform.microsoft.gradient(enabled=false);\n}\n\n.btn-inverse:hover,\n.btn-inverse:active,\n.btn-inverse.active,\n.btn-inverse.disabled,\n.btn-inverse[disabled] {\n  background-color: #222222;\n}\n\n.btn-inverse:active,\n.btn-inverse.active {\n  background-color: #080808 \\9;\n}\n\nbutton.btn,\ninput[type=\"submit\"].btn {\n  *padding-top: 2px;\n  *padding-bottom: 2px;\n}\n\nbutton.btn::-moz-focus-inner,\ninput[type=\"submit\"].btn::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\n\nbutton.btn.btn-large,\ninput[type=\"submit\"].btn.btn-large {\n  *padding-top: 7px;\n  *padding-bottom: 7px;\n}\n\nbutton.btn.btn-small,\ninput[type=\"submit\"].btn.btn-small {\n  *padding-top: 3px;\n  *padding-bottom: 3px;\n}\n\nbutton.btn.btn-mini,\ninput[type=\"submit\"].btn.btn-mini {\n  *padding-top: 1px;\n  *padding-bottom: 1px;\n}\n\n.activity-item i {\n  float: left;\n  margin-top: 3px;\n  font-size: 16px;\n}\n\ndiv.activity {\n  margin-left: 28px;\n  line-height: 20px;\n}\n\ndiv.activity-item {\n  padding: 7px 12px;\n}\n\n#notification-list div.activity-item {\n  border-top: 1px solid #f5f5f5;\n}\n\n#notification-list div.activity-item a {\n  font-weight: 600;\n}\n\ndiv.activity span {\n  display: block;\n  color: #999;\n  font-size: 11px;\n  line-height: 16px;\n}\n\n#notifications i.fa {\n  font-size: 17px;\n}\n\n.noty_type_error * {\n  font-weight: normal !important;\n}\n\n.noty_type_error a {\n  font-weight: bold !important;\n}\n\n.noty_bar.noty_type_error a, .noty_bar.noty_type_error i {\n  color: #fff\n}\n\n.noty_bar.noty_type_information a {\n  color: #fff;\n  font-weight: bold;\n}\n\n.noty_type_error div.activity span {\n  color: #fff\n}\n\n.noty_type_information div.activity span {\n  color: #fefefe\n}\n\na {\n  color: #428bca;\n  text-decoration: none;\n}\n\na:hover {\n  color: #D65C4F;\n  text-decoration: none;\n}"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/demo/consumingAlert.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta charset=\"utf-8\">\n    <title>Notification Types</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"demonstration of some noty capabilities\">\n\n    <link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic&amp;subset=latin,latin-ext,cyrillic' rel='stylesheet' type='text/css'>\n    <style type=\"text/css\">\n\n        html {\n            height: 100%;\n            width: 100%;\n        }\n\n        body {\n            font-family: 'PT Sans', Tahoma, Arial, serif;\n            line-height: 13px\n        }\n\n    </style>\n\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"buttons.css\"/>\n\n</head>\n<body>\n\n<div class=\"container\">\n\n    <div id=\"customContainer\"></div>\n\n</div>\n\n<script src=\"jquery-1.7.2.min.js\"></script>\n\n<!-- noty -->\n<script type=\"text/javascript\" src=\"../js/noty/packaged/jquery.noty.packaged.js\"></script>\n\n<script type=\"text/javascript\">\n\n    $(document).ready(function () {\n\n        alert(\"This is a basic window alert\");\n\n        $.noty.consumeAlert({layout: 'topRight', type: 'success', dismissQueue: true});\n\n        alert(\"This is the same but noty consumed with options\");\n\n        $.noty.consumeAlert({layout: 'topCenter', type: 'alert', dismissQueue: true});\n\n        alert(\"Consumed again but different options\");\n\n        $.noty.stopConsumeAlert();\n\n        alert(\"This is just alert without consume\");\n\n    });\n\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/demo/customContainer.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta charset=\"utf-8\">\n    <title>Notification Types</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"demonstration of some noty capabilities\">\n\n    <link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic&amp;subset=latin,latin-ext,cyrillic' rel='stylesheet' type='text/css'>\n    <style type=\"text/css\">\n\n        html {\n            height: 100%;\n            width: 100%;\n        }\n\n        body {\n            font-family: 'PT Sans', Tahoma, Arial, serif;\n            line-height: 13px\n        }\n\n    </style>\n\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"buttons.css\"/>\n\n</head>\n<body>\n\n<div class=\"container\">\n\n    <div id=\"customContainer\" style=\"width: 400px; margin-left: 125px; margin-top: 50px; border: 1px solid #ccc; padding: 10px\">\n        <p><strong>Hi!</strong> I'm a custom container no:1</p>\n    </div>\n\n    <div id=\"customContainer2\" style=\"width: 400px; margin-left: 125px; margin-top: 50px; border: 1px solid #ccc; padding: 10px\">\n        <p><strong>Hi!</strong> I'm a custom container no:2</p>\n    </div>\n\n</div>\n\n<script src=\"jquery-1.7.2.min.js\"></script>\n\n<!-- noty -->\n<script type=\"text/javascript\" src=\"../js/noty/packaged/jquery.noty.packaged.js\"></script>\n\n<script type=\"text/javascript\">\n\n    function generate(container, type) {\n\n        var n = $(container).noty({\n            text        : type + ' for: ' + container,\n            type        : type,\n            dismissQueue: true,\n            layout      : 'topCenter',\n            theme       : 'relax',\n            maxVisible  : 30\n        });\n\n        console.log('html: ' + n.options.id);\n    }\n\n    function generateAll() {\n        generate('div#customContainer2', 'alert');\n        generate('div#customContainer2', 'information');\n        generate('div#customContainer2', 'error');\n        generate('div#customContainer2', 'warning');\n        generate('div#customContainer2', 'notification');\n        generate('div#customContainer2', 'success');\n\n        generate('div#customContainer', 'alert');\n        generate('div#customContainer', 'information');\n        generate('div#customContainer', 'error');\n        generate('div#customContainer', 'warning');\n        generate('div#customContainer', 'notification');\n        generate('div#customContainer', 'success');\n    }\n\n    $(document).ready(function () {\n\n        generateAll();\n\n    });\n\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/demo/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta charset=\"utf-8\">\n    <title>Demonstration of noty</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"demonstration of some noty capabilities\">\n\n    <link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic&amp;subset=latin,latin-ext,cyrillic' rel='stylesheet' type='text/css'>\n    <style type=\"text/css\">\n\n        html {\n            height: 100%;\n            width: 100%;\n        }\n\n        body {\n            font-family: 'PT Sans', Tahoma, Arial, serif;\n            line-height: 13px\n        }\n\n        a {\n            color: #444;\n            line-height: 30px;\n            text-decoration: none;\n            background: #f1f1f1;\n            padding: 2px 8px;\n        }\n\n    </style>\n\n</head>\n<body>\n<div class=\"container\">\n    <div>\n        <a href=\"allLayouts.html\">See All Layouts</a>\n    </div>\n    <div>\n        <a href=\"noanim.html\">Using without animations</a>\n    </div>\n    <div>\n        <a href=\"allTypes.html\">See All Types</a>\n    </div>\n    <div>\n        <a href=\"usingWithButtons.html\">Using with Buttons</a>\n    </div>\n    <div>\n        <a href=\"usingWithButtons2.html\">Using with Buttons 2</a>\n    </div>\n    <div>\n        <a href=\"usingWithModal.html\">Using with Modal</a>\n    </div>\n    <div>\n        <a href=\"usingWithOldOptions.html\">Using with Old Options</a>\n    </div>\n    <div>\n        <a href=\"customContainer.html\">Using with Custom Container</a>\n    </div>\n    <div>\n        <a href=\"consumingAlert.html\">Consuming Alert</a>\n    </div>\n    <div>\n        <a href=\"api.html\">Using API</a>\n    </div>\n    <div>\n        <a href=\"usingMaxVisible.html\">Max Visible Option</a>\n    </div>\n    <div>\n        <a href=\"killer.html\">Killer Option</a>\n    </div>\n    <div>\n        <a href=\"themeCss.html\">CSS Theme Example</a>\n    </div>\n    <div>\n        <a href=\"usingWithAnimate.css.html\">Using with Animate.css</a>\n    </div>\n    <div>\n        <a href=\"progressbar.html\">Using with progress bar</a>\n    </div>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/demo/issue302.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta charset=\"utf-8\">\n    <title>issue302</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"demonstration of some noty capabilities\">\n\n    <link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic&amp;subset=latin,latin-ext,cyrillic' rel='stylesheet' type='text/css'>\n    <style type=\"text/css\">\n\n        html {\n            height: 100%;\n            width: 100%;\n        }\n\n        body {\n            font-family: 'PT Sans', Tahoma, Arial, serif;\n            line-height: 13px\n        }\n\n    </style>\n\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"buttons.css\"/>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"animate.css\"/>\n\n</head>\n<body>\n\n<div class=\"container\">\n\n    <a href=\"#\" class=\"open\">Click here</a>\n\n</div>\n\n<script src=\"jquery-1.7.2.min.js\"></script>\n\n<!-- noty -->\n<script type=\"text/javascript\" src=\"../js/noty/packaged/jquery.noty.packaged.js\"></script>\n\n<script type=\"text/javascript\">\n\n    $(document).ready(function () {\n\n        var options = {\n            text: 'a',\n            timeout: 500,\n            type: 'success',\n            theme: 'relax',\n            layout: 'topRight',\n            closeWith: ['click'],\n            maxVisible: 10,\n            animation: {\n                open: 'animated bounceInDown', // Animate.css class names\n                close: 'animated bounceOutRight', // Animate.css class names\n                easing: 'swing', // unavailable - no need\n                speed: 500 // unavailable - no need\n            }\n        };\n\n        // missing options such as Theme!!\n        $('.open').click(function(e){\n            console.log(options);\n            e.preventDefault();\n            noty(options);\n        });\n    });\n\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/demo/jquery-1.8.0.js",
    "content": "/*!\n * jQuery JavaScript Library v1.8.0\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright 2012 jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: Thu Aug 09 2012 16:24:48 GMT-0400 (Eastern Daylight Time)\n */\n(function( window, undefined ) {\nvar\n\t// A central reference to the root jQuery(document)\n\trootjQuery,\n\n\t// The deferred used on DOM ready\n\treadyList,\n\n\t// Use the correct document accordingly with window argument (sandbox)\n\tdocument = window.document,\n\tlocation = window.location,\n\tnavigator = window.navigator,\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$,\n\n\t// Save a reference to some core methods\n\tcore_push = Array.prototype.push,\n\tcore_slice = Array.prototype.slice,\n\tcore_indexOf = Array.prototype.indexOf,\n\tcore_toString = Object.prototype.toString,\n\tcore_hasOwn = Object.prototype.hasOwnProperty,\n\tcore_trim = String.prototype.trim,\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\treturn new jQuery.fn.init( selector, context, rootjQuery );\n\t},\n\n\t// Used for matching numbers\n\tcore_pnum = /[\\-+]?(?:\\d*\\.|)\\d+(?:[eE][\\-+]?\\d+|)/.source,\n\n\t// Used for detecting and trimming whitespace\n\tcore_rnotwhite = /\\S/,\n\tcore_rspace = /\\s+/,\n\n\t// IE doesn't match non-breaking spaces with \\s\n\trtrim = core_rnotwhite.test(\"\\xA0\") ? (/^[\\s\\xA0]+|[\\s\\xA0]+$/g) : /^\\s+|\\s+$/g,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\trquickExpr = /^(?:[^#<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)/,\n\n\t// Match a standalone tag\n\trsingleTag = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,\n\n\t// JSON RegExp\n\trvalidchars = /^[\\],:{}\\s]*$/,\n\trvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g,\n\trvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[\\da-fA-F]{4})/g,\n\trvalidtokens = /\"[^\"\\\\\\r\\n]*\"|true|false|null|-?(?:\\d\\d*\\.|)\\d+(?:[eE][\\-+]?\\d+|)/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\n\t// The ready event handler and self cleanup method\n\tDOMContentLoaded = function() {\n\t\tif ( document.addEventListener ) {\n\t\t\tdocument.removeEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\n\t\t\tjQuery.ready();\n\t\t} else if ( document.readyState === \"complete\" ) {\n\t\t\t// we're here because readyState === \"complete\" in oldIE\n\t\t\t// which is good enough for us to call the dom ready!\n\t\t\tdocument.detachEvent( \"onreadystatechange\", DOMContentLoaded );\n\t\t\tjQuery.ready();\n\t\t}\n\t},\n\n\t// [[Class]] -> type pairs\n\tclass2type = {};\n\njQuery.fn = jQuery.prototype = {\n\tconstructor: jQuery,\n\tinit: function( selector, context, rootjQuery ) {\n\t\tvar match, elem, ret, doc;\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 $(DOMElement)\n\t\tif ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\t\t\t\t\tdoc = ( context && context.nodeType ? context.ownerDocument || context : document );\n\n\t\t\t\t\t// scripts is true for back-compat\n\t\t\t\t\tselector = jQuery.parseHTML( match[1], doc, true );\n\t\t\t\t\tif ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tthis.attr.call( selector, context, true );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.merge( this, selector );\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id !== match[2] ) {\n\t\t\t\t\t\t\treturn rootjQuery.find( selector );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || 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: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn rootjQuery.ready( selector );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t},\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The current version of jQuery being used\n\tjquery: \"1.8.0\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\t// The number of elements contained in the matched element set\n\tsize: function() {\n\t\treturn this.length;\n\t},\n\n\ttoArray: function() {\n\t\treturn core_slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num == null ?\n\n\t\t\t// Return a 'clean' array\n\t\t\tthis.toArray() :\n\n\t\t\t// Return just the object\n\t\t\t( num < 0 ? this[ this.length + num ] : this[ num ] );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems, name, selector ) {\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\n\t\tret.context = this.context;\n\n\t\tif ( name === \"find\" ) {\n\t\t\tret.selector = this.selector + ( this.selector ? \" \" : \"\" ) + selector;\n\t\t} else if ( name ) {\n\t\t\tret.selector = this.selector + \".\" + name + \"(\" + selector + \")\";\n\t\t}\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tready: function( fn ) {\n\t\t// Add the callback\n\t\tjQuery.ready.promise().done( fn );\n\n\t\treturn this;\n\t},\n\n\teq: function( i ) {\n\t\ti = +i;\n\t\treturn i === -1 ?\n\t\t\tthis.slice( i ) :\n\t\t\tthis.slice( i, i + 1 );\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\tslice: function() {\n\t\treturn this.pushStack( core_slice.apply( this, arguments ),\n\t\t\t\"slice\", core_slice.call(arguments).join(\",\") );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: core_push,\n\tsort: [].sort,\n\tsplice: [].splice\n};\n\n// Give the init function the jQuery prototype for later instantiation\njQuery.fn.init.prototype = jQuery.fn;\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// extend jQuery itself if only one argument is passed\n\tif ( length === i ) {\n\t\ttarget = this;\n\t\t--i;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\tnoConflict: function( deep ) {\n\t\tif ( window.$ === jQuery ) {\n\t\t\twindow.$ = _$;\n\t\t}\n\n\t\tif ( deep && window.jQuery === jQuery ) {\n\t\t\twindow.jQuery = _jQuery;\n\t\t}\n\n\t\treturn jQuery;\n\t},\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\tif ( !document.body ) {\n\t\t\treturn setTimeout( jQuery.ready, 1 );\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.trigger ) {\n\t\t\tjQuery( document ).trigger(\"ready\").off(\"ready\");\n\t\t}\n\t},\n\n\t// See test/unit/core.js for details concerning isFunction.\n\t// Since version 1.3, DOM methods and functions like alert\n\t// aren't supported. They return false on IE (#2968).\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray || function( obj ) {\n\t\treturn jQuery.type(obj) === \"array\";\n\t},\n\n\tisWindow: function( obj ) {\n\t\treturn obj != null && obj == obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\t\treturn !isNaN( parseFloat(obj) ) && isFinite( obj );\n\t},\n\n\ttype: function( obj ) {\n\t\treturn obj == null ?\n\t\t\tString( obj ) :\n\t\t\tclass2type[ core_toString.call(obj) ] || \"object\";\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\t// Must be an Object.\n\t\t// Because of IE, we also have to check the presence of the constructor property.\n\t\t// Make sure that DOM nodes and window objects don't pass through, as well\n\t\tif ( !obj || jQuery.type(obj) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\t// Not own constructor property must be Object\n\t\t\tif ( obj.constructor &&\n\t\t\t\t!core_hasOwn.call(obj, \"constructor\") &&\n\t\t\t\t!core_hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\t// IE8,9 Will throw exceptions on certain host objects #9897\n\t\t\treturn false;\n\t\t}\n\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own.\n\n\t\tvar key;\n\t\tfor ( key in obj ) {}\n\n\t\treturn key === undefined || core_hasOwn.call( obj, key );\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\t// data: string of html\n\t// context (optional): If specified, the fragment will be created in this context, defaults to document\n\t// scripts (optional): If true, will include scripts passed in the html string\n\tparseHTML: function( data, context, scripts ) {\n\t\tvar parsed;\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\t\tif ( typeof context === \"boolean\" ) {\n\t\t\tscripts = context;\n\t\t\tcontext = 0;\n\t\t}\n\t\tcontext = context || document;\n\n\t\t// Single tag\n\t\tif ( (parsed = rsingleTag.exec( data )) ) {\n\t\t\treturn [ context.createElement( parsed[1] ) ];\n\t\t}\n\n\t\tparsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );\n\t\treturn jQuery.merge( [],\n\t\t\t(parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );\n\t},\n\n\tparseJSON: function( data ) {\n\t\tif ( !data || typeof data !== \"string\") {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Make sure leading/trailing whitespace is removed (IE can't handle it)\n\t\tdata = jQuery.trim( data );\n\n\t\t// Attempt to parse using the native JSON parser first\n\t\tif ( window.JSON && window.JSON.parse ) {\n\t\t\treturn window.JSON.parse( data );\n\t\t}\n\n\t\t// Make sure the incoming data is actual JSON\n\t\t// Logic borrowed from http://json.org/json2.js\n\t\tif ( rvalidchars.test( data.replace( rvalidescape, \"@\" )\n\t\t\t.replace( rvalidtokens, \"]\" )\n\t\t\t.replace( rvalidbraces, \"\")) ) {\n\n\t\t\treturn ( new Function( \"return \" + data ) )();\n\n\t\t}\n\t\tjQuery.error( \"Invalid JSON: \" + data );\n\t},\n\n\t// Cross-browser xml parsing\n\tparseXML: function( data ) {\n\t\tvar xml, tmp;\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\t\ttry {\n\t\t\tif ( window.DOMParser ) { // Standard\n\t\t\t\ttmp = new DOMParser();\n\t\t\t\txml = tmp.parseFromString( data , \"text/xml\" );\n\t\t\t} else { // IE\n\t\t\t\txml = new ActiveXObject( \"Microsoft.XMLDOM\" );\n\t\t\t\txml.async = \"false\";\n\t\t\t\txml.loadXML( data );\n\t\t\t}\n\t\t} catch( e ) {\n\t\t\txml = undefined;\n\t\t}\n\t\tif ( !xml || !xml.documentElement || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\t\tjQuery.error( \"Invalid XML: \" + data );\n\t\t}\n\t\treturn xml;\n\t},\n\n\tnoop: function() {},\n\n\t// Evaluates a script in a global context\n\t// Workarounds based on findings by Jim Driscoll\n\t// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\n\tglobalEval: function( data ) {\n\t\tif ( data && core_rnotwhite.test( data ) ) {\n\t\t\t// We use execScript on Internet Explorer\n\t\t\t// We use an anonymous function so that context is window\n\t\t\t// rather than jQuery in Firefox\n\t\t\t( window.execScript || function( data ) {\n\t\t\t\twindow[ \"eval\" ].call( window, data );\n\t\t\t} )( data );\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( obj, callback, args ) {\n\t\tvar name,\n\t\t\ti = 0,\n\t\t\tlength = obj.length,\n\t\t\tisObj = length === undefined || jQuery.isFunction( obj );\n\n\t\tif ( args ) {\n\t\t\tif ( isObj ) {\n\t\t\t\tfor ( name in obj ) {\n\t\t\t\t\tif ( callback.apply( obj[ name ], args ) === 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 < length; ) {\n\t\t\t\t\tif ( callback.apply( obj[ i++ ], args ) === 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 ( isObj ) {\n\t\t\t\tfor ( name in obj ) {\n\t\t\t\t\tif ( callback.call( obj[ name ], name, obj[ name ] ) === 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 < length; ) {\n\t\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i++ ] ) === 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// Use native String.trim function wherever possible\n\ttrim: core_trim ?\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\tcore_trim.call( text );\n\t\t} :\n\n\t\t// Otherwise use our own trimming functionality\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\ttext.toString().replace( rtrim, \"\" );\n\t\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar type,\n\t\t\tret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\t// The window, strings (and functions) also have 'length'\n\t\t\t// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930\n\t\t\ttype = jQuery.type( arr );\n\n\t\t\tif ( arr.length == null || type === \"string\" || type === \"function\" || type === \"regexp\" || jQuery.isWindow( arr ) ) {\n\t\t\t\tcore_push.call( ret, arr );\n\t\t\t} else {\n\t\t\t\tjQuery.merge( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\tvar len;\n\n\t\tif ( arr ) {\n\t\t\tif ( core_indexOf ) {\n\t\t\t\treturn core_indexOf.call( arr, elem, i );\n\t\t\t}\n\n\t\t\tlen = arr.length;\n\t\t\ti = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t// Skip accessing in sparse arrays\n\t\t\t\tif ( i in arr && arr[ i ] === elem ) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar l = second.length,\n\t\t\ti = first.length,\n\t\t\tj = 0;\n\n\t\tif ( typeof l === \"number\" ) {\n\t\t\tfor ( ; j < l; j++ ) {\n\t\t\t\tfirst[ i++ ] = second[ j ];\n\t\t\t}\n\n\t\t} else {\n\t\t\twhile ( second[j] !== undefined ) {\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t\t}\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, inv ) {\n\t\tvar retVal,\n\t\t\tret = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length;\n\t\tinv = !!inv;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tretVal = !!callback( elems[ i ], i );\n\t\t\tif ( inv !== retVal ) {\n\t\t\t\tret.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value, key,\n\t\t\tret = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\t// jquery objects are treated as arrays\n\t\t\tisArray = elems instanceof jQuery || length !== undefined && typeof length === \"number\" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;\n\n\t\t// Go through the array, translating each of the items to their\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( key in elems ) {\n\t\t\t\tvalue = callback( elems[ key ], key, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn ret.concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar tmp, args, proxy;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = core_slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context, args.concat( core_slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\t// Multifunctional method to get and set values of a collection\n\t// The value/s can optionally be executed if it's a function\n\taccess: function( elems, fn, key, value, chainable, emptyGet, pass ) {\n\t\tvar exec,\n\t\t\tbulk = key == null,\n\t\t\ti = 0,\n\t\t\tlength = elems.length;\n\n\t\t// Sets many values\n\t\tif ( key && typeof key === \"object\" ) {\n\t\t\tfor ( i in key ) {\n\t\t\t\tjQuery.access( elems, fn, i, key[i], 1, emptyGet, value );\n\t\t\t}\n\t\t\tchainable = 1;\n\n\t\t// Sets one value\n\t\t} else if ( value !== undefined ) {\n\t\t\t// Optionally, function values get executed if exec is true\n\t\t\texec = pass === undefined && jQuery.isFunction( value );\n\n\t\t\tif ( bulk ) {\n\t\t\t\t// Bulk operations only iterate when executing function values\n\t\t\t\tif ( exec ) {\n\t\t\t\t\texec = fn;\n\t\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\t\treturn exec.call( jQuery( elem ), value );\n\t\t\t\t\t};\n\n\t\t\t\t// Otherwise they run against the entire set\n\t\t\t\t} else {\n\t\t\t\t\tfn.call( elems, value );\n\t\t\t\t\tfn = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( fn ) {\n\t\t\t\tfor (; i < length; i++ ) {\n\t\t\t\t\tfn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tchainable = 1;\n\t\t}\n\n\t\treturn chainable ?\n\t\t\telems :\n\n\t\t\t// Gets\n\t\t\tbulk ?\n\t\t\t\tfn.call( elems ) :\n\t\t\t\tlength ? fn( elems[0], key ) : emptyGet;\n\t},\n\n\tnow: function() {\n\t\treturn ( new Date() ).getTime();\n\t}\n});\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called after the\n\t\t// browser event has already occurred.\n\t\tif ( document.readyState === \"complete\" || ( document.readyState !== \"loading\" && document.addEventListener ) ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\tsetTimeout( jQuery.ready, 1 );\n\n\t\t// Standards-based browsers support DOMContentLoaded\n\t\t} else if ( document.addEventListener ) {\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", jQuery.ready, false );\n\n\t\t// If IE event model is used\n\t\t} else {\n\t\t\t// Ensure firing before onload, maybe late but safe also for iframes\n\t\t\tdocument.attachEvent( \"onreadystatechange\", DOMContentLoaded );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.attachEvent( \"onload\", jQuery.ready );\n\n\t\t\t// If IE and not a frame\n\t\t\t// continually check to see if the document is ready\n\t\t\tvar top = false;\n\n\t\t\ttry {\n\t\t\t\ttop = window.frameElement == null && document.documentElement;\n\t\t\t} catch(e) {}\n\n\t\t\tif ( top && top.doScroll ) {\n\t\t\t\t(function doScrollCheck() {\n\t\t\t\t\tif ( !jQuery.isReady ) {\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Use the trick by Diego Perini\n\t\t\t\t\t\t\t// http://javascript.nwbox.com/IEContentLoaded/\n\t\t\t\t\t\t\ttop.doScroll(\"left\");\n\t\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t\treturn setTimeout( doScrollCheck, 50 );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// and execute any waiting functions\n\t\t\t\t\t\tjQuery.ready();\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t}\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\n// All jQuery objects should point back to these\nrootjQuery = jQuery(document);\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.split( core_rspace ), 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\tif ( jQuery.isFunction( arg ) && ( !options.unique || !self.has( arg ) ) ) {\n\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t} else if ( arg && arg.length ) {\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// Control if a given callback is in the list\n\t\t\thas: function( fn ) {\n\t\t\t\treturn jQuery.inArray( fn, list ) > -1;\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\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\targs = args || [];\n\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\tif ( list && ( !fired || stack ) ) {\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tstack.push( args );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfire( args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\njQuery.extend({\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks(\"memory\") ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar action = tuple[ 0 ],\n\t\t\t\t\t\t\t\tfn = 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] ]( jQuery.isFunction( fn ) ?\n\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\tvar returned = fn.apply( this, arguments );\n\t\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject )\n\t\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify );\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tnewDefer[ action + \"With\" ]( this === deferred ? newDefer : this, [ returned ] );\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\tnewDefer[ action ]\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 typeof obj === \"object\" ? 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 ] = list.fire\n\t\t\tdeferred[ tuple[0] ] = list.fire;\n\t\t\tdeferred[ tuple[0] + \"With\" ] = list.fireWith;\n\t\t});\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = core_slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred. If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;\n\t\t\t\t\tif( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\t\t\t\t\t} else if ( !( --remaining ) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject )\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// if we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n});\njQuery.support = (function() {\n\n\tvar support,\n\t\tall,\n\t\ta,\n\t\tselect,\n\t\topt,\n\t\tinput,\n\t\tfragment,\n\t\teventName,\n\t\ti,\n\t\tisSupported,\n\t\tclickFn,\n\t\tdiv = document.createElement(\"div\");\n\n\t// Preliminary tests\n\tdiv.setAttribute( \"className\", \"t\" );\n\tdiv.innerHTML = \"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n\n\tall = div.getElementsByTagName(\"*\");\n\ta = div.getElementsByTagName(\"a\")[ 0 ];\n\ta.style.cssText = \"top:1px;float:left;opacity:.5\";\n\n\t// Can't get basic test support\n\tif ( !all || !all.length || !a ) {\n\t\treturn {};\n\t}\n\n\t// First batch of supports tests\n\tselect = document.createElement(\"select\");\n\topt = select.appendChild( document.createElement(\"option\") );\n\tinput = div.getElementsByTagName(\"input\")[ 0 ];\n\n\tsupport = {\n\t\t// IE strips leading whitespace when .innerHTML is used\n\t\tleadingWhitespace: ( div.firstChild.nodeType === 3 ),\n\n\t\t// Make sure that tbody elements aren't automatically inserted\n\t\t// IE will insert them into empty tables\n\t\ttbody: !div.getElementsByTagName(\"tbody\").length,\n\n\t\t// Make sure that link elements get serialized correctly by innerHTML\n\t\t// This requires a wrapper element in IE\n\t\thtmlSerialize: !!div.getElementsByTagName(\"link\").length,\n\n\t\t// Get the style information from getAttribute\n\t\t// (IE uses .cssText instead)\n\t\tstyle: /top/.test( a.getAttribute(\"style\") ),\n\n\t\t// Make sure that URLs aren't manipulated\n\t\t// (IE normalizes it by default)\n\t\threfNormalized: ( a.getAttribute(\"href\") === \"/a\" ),\n\n\t\t// Make sure that element opacity exists\n\t\t// (IE uses filter instead)\n\t\t// Use a regex to work around a WebKit issue. See #5145\n\t\topacity: /^0.5/.test( a.style.opacity ),\n\n\t\t// Verify style float existence\n\t\t// (IE uses styleFloat instead of cssFloat)\n\t\tcssFloat: !!a.style.cssFloat,\n\n\t\t// Make sure that if no value is specified for a checkbox\n\t\t// that it defaults to \"on\".\n\t\t// (WebKit defaults to \"\" instead)\n\t\tcheckOn: ( input.value === \"on\" ),\n\n\t\t// Make sure that a selected-by-default option has a working selected property.\n\t\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n\t\toptSelected: opt.selected,\n\n\t\t// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\n\t\tgetSetAttribute: div.className !== \"t\",\n\n\t\t// Tests for enctype support on a form(#6743)\n\t\tenctype: !!document.createElement(\"form\").enctype,\n\n\t\t// Makes sure cloning an html5 element does not cause problems\n\t\t// Where outerHTML is undefined, this still works\n\t\thtml5Clone: document.createElement(\"nav\").cloneNode( true ).outerHTML !== \"<:nav></:nav>\",\n\n\t\t// jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode\n\t\tboxModel: ( document.compatMode === \"CSS1Compat\" ),\n\n\t\t// Will be defined later\n\t\tsubmitBubbles: true,\n\t\tchangeBubbles: true,\n\t\tfocusinBubbles: false,\n\t\tdeleteExpando: true,\n\t\tnoCloneEvent: true,\n\t\tinlineBlockNeedsLayout: false,\n\t\tshrinkWrapBlocks: false,\n\t\treliableMarginRight: true,\n\t\tboxSizingReliable: true,\n\t\tpixelPosition: false\n\t};\n\n\t// Make sure checked status is properly cloned\n\tinput.checked = true;\n\tsupport.noCloneChecked = input.cloneNode( true ).checked;\n\n\t// Make sure that the options inside disabled selects aren't marked as disabled\n\t// (WebKit marks them as disabled)\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Test to see if it's possible to delete an expando from an element\n\t// Fails in Internet Explorer\n\ttry {\n\t\tdelete div.test;\n\t} catch( e ) {\n\t\tsupport.deleteExpando = false;\n\t}\n\n\tif ( !div.addEventListener && div.attachEvent && div.fireEvent ) {\n\t\tdiv.attachEvent( \"onclick\", clickFn = function() {\n\t\t\t// Cloning a node shouldn't copy over any\n\t\t\t// bound event handlers (IE does this)\n\t\t\tsupport.noCloneEvent = false;\n\t\t});\n\t\tdiv.cloneNode( true ).fireEvent(\"onclick\");\n\t\tdiv.detachEvent( \"onclick\", clickFn );\n\t}\n\n\t// Check if a radio maintains its value\n\t// after being appended to the DOM\n\tinput = document.createElement(\"input\");\n\tinput.value = \"t\";\n\tinput.setAttribute( \"type\", \"radio\" );\n\tsupport.radioValue = input.value === \"t\";\n\n\tinput.setAttribute( \"checked\", \"checked\" );\n\n\t// #11217 - WebKit loses check when the name is after the checked attribute\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\tfragment = document.createDocumentFragment();\n\tfragment.appendChild( div.lastChild );\n\n\t// WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Check if a disconnected checkbox will retain its checked\n\t// value of true after appended to the DOM (IE6/7)\n\tsupport.appendChecked = input.checked;\n\n\tfragment.removeChild( input );\n\tfragment.appendChild( div );\n\n\t// Technique from Juriy Zaytsev\n\t// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/\n\t// We only care about the case where non-standard event systems\n\t// are used, namely in IE. Short-circuiting here helps us to\n\t// avoid an eval call (in setAttribute) which can cause CSP\n\t// to go haywire. See: https://developer.mozilla.org/en/Security/CSP\n\tif ( div.attachEvent ) {\n\t\tfor ( i in {\n\t\t\tsubmit: true,\n\t\t\tchange: true,\n\t\t\tfocusin: true\n\t\t}) {\n\t\t\teventName = \"on\" + i;\n\t\t\tisSupported = ( eventName in div );\n\t\t\tif ( !isSupported ) {\n\t\t\t\tdiv.setAttribute( eventName, \"return;\" );\n\t\t\t\tisSupported = ( typeof div[ eventName ] === \"function\" );\n\t\t\t}\n\t\t\tsupport[ i + \"Bubbles\" ] = isSupported;\n\t\t}\n\t}\n\n\t// Run tests that need a body at doc ready\n\tjQuery(function() {\n\t\tvar container, div, tds, marginDiv,\n\t\t\tdivReset = \"padding:0;margin:0;border:0;display:block;overflow:hidden;\",\n\t\t\tbody = document.getElementsByTagName(\"body\")[0];\n\n\t\tif ( !body ) {\n\t\t\t// Return for frameset docs that don't have a body\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer = document.createElement(\"div\");\n\t\tcontainer.style.cssText = \"visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px\";\n\t\tbody.insertBefore( container, body.firstChild );\n\n\t\t// Construct the test element\n\t\tdiv = document.createElement(\"div\");\n\t\tcontainer.appendChild( div );\n\n\t\t// Check if table cells still have offsetWidth/Height when they are set\n\t\t// to display:none and there are still other visible table cells in a\n\t\t// table row; if so, offsetWidth/Height are not reliable for use when\n\t\t// determining if an element has been hidden directly using\n\t\t// display:none (it is still safe to use offsets if a parent element is\n\t\t// hidden; don safety goggles and see bug #4512 for more information).\n\t\t// (only IE 8 fails this test)\n\t\tdiv.innerHTML = \"<table><tr><td></td><td>t</td></tr></table>\";\n\t\ttds = div.getElementsByTagName(\"td\");\n\t\ttds[ 0 ].style.cssText = \"padding:0;margin:0;border:0;display:none\";\n\t\tisSupported = ( tds[ 0 ].offsetHeight === 0 );\n\n\t\ttds[ 0 ].style.display = \"\";\n\t\ttds[ 1 ].style.display = \"none\";\n\n\t\t// Check if empty table cells still have offsetWidth/Height\n\t\t// (IE <= 8 fail this test)\n\t\tsupport.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );\n\n\t\t// Check box-sizing and margin behavior\n\t\tdiv.innerHTML = \"\";\n\t\tdiv.style.cssText = \"box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;\";\n\t\tsupport.boxSizing = ( div.offsetWidth === 4 );\n\t\tsupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );\n\n\t\t// NOTE: To any future maintainer, window.getComputedStyle was used here\n\t\t// instead of getComputedStyle because it gave a better gzip size.\n\t\t// The difference between window.getComputedStyle and getComputedStyle is\n\t\t// 7 bytes\n\t\tif ( window.getComputedStyle ) {\n\t\t\tsupport.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== \"1%\";\n\t\t\tsupport.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: \"4px\" } ).width === \"4px\";\n\n\t\t\t// Check if div with explicit width and no margin-right incorrectly\n\t\t\t// gets computed margin-right based on width of container. For more\n\t\t\t// info see bug #3333\n\t\t\t// Fails in WebKit before Feb 2011 nightlies\n\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\tmarginDiv = document.createElement(\"div\");\n\t\t\tmarginDiv.style.cssText = div.style.cssText = divReset;\n\t\t\tmarginDiv.style.marginRight = marginDiv.style.width = \"0\";\n\t\t\tdiv.style.width = \"1px\";\n\t\t\tdiv.appendChild( marginDiv );\n\t\t\tsupport.reliableMarginRight =\n\t\t\t\t!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );\n\t\t}\n\n\t\tif ( typeof div.style.zoom !== \"undefined\" ) {\n\t\t\t// Check if natively block-level elements act like inline-block\n\t\t\t// elements when setting their display to 'inline' and giving\n\t\t\t// them layout\n\t\t\t// (IE < 8 does this)\n\t\t\tdiv.innerHTML = \"\";\n\t\t\tdiv.style.cssText = divReset + \"width:1px;padding:1px;display:inline;zoom:1\";\n\t\t\tsupport.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );\n\n\t\t\t// Check if elements with layout shrink-wrap their children\n\t\t\t// (IE 6 does this)\n\t\t\tdiv.style.display = \"block\";\n\t\t\tdiv.style.overflow = \"visible\";\n\t\t\tdiv.innerHTML = \"<div></div>\";\n\t\t\tdiv.firstChild.style.width = \"5px\";\n\t\t\tsupport.shrinkWrapBlocks = ( div.offsetWidth !== 3 );\n\n\t\t\tcontainer.style.zoom = 1;\n\t\t}\n\n\t\t// Null elements to avoid leaks in IE\n\t\tbody.removeChild( container );\n\t\tcontainer = div = tds = marginDiv = null;\n\t});\n\n\t// Null elements to avoid leaks in IE\n\tfragment.removeChild( div );\n\tall = a = select = opt = input = fragment = div = null;\n\n\treturn support;\n})();\nvar rbrace = /^(?:\\{.*\\}|\\[.*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\njQuery.extend({\n\tcache: {},\n\n\tdeletedIds: [],\n\n\t// Please use with caution\n\tuuid: 0,\n\n\t// Unique for each copy of jQuery on the page\n\t// Non-digits removed to match rinlinejQuery\n\texpando: \"jQuery\" + ( jQuery.fn.jquery + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// The following elements throw uncatchable exceptions if you\n\t// attempt to add expando properties to them.\n\tnoData: {\n\t\t\"embed\": true,\n\t\t// Ban all objects except for Flash (which handle expandos)\n\t\t\"object\": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",\n\t\t\"applet\": true\n\t},\n\n\thasData: function( elem ) {\n\t\telem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];\n\t\treturn !!elem && !isEmptyDataObject( elem );\n\t},\n\n\tdata: function( elem, name, data, pvt /* Internal Use Only */ ) {\n\t\tif ( !jQuery.acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar thisCache, ret,\n\t\t\tinternalKey = jQuery.expando,\n\t\t\tgetByName = typeof name === \"string\",\n\n\t\t\t// We have to handle DOM nodes and JS objects differently because IE6-7\n\t\t\t// can't GC object references properly across the DOM-JS boundary\n\t\t\tisNode = elem.nodeType,\n\n\t\t\t// Only DOM nodes need the global jQuery cache; JS object data is\n\t\t\t// attached directly to the object so GC can occur automatically\n\t\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t\t// Only defining an ID for JS objects if its cache already exists allows\n\t\t\t// the code to shortcut on the same path as a DOM node with no cache\n\t\t\tid = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;\n\n\t\t// Avoid doing any more work than we need to when trying to get data on an\n\t\t// object that has no data at all\n\t\tif ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !id ) {\n\t\t\t// Only DOM nodes need a new unique ID for each element since their data\n\t\t\t// ends up in the global cache\n\t\t\tif ( isNode ) {\n\t\t\t\telem[ internalKey ] = id = jQuery.deletedIds.pop() || ++jQuery.uuid;\n\t\t\t} else {\n\t\t\t\tid = internalKey;\n\t\t\t}\n\t\t}\n\n\t\tif ( !cache[ id ] ) {\n\t\t\tcache[ id ] = {};\n\n\t\t\t// Avoids exposing jQuery metadata on plain JS objects when the object\n\t\t\t// is serialized using JSON.stringify\n\t\t\tif ( !isNode ) {\n\t\t\t\tcache[ id ].toJSON = jQuery.noop;\n\t\t\t}\n\t\t}\n\n\t\t// An object can be passed to jQuery.data instead of a key/value pair; this gets\n\t\t// shallow copied over onto the existing cache\n\t\tif ( typeof name === \"object\" || typeof name === \"function\" ) {\n\t\t\tif ( pvt ) {\n\t\t\t\tcache[ id ] = jQuery.extend( cache[ id ], name );\n\t\t\t} else {\n\t\t\t\tcache[ id ].data = jQuery.extend( cache[ id ].data, name );\n\t\t\t}\n\t\t}\n\n\t\tthisCache = cache[ id ];\n\n\t\t// jQuery data() is stored in a separate object inside the object's internal data\n\t\t// cache in order to avoid key collisions between internal data and user-defined\n\t\t// data.\n\t\tif ( !pvt ) {\n\t\t\tif ( !thisCache.data ) {\n\t\t\t\tthisCache.data = {};\n\t\t\t}\n\n\t\t\tthisCache = thisCache.data;\n\t\t}\n\n\t\tif ( data !== undefined ) {\n\t\t\tthisCache[ jQuery.camelCase( name ) ] = data;\n\t\t}\n\n\t\t// Check for both converted-to-camel and non-converted data property names\n\t\t// If a data property was specified\n\t\tif ( getByName ) {\n\n\t\t\t// First Try to find as-is property data\n\t\t\tret = thisCache[ name ];\n\n\t\t\t// Test for null|undefined property data\n\t\t\tif ( ret == null ) {\n\n\t\t\t\t// Try to find the camelCased property\n\t\t\t\tret = thisCache[ jQuery.camelCase( name ) ];\n\t\t\t}\n\t\t} else {\n\t\t\tret = thisCache;\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tremoveData: function( elem, name, pvt /* Internal Use Only */ ) {\n\t\tif ( !jQuery.acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar thisCache, i, l,\n\n\t\t\tisNode = elem.nodeType,\n\n\t\t\t// See jQuery.data for more information\n\t\t\tcache = isNode ? jQuery.cache : elem,\n\t\t\tid = isNode ? elem[ jQuery.expando ] : jQuery.expando;\n\n\t\t// If there is already no cache entry for this object, there is no\n\t\t// purpose in continuing\n\t\tif ( !cache[ id ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( name ) {\n\n\t\t\tthisCache = pvt ? cache[ id ] : cache[ id ].data;\n\n\t\t\tif ( thisCache ) {\n\n\t\t\t\t// Support array or space separated string names for data keys\n\t\t\t\tif ( !jQuery.isArray( name ) ) {\n\n\t\t\t\t\t// try the string as a key before any manipulation\n\t\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\t\tname = [ name ];\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// split the camel cased version by spaces unless a key with the spaces exists\n\t\t\t\t\t\tname = jQuery.camelCase( name );\n\t\t\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\t\t\tname = [ name ];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tname = name.split(\" \");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 0, l = name.length; i < l; i++ ) {\n\t\t\t\t\tdelete thisCache[ name[i] ];\n\t\t\t\t}\n\n\t\t\t\t// If there is no data left in the cache, we want to continue\n\t\t\t\t// and let the cache object itself get destroyed\n\t\t\t\tif ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// See jQuery.data for more information\n\t\tif ( !pvt ) {\n\t\t\tdelete cache[ id ].data;\n\n\t\t\t// Don't destroy the parent cache unless the internal data object\n\t\t\t// had been the only thing left in it\n\t\t\tif ( !isEmptyDataObject( cache[ id ] ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Destroy the cache\n\t\tif ( isNode ) {\n\t\t\tjQuery.cleanData( [ elem ], true );\n\n\t\t// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)\n\t\t} else if ( jQuery.support.deleteExpando || cache != cache.window ) {\n\t\t\tdelete cache[ id ];\n\n\t\t// When all else fails, null\n\t\t} else {\n\t\t\tcache[ id ] = null;\n\t\t}\n\t},\n\n\t// For internal use only.\n\t_data: function( elem, name, data ) {\n\t\treturn jQuery.data( elem, name, data, true );\n\t},\n\n\t// A method for determining if a DOM node can handle the data expando\n\tacceptData: function( elem ) {\n\t\tvar noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];\n\n\t\t// nodes accept data unless otherwise specified; rejection can be conditional\n\t\treturn !noData || noData !== true && elem.getAttribute(\"classid\") === noData;\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar parts, part, attr, name, l,\n\t\t\telem = this[0],\n\t\t\ti = 0,\n\t\t\tdata = null;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = jQuery.data( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !jQuery._data( elem, \"parsedAttrs\" ) ) {\n\t\t\t\t\tattr = elem.attributes;\n\t\t\t\t\tfor ( l = attr.length; i < l; i++ ) {\n\t\t\t\t\t\tname = attr[i].name;\n\n\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\tname = jQuery.camelCase( name.substring(5) );\n\n\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tjQuery._data( elem, \"parsedAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery.data( this, key );\n\t\t\t});\n\t\t}\n\n\t\tparts = key.split( \".\", 2 );\n\t\tparts[1] = parts[1] ? \".\" + parts[1] : \"\";\n\t\tpart = parts[1] + \"!\";\n\n\t\treturn jQuery.access( this, function( value ) {\n\n\t\t\tif ( value === undefined ) {\n\t\t\t\tdata = this.triggerHandler( \"getData\" + part, [ parts[0] ] );\n\n\t\t\t\t// Try to fetch any internally stored data first\n\t\t\t\tif ( data === undefined && elem ) {\n\t\t\t\t\tdata = jQuery.data( elem, key );\n\t\t\t\t\tdata = dataAttr( elem, key, data );\n\t\t\t\t}\n\n\t\t\t\treturn data === undefined && parts[1] ?\n\t\t\t\t\tthis.data( parts[0] ) :\n\t\t\t\t\tdata;\n\t\t\t}\n\n\t\t\tparts[1] = value;\n\t\t\tthis.each(function() {\n\t\t\t\tvar self = jQuery( this );\n\n\t\t\t\tself.triggerHandler( \"setData\" + part, parts );\n\t\t\t\tjQuery.data( this, key, value );\n\t\t\t\tself.triggerHandler( \"changeData\" + part, parts );\n\t\t\t});\n\t\t}, null, value, arguments.length > 1, null, false );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeData( this, key );\n\t\t});\n\t}\n});\n\nfunction dataAttr( elem, key, data ) {\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\n\t\tvar name = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\tdata === \"false\" ? false :\n\t\t\t\tdata === \"null\" ? null :\n\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tjQuery.data( elem, key, data );\n\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\n\treturn data;\n}\n\n// checks a cache object for emptiness\nfunction isEmptyDataObject( obj ) {\n\tvar name;\n\tfor ( name in obj ) {\n\n\t\t// if the public data object is empty, the private is still empty\n\t\tif ( name === \"data\" && jQuery.isEmptyObject( obj[name] ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( name !== \"toJSON\" ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\njQuery.extend({\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = jQuery._data( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray(data) ) {\n\t\t\t\t\tqueue = jQuery._data( elem, type, jQuery.makeArray(data) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\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}\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\t\tif ( !queue.length && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// not intended for public consumption - generates a queueHooks object, or returns the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn jQuery._data( elem, key ) || jQuery._data( elem, key, {\n\t\t\tempty: jQuery.Callbacks(\"once memory\").add(function() {\n\t\t\t\tjQuery.removeData( elem, type + \"queue\", true );\n\t\t\t\tjQuery.removeData( elem, key, true );\n\t\t\t})\n\t\t});\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\t// Based off of the plugin by Clint Helfers, with permission.\n\t// http://blindsignals.com/index.php/2009/07/jquery-delay/\n\tdelay: function( time, type ) {\n\t\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\t\ttype = type || \"fx\";\n\n\t\treturn this.queue( type, function( next, hooks ) {\n\t\t\tvar timeout = setTimeout( next, time );\n\t\t\thooks.stop = function() {\n\t\t\t\tclearTimeout( timeout );\n\t\t\t};\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile( i-- ) {\n\t\t\tif ( (tmp = jQuery._data( elements[ i ], type + \"queueHooks\" )) && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n});\nvar nodeHook, boolHook, fixSpecified,\n\trclass = /[\\t\\r\\n]/g,\n\trreturn = /\\r/g,\n\trtype = /^(?:button|input)$/i,\n\trfocusable = /^(?:button|input|object|select|textarea)$/i,\n\trclickable = /^a(?:rea|)$/i,\n\trboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,\n\tgetSetAttribute = jQuery.support.getSetAttribute;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t});\n\t},\n\n\tprop: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\tname = jQuery.propFix[ name ] || name;\n\t\treturn this.each(function() {\n\t\t\t// try/catch handles cases where IE balks (such as removing a property on window)\n\t\t\ttry {\n\t\t\t\tthis[ name ] = undefined;\n\t\t\t\tdelete this[ name ];\n\t\t\t} catch( e ) {}\n\t\t});\n\t},\n\n\taddClass: function( value ) {\n\t\tvar classNames, i, l, elem,\n\t\t\tsetClass, c, cl;\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 ( value && typeof value === \"string\" ) {\n\t\t\tclassNames = value.split( core_rspace );\n\n\t\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\telem = this[ i ];\n\n\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\tif ( !elem.className && classNames.length === 1 ) {\n\t\t\t\t\t\telem.className = value;\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetClass = \" \" + elem.className + \" \";\n\n\t\t\t\t\t\tfor ( c = 0, cl = classNames.length; c < cl; c++ ) {\n\t\t\t\t\t\t\tif ( !~setClass.indexOf( \" \" + classNames[ c ] + \" \" ) ) {\n\t\t\t\t\t\t\t\tsetClass += classNames[ c ] + \" \";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telem.className = jQuery.trim( setClass );\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 removes, className, elem, c, cl, i, l;\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 ( (value && typeof value === \"string\") || value === undefined ) {\n\t\t\tremoves = ( value || \"\" ).split( core_rspace );\n\n\t\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\tif ( elem.nodeType === 1 && elem.className ) {\n\n\t\t\t\t\tclassName = (\" \" + elem.className + \" \").replace( rclass, \" \" );\n\n\t\t\t\t\t// loop over each item in the removal list\n\t\t\t\t\tfor ( c = 0, cl = removes.length; c < cl; c++ ) {\n\t\t\t\t\t\t// Remove until there is nothing to remove,\n\t\t\t\t\t\twhile ( className.indexOf(\" \" + removes[ c ] + \" \") > -1 ) {\n\t\t\t\t\t\t\tclassName = className.replace( \" \" + removes[ c ] + \" \" , \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telem.className = value ? jQuery.trim( className ) : \"\";\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\t\t\tisBool = typeof stateVal === \"boolean\";\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\tstate = stateVal,\n\t\t\t\t\tclassNames = value.split( core_rspace );\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\tstate = isBool ? state : !self.hasClass( className );\n\t\t\t\t\tself[ state ? \"addClass\" : \"removeClass\" ]( className );\n\t\t\t\t}\n\n\t\t\t} else if ( type === \"undefined\" || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tjQuery._data( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// toggle whole className\n\t\t\t\tthis.className = this.className || value === false ? \"\" : jQuery._data( 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 ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\tval: function( value ) {\n\t\tvar hooks, ret, isFunction,\n\t\t\telem = this[0];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\t\t\t\t\t// handle most common string cases\n\t\t\t\t\tret.replace(rreturn, \"\") :\n\t\t\t\t\t// handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each(function( i ) {\n\t\t\tvar val,\n\t\t\t\tself = jQuery(this);\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, self.val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map(val, function ( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// attributes.value is undefined in Blackberry 4.7 but\n\t\t\t\t// uses .value. See #6932\n\t\t\t\tvar val = elem.attributes.value;\n\t\t\t\treturn !val || val.specified ? elem.value : elem.text;\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, i, max, option,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tvalues = [],\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tone = elem.type === \"select-one\";\n\n\t\t\t\t// Nothing was selected\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\ti = one ? index : 0;\n\t\t\t\tmax = one ? index + 1 : options.length;\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\tif ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null) &&\n\t\t\t\t\t\t\t(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" )) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Fixes Bug #2551 -- select.val() broken in IE after form.reset()\n\t\t\t\tif ( one && !values.length && options.length ) {\n\t\t\t\t\treturn jQuery( options[ index ] ).val();\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 values = jQuery.makeArray( value );\n\n\t\t\t\tjQuery(elem).find(\"option\").each(function() {\n\t\t\t\t\tthis.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;\n\t\t\t\t});\n\n\t\t\t\tif ( !values.length ) {\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\t// Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9\n\tattrFn: {},\n\n\tattr: function( elem, name, value, pass ) {\n\t\tvar ret, hooks, notxml,\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\tif ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {\n\t\t\treturn jQuery( elem )[ name ]( value );\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\t// All attributes are lowercase\n\t\t// Grab necessary hook if one is defined\n\t\tif ( notxml ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] || ( rboolean.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\t\t\t\treturn;\n\n\t\t\t} else if ( hooks && \"set\" in hooks && notxml && (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 && notxml && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\treturn ret;\n\n\t\t} else {\n\n\t\t\tret = elem.getAttribute( 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 propName, attrNames, name, isBool,\n\t\t\ti = 0;\n\n\t\tif ( value && elem.nodeType === 1 ) {\n\n\t\t\tattrNames = value.split( core_rspace );\n\n\t\t\tfor ( ; i < attrNames.length; i++ ) {\n\t\t\t\tname = attrNames[ i ];\n\n\t\t\t\tif ( name ) {\n\t\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\t\t\t\t\tisBool = rboolean.test( name );\n\n\t\t\t\t\t// See #9699 for explanation of this approach (setting first, then removal)\n\t\t\t\t\t// Do not do this for boolean attributes (see #10870)\n\t\t\t\t\tif ( !isBool ) {\n\t\t\t\t\t\tjQuery.attr( elem, name, \"\" );\n\t\t\t\t\t}\n\t\t\t\t\telem.removeAttribute( getSetAttribute ? name : propName );\n\n\t\t\t\t\t// Set corresponding property to false for boolean attributes\n\t\t\t\t\tif ( isBool && propName in elem ) {\n\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t}\n\t\t\t\t}\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\t// We can't allow the type property to be changed (since it causes problems in IE)\n\t\t\t\tif ( rtype.test( elem.nodeName ) && elem.parentNode ) {\n\t\t\t\t\tjQuery.error( \"type property can't be changed\" );\n\t\t\t\t} else if ( !jQuery.support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\n\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE6-9\n\t\t\t\t\t// Reset value to it's default in case type is set after value\n\t\t\t\t\t// This is for element creation\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Use the value property for back compat\n\t\t// Use the nodeHook for button elements in IE6/7 (#1954)\n\t\tvalue: {\n\t\t\tget: function( elem, name ) {\n\t\t\t\tif ( nodeHook && jQuery.nodeName( elem, \"button\" ) ) {\n\t\t\t\t\treturn nodeHook.get( elem, name );\n\t\t\t\t}\n\t\t\t\treturn name in elem ?\n\t\t\t\t\telem.value :\n\t\t\t\t\tnull;\n\t\t\t},\n\t\t\tset: function( elem, value, name ) {\n\t\t\t\tif ( nodeHook && jQuery.nodeName( elem, \"button\" ) ) {\n\t\t\t\t\treturn nodeHook.set( elem, value, name );\n\t\t\t\t}\n\t\t\t\t// Does not return so that setAttribute is also used\n\t\t\t\telem.value = value;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\ttabindex: \"tabIndex\",\n\t\treadonly: \"readOnly\",\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\",\n\t\tmaxlength: \"maxLength\",\n\t\tcellspacing: \"cellSpacing\",\n\t\tcellpadding: \"cellPadding\",\n\t\trowspan: \"rowSpan\",\n\t\tcolspan: \"colSpan\",\n\t\tusemap: \"useMap\",\n\t\tframeborder: \"frameBorder\",\n\t\tcontenteditable: \"contentEditable\"\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\tif ( 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\treturn ( elem[ name ] = value );\n\t\t\t}\n\n\t\t} else {\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\treturn elem[ name ];\n\t\t\t}\n\t\t}\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set\n\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\tvar attributeNode = elem.getAttributeNode(\"tabindex\");\n\n\t\t\t\treturn attributeNode && attributeNode.specified ?\n\t\t\t\t\tparseInt( attributeNode.value, 10 ) :\n\t\t\t\t\trfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tundefined;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Hook for boolean attributes\nboolHook = {\n\tget: function( elem, name ) {\n\t\t// Align boolean attributes with corresponding properties\n\t\t// Fall back to attribute presence where some booleans are not supported\n\t\tvar attrNode,\n\t\t\tproperty = jQuery.prop( elem, name );\n\t\treturn property === true || typeof property !== \"boolean\" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?\n\t\t\tname.toLowerCase() :\n\t\t\tundefined;\n\t},\n\tset: function( elem, value, name ) {\n\t\tvar propName;\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\t// value is true since we know at this point it's type boolean and not false\n\t\t\t// Set boolean attributes to the same name and set the DOM property\n\t\t\tpropName = jQuery.propFix[ name ] || name;\n\t\t\tif ( propName in elem ) {\n\t\t\t\t// Only set the IDL specifically if it already exists on the element\n\t\t\t\telem[ propName ] = true;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, name.toLowerCase() );\n\t\t}\n\t\treturn name;\n\t}\n};\n\n// IE6/7 do not support getting/setting some attributes with get/setAttribute\nif ( !getSetAttribute ) {\n\n\tfixSpecified = {\n\t\tname: true,\n\t\tid: true,\n\t\tcoords: true\n\t};\n\n\t// Use this for any attribute in IE6/7\n\t// This fixes almost every IE6/7 issue\n\tnodeHook = jQuery.valHooks.button = {\n\t\tget: function( elem, name ) {\n\t\t\tvar ret;\n\t\t\tret = elem.getAttributeNode( name );\n\t\t\treturn ret && ( fixSpecified[ name ] ? ret.value !== \"\" : ret.specified ) ?\n\t\t\t\tret.value :\n\t\t\t\tundefined;\n\t\t},\n\t\tset: function( elem, value, name ) {\n\t\t\t// Set the existing or create a new attribute node\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\tif ( !ret ) {\n\t\t\t\tret = document.createAttribute( name );\n\t\t\t\telem.setAttributeNode( ret );\n\t\t\t}\n\t\t\treturn ( ret.value = value + \"\" );\n\t\t}\n\t};\n\n\t// Set width and height to auto instead of 0 on empty string( Bug #8150 )\n\t// This is for removals\n\tjQuery.each([ \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\telem.setAttribute( name, \"auto\" );\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n\n\t// Set contenteditable to false on removals(#10429)\n\t// Setting to empty string throws an error as an invalid value\n\tjQuery.attrHooks.contenteditable = {\n\t\tget: nodeHook.get,\n\t\tset: function( elem, value, name ) {\n\t\t\tif ( value === \"\" ) {\n\t\t\t\tvalue = \"false\";\n\t\t\t}\n\t\t\tnodeHook.set( elem, value, name );\n\t\t}\n\t};\n}\n\n\n// Some attributes require a special call on IE\nif ( !jQuery.support.hrefNormalized ) {\n\tjQuery.each([ \"href\", \"src\", \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar ret = elem.getAttribute( name, 2 );\n\t\t\t\treturn ret === null ? undefined : ret;\n\t\t\t}\n\t\t});\n\t});\n}\n\nif ( !jQuery.support.style ) {\n\tjQuery.attrHooks.style = {\n\t\tget: function( elem ) {\n\t\t\t// Return undefined in the case of empty string\n\t\t\t// Normalize to lowercase since IE uppercases css property names\n\t\t\treturn elem.style.cssText.toLowerCase() || undefined;\n\t\t},\n\t\tset: function( elem, value ) {\n\t\t\treturn ( elem.style.cssText = \"\" + value );\n\t\t}\n\t};\n}\n\n// Safari mis-reports the default selected property of an option\n// Accessing the parent's selectedIndex property fixes it\nif ( !jQuery.support.optSelected ) {\n\tjQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\t// Make sure that it also works with optgroups, see #5701\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t});\n}\n\n// IE6/7 call enctype encoding\nif ( !jQuery.support.enctype ) {\n\tjQuery.propFix.enctype = \"encoding\";\n}\n\n// Radios and checkboxes getter/setter\nif ( !jQuery.support.checkOn ) {\n\tjQuery.each([ \"radio\", \"checkbox\" ], function() {\n\t\tjQuery.valHooks[ this ] = {\n\t\t\tget: function( elem ) {\n\t\t\t\t// Handle the case where in Webkit \"\" is returned instead of \"on\" if a value isn't specified\n\t\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t\t}\n\t\t};\n\t});\n}\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = jQuery.extend( jQuery.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});\nvar rformElems = /^(?:textarea|input|select)$/i,\n\trtypenamespace = /^([^\\.]*|)(?:\\.(.+)|)$/,\n\trhoverHack = /(?:^|\\s)hover(\\.\\S+|)\\b/,\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|contextmenu)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\thoverHack = function( events ) {\n\t\treturn jQuery.event.special.hover ? events : events.replace( rhoverHack, \"mouseenter$1 mouseleave$1\" );\n\t};\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\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar elemData, eventHandle, events,\n\t\t\tt, tns, type, namespaces, handleObj,\n\t\t\thandleObjIn, handlers, special;\n\n\t\t// Don't attach events to noData or text/comment nodes (allow plain objects tho)\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {\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\tevents = elemData.events;\n\t\tif ( !events ) {\n\t\t\telemData.events = events = {};\n\t\t}\n\t\teventHandle = elemData.handle;\n\t\tif ( !eventHandle ) {\n\t\t\telemData.handle = eventHandle = 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 !== \"undefined\" && (!e || jQuery.event.triggered !== e.type) ?\n\t\t\t\t\tjQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\n\t\t\t\t\tundefined;\n\t\t\t};\n\t\t\t// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events\n\t\t\teventHandle.elem = elem;\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\t// jQuery(...).bind(\"mouseover mouseout\", fn);\n\t\ttypes = jQuery.trim( hoverHack(types) ).split( \" \" );\n\t\tfor ( t = 0; t < types.length; t++ ) {\n\n\t\t\ttns = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = tns[1];\n\t\t\tnamespaces = ( tns[2] || \"\" ).split( \".\" ).sort();\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: tns[1],\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\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\thandlers = events[ type ];\n\t\t\tif ( !handlers ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener/attachEvent if the special events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\t// Bind the global event handler to the element\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\n\t\t\t\t\t} else if ( elem.attachEvent ) {\n\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t\t// Nullify elem to prevent memory leaks in IE\n\t\telem = null;\n\t},\n\n\tglobal: {},\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 t, tns, type, origType, namespaces, origCount,\n\t\t\tj, events, special, eventType, handleObj,\n\t\t\telemData = jQuery.hasData( elem ) && jQuery._data( elem );\n\n\t\tif ( !elemData || !(events = elemData.events) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = jQuery.trim( hoverHack( types || \"\" ) ).split(\" \");\n\t\tfor ( t = 0; t < types.length; t++ ) {\n\t\t\ttns = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tns[1];\n\t\t\tnamespaces = tns[2];\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\teventType = events[ type ] || [];\n\t\t\torigCount = eventType.length;\n\t\t\tnamespaces = namespaces ? new RegExp(\"(^|\\\\.)\" + namespaces.split(\".\").sort().join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\") : null;\n\n\t\t\t// Remove matching events\n\t\t\tfor ( j = 0; j < eventType.length; j++ ) {\n\t\t\t\thandleObj = eventType[ 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 ( !namespaces || namespaces.test( handleObj.namespace ) ) &&\n\t\t\t\t\t ( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\teventType.splice( j--, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\teventType.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 ( eventType.length === 0 && origCount !== eventType.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\n\t\t\t// removeData also checks for emptiness and clears the expando if empty\n\t\t\t// so use it instead of delete\n\t\t\tjQuery.removeData( elem, \"events\", true );\n\t\t}\n\t},\n\n\t// Events that are safe to short-circuit if no handlers are attached.\n\t// Native DOM events should not be added, they may have inline handlers.\n\tcustomEvent: {\n\t\t\"getData\": true,\n\t\t\"setData\": true,\n\t\t\"changeData\": true\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Event object or event type\n\t\tvar cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType,\n\t\t\ttype = event.type || event,\n\t\t\tnamespaces = [];\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// Exclusive events trigger only for the exact event (no namespaces)\n\t\t\ttype = type.slice(0, -1);\n\t\t\texclusive = true;\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\n\t\tif ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {\n\t\t\t// No jQuery handlers for this event type, and it can't have inline handlers\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an Event, Object, or just an event type string\n\t\tevent = typeof event === \"object\" ?\n\t\t\t// jQuery.Event object\n\t\t\tevent[ jQuery.expando ] ? event :\n\t\t\t// Object literal\n\t\t\tnew jQuery.Event( type, event ) :\n\t\t\t// Just the event type (string)\n\t\t\tnew jQuery.Event( type );\n\n\t\tevent.type = type;\n\t\tevent.isTrigger = true;\n\t\tevent.exclusive = exclusive;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.namespace_re = event.namespace? new RegExp(\"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\") : null;\n\t\tontype = type.indexOf( \":\" ) < 0 ? \"on\" + type : \"\";\n\n\t\t// Handle a global trigger\n\t\tif ( !elem ) {\n\n\t\t\t// TODO: Stop taunting the data cache; remove global events and always attach to document\n\t\t\tcache = jQuery.cache;\n\t\t\tfor ( i in cache ) {\n\t\t\t\tif ( cache[ i ].events && cache[ i ].events[ type ] ) {\n\t\t\t\t\tjQuery.event.trigger( event, data, cache[ i ].handle.elem, true );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\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 ? jQuery.makeArray( data ) : [];\n\t\tdata.unshift( event );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( 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\teventPath = [[ elem, special.bindType || type ]];\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tcur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;\n\t\t\tfor ( old = elem; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push([ cur, bubbleType ]);\n\t\t\t\told = 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 ( old === (elem.ownerDocument || document) ) {\n\t\t\t\teventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\tfor ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {\n\n\t\t\tcur = eventPath[i][0];\n\t\t\tevent.type = eventPath[i][1];\n\n\t\t\thandle = ( jQuery._data( cur, \"events\" ) || {} )[ event.type ] && jQuery._data( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\t\t\t// Note that this is a bare JS function and not a jQuery handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&\n\t\t\t\t!(type === \"click\" && jQuery.nodeName( elem, \"a\" )) && jQuery.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// Can't use an .isFunction() check here because IE6/7 fails that test.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\t// IE<9 dies on focus/blur to hidden element (#1486)\n\t\t\t\tif ( ontype && elem[ type ] && ((type !== \"focus\" && type !== \"blur\") || event.target.offsetWidth !== 0) && !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\told = elem[ ontype ];\n\n\t\t\t\t\tif ( old ) {\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 ( old ) {\n\t\t\t\t\t\telem[ ontype ] = old;\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 || window.event );\n\n\t\tvar i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related,\n\t\t\thandlers = ( (jQuery._data( this, \"events\" ) || {} )[ event.type ] || []),\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\targs = [].slice.call( arguments ),\n\t\t\trun_all = !event.exclusive && !event.namespace,\n\t\t\tspecial = jQuery.event.special[ event.type ] || {},\n\t\t\thandlerQueue = [];\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 that should run if there are delegated events\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\n\t\tif ( delegateCount && !(event.button && event.type === \"click\") ) {\n\n\t\t\t// Pregenerate a single jQuery object for reuse with .is()\n\t\t\tjqcur = jQuery(this);\n\t\t\tjqcur.context = this;\n\n\t\t\tfor ( cur = event.target; cur != this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't process clicks (ONLY) on disabled elements (#6911, #8165, #xxxx)\n\t\t\t\tif ( cur.disabled !== true || event.type !== \"click\" ) {\n\t\t\t\t\tselMatch = {};\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tjqcur[0] = cur;\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\t\t\t\t\t\tsel = handleObj.selector;\n\n\t\t\t\t\t\tif ( selMatch[ sel ] === undefined ) {\n\t\t\t\t\t\t\tselMatch[ sel ] = jqcur.is( sel );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( selMatch[ 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, matches: 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 ( handlers.length > delegateCount ) {\n\t\t\thandlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });\n\t\t}\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\tfor ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {\n\t\t\tmatched = handlerQueue[ i ];\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tfor ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {\n\t\t\t\thandleObj = matched.matches[ j ];\n\n\t\t\t\t// Triggered event must either 1) be non-exclusive and have no namespace, or\n\t\t\t\t// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.data = handleObj.data;\n\t\t\t\t\tevent.handleObj = handleObj;\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\tevent.result = ret;\n\t\t\t\t\t\tif ( 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\t// Includes some event props shared by KeyEvent and MouseEvent\n\t// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***\n\tprops: \"attrChange attrName relatedNode srcElement 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 fromElement 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\t\t\t\tfromElement = original.fromElement;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX + ( 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 relatedTarget, if necessary\n\t\t\tif ( !event.relatedTarget && fromElement ) {\n\t\t\t\tevent.relatedTarget = fromElement === event.target ? original.toElement : fromElement;\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,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = jQuery.event.fixHooks[ event.type ] || {},\n\t\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = jQuery.Event( originalEvent );\n\n\t\tfor ( i = copy.length; i; ) {\n\t\t\tprop = copy[ --i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)\n\t\tif ( !event.target ) {\n\t\t\tevent.target = originalEvent.srcElement || document;\n\t\t}\n\n\t\t// Target should not be a text node (#504, Safari)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\t// For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)\n\t\tevent.metaKey = !!event.metaKey;\n\n\t\treturn fixHook.filter? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\tspecial: {\n\t\tready: {\n\t\t\t// Make sure the ready event is setup\n\t\t\tsetup: jQuery.bindReady\n\t\t},\n\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\n\t\tfocus: {\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tsetup: function( data, namespaces, eventHandle ) {\n\t\t\t\t// We only want to do this special case on windows\n\t\t\t\tif ( jQuery.isWindow( this ) ) {\n\t\t\t\t\tthis.onbeforeunload = eventHandle;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tteardown: function( namespaces, eventHandle ) {\n\t\t\t\tif ( this.onbeforeunload === eventHandle ) {\n\t\t\t\t\tthis.onbeforeunload = null;\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{ type: 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\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\tfunction( elem, type, handle ) {\n\t\tif ( elem.removeEventListener ) {\n\t\t\telem.removeEventListener( type, handle, false );\n\t\t}\n\t} :\n\tfunction( elem, type, handle ) {\n\t\tvar name = \"on\" + type;\n\n\t\tif ( elem.detachEvent ) {\n\n\t\t\t// #8545, #7054, preventing memory leaks for custom events in IE6-8 –\n\t\t\t// detachEvent needed property on element, by name of that event, to properly expose it to GC\n\t\t\tif ( typeof elem[ name ] === \"undefined\" ) {\n\t\t\t\telem[ name ] = null;\n\t\t\t}\n\n\t\t\telem.detachEvent( name, handle );\n\t\t}\n\t};\n\njQuery.Event = function( src, props ) {\n\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 || src.returnValue === false ||\n\t\t\tsrc.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\nfunction returnFalse() {\n\treturn false;\n}\nfunction returnTrue() {\n\treturn 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\tpreventDefault: function() {\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tvar e = this.originalEvent;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// if preventDefault exists run it on the original event\n\t\tif ( e.preventDefault ) {\n\t\t\te.preventDefault();\n\n\t\t// otherwise set the returnValue property of the original event to false (IE)\n\t\t} else {\n\t\t\te.returnValue = false;\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tvar e = this.originalEvent;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\t\t// if stopPropagation exists run it on the original event\n\t\tif ( e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t\t// otherwise set the cancelBubble property of the original event to true (IE)\n\t\te.cancelBubble = true;\n\t},\n\tstopImmediatePropagation: function() {\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\t\tthis.stopPropagation();\n\t},\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj,\n\t\t\t\tselector = handleObj.selector;\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// IE submit delegation\nif ( !jQuery.support.submitBubbles ) {\n\n\tjQuery.event.special.submit = {\n\t\tsetup: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Lazy-add a submit handler when a descendant form may potentially be submitted\n\t\t\tjQuery.event.add( this, \"click._submit keypress._submit\", function( e ) {\n\t\t\t\t// Node name check avoids a VML-related crash in IE (#9807)\n\t\t\t\tvar elem = e.target,\n\t\t\t\t\tform = jQuery.nodeName( elem, \"input\" ) || jQuery.nodeName( elem, \"button\" ) ? elem.form : undefined;\n\t\t\t\tif ( form && !jQuery._data( form, \"_submit_attached\" ) ) {\n\t\t\t\t\tjQuery.event.add( form, \"submit._submit\", function( event ) {\n\t\t\t\t\t\tevent._submit_bubble = true;\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( form, \"_submit_attached\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t\t// return undefined since we don't need an event listener\n\t\t},\n\n\t\tpostDispatch: function( event ) {\n\t\t\t// If form was submitted by the user, bubble the event up the tree\n\t\t\tif ( event._submit_bubble ) {\n\t\t\t\tdelete event._submit_bubble;\n\t\t\t\tif ( this.parentNode && !event.isTrigger ) {\n\t\t\t\t\tjQuery.event.simulate( \"submit\", this.parentNode, event, true );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Remove delegated handlers; cleanData eventually reaps submit handlers attached above\n\t\t\tjQuery.event.remove( this, \"._submit\" );\n\t\t}\n\t};\n}\n\n// IE change delegation and checkbox/radio fix\nif ( !jQuery.support.changeBubbles ) {\n\n\tjQuery.event.special.change = {\n\n\t\tsetup: function() {\n\n\t\t\tif ( rformElems.test( this.nodeName ) ) {\n\t\t\t\t// IE doesn't fire change on a check/radio until blur; trigger it on click\n\t\t\t\t// after a propertychange. Eat the blur-change in special.change.handle.\n\t\t\t\t// This still fires onchange a second time for check/radio after blur.\n\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\t\t\t\t\tjQuery.event.add( this, \"propertychange._change\", function( event ) {\n\t\t\t\t\t\tif ( event.originalEvent.propertyName === \"checked\" ) {\n\t\t\t\t\t\t\tthis._just_changed = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery.event.add( this, \"click._change\", function( event ) {\n\t\t\t\t\t\tif ( this._just_changed && !event.isTrigger ) {\n\t\t\t\t\t\t\tthis._just_changed = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Allow triggered, simulated change events (#11500)\n\t\t\t\t\t\tjQuery.event.simulate( \"change\", this, event, true );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Delegated event; lazy-add a change handler on descendant inputs\n\t\t\tjQuery.event.add( this, \"beforeactivate._change\", function( e ) {\n\t\t\t\tvar elem = e.target;\n\n\t\t\t\tif ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, \"_change_attached\" ) ) {\n\t\t\t\t\tjQuery.event.add( elem, \"change._change\", function( event ) {\n\t\t\t\t\t\tif ( this.parentNode && !event.isSimulated && !event.isTrigger ) {\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this.parentNode, event, true );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( elem, \"_change_attached\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\thandle: function( event ) {\n\t\t\tvar elem = event.target;\n\n\t\t\t// Swallow native change events from checkbox/radio, we already triggered them above\n\t\t\tif ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== \"radio\" && elem.type !== \"checkbox\") ) {\n\t\t\t\treturn event.handleObj.handler.apply( this, arguments );\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tjQuery.event.remove( this, \"._change\" );\n\n\t\t\treturn rformElems.test( this.nodeName );\n\t\t}\n\t};\n}\n\n// Create \"bubbling\" focus and blur events\nif ( !jQuery.support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler while someone wants focusin/focusout\n\t\tvar attaches = 0,\n\t\t\thandler = function( event ) {\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\t\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tif ( attaches++ === 0 ) {\n\t\t\t\t\tdocument.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tif ( --attaches === 0 ) {\n\t\t\t\t\tdocument.removeEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\njQuery.fn.extend({\n\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n\t\tvar origFn, type;\n\n\t\t// Types can be a map of types/handlers\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-Object, selector, data )\n\t\t\tif ( typeof selector !== \"string\" ) { // && selector != null\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\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\tlive: function( types, data, fn ) {\n\t\tjQuery( this.context ).on( types, this.selector, data, fn );\n\t\treturn this;\n\t},\n\tdie: function( types, fn ) {\n\t\tjQuery( this.context ).off( types, this.selector || \"**\", fn );\n\t\treturn this;\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\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\tif ( this[0] ) {\n\t\t\treturn jQuery.event.trigger( type, data, this[0], true );\n\t\t}\n\t},\n\n\ttoggle: function( fn ) {\n\t\t// Save reference to arguments for access in closure\n\t\tvar args = arguments,\n\t\t\tguid = fn.guid || jQuery.guid++,\n\t\t\ti = 0,\n\t\t\ttoggler = function( event ) {\n\t\t\t\t// Figure out which function to execute\n\t\t\t\tvar lastToggle = ( jQuery._data( this, \"lastToggle\" + fn.guid ) || 0 ) % i;\n\t\t\t\tjQuery._data( this, \"lastToggle\" + fn.guid, lastToggle + 1 );\n\n\t\t\t\t// Make sure that clicks stop\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\t// and execute the function\n\t\t\t\treturn args[ lastToggle ].apply( this, arguments ) || false;\n\t\t\t};\n\n\t\t// link all the functions, so any of them can unbind this click handler\n\t\ttoggler.guid = guid;\n\t\twhile ( i < args.length ) {\n\t\t\targs[ i++ ].guid = guid;\n\t\t}\n\n\t\treturn this.click( toggler );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\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\tif ( fn == null ) {\n\t\t\tfn = data;\n\t\t\tdata = null;\n\t\t}\n\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\tif ( rkeyEvent.test( name ) ) {\n\t\tjQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;\n\t}\n\n\tif ( rmouseEvent.test( name ) ) {\n\t\tjQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;\n\t}\n});\n/*!\n * Sizzle CSS Selector Engine\n *  Copyright 2012 jQuery Foundation and other contributors\n *  Released under the MIT license\n *  http://sizzlejs.com/\n */\n(function( window, undefined ) {\n\nvar cachedruns,\n\tdirruns,\n\tsortOrder,\n\tsiblingCheck,\n\tassertGetIdNotName,\n\n\tdocument = window.document,\n\tdocElem = document.documentElement,\n\n\tstrundefined = \"undefined\",\n\thasDuplicate = false,\n\tbaseHasDuplicate = true,\n\tdone = 0,\n\tslice = [].slice,\n\tpush = [].push,\n\n\texpando = ( \"sizcache\" + Math.random() ).replace( \".\", \"\" ),\n\n\t// Regex\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[-\\\\w]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\n\toperators = \"([*^$|!~]?=)\",\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")\" + whitespace +\n\t\t\"*(?:\" + operators + whitespace + \"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\" + identifier + \")|)|)\" + whitespace + \"*\\\\]\",\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\((?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\2|((?:[^,]|\\\\\\\\,|(?:,(?=[^\\\\[]*\\\\]))|(?:,(?=[^\\\\(]*\\\\))))*))\\\\)|)\",\n\tpos = \":(nth|eq|gt|lt|first|last|even|odd)(?:\\\\((\\\\d*)\\\\)|)(?=[^-]|$)\",\n\tcombinators = whitespace + \"*([\\\\x20\\\\t\\\\r\\\\n\\\\f>+~])\" + whitespace + \"*\",\n\tgroups = \"(?=[^\\\\x20\\\\t\\\\r\\\\n\\\\f])(?:\\\\\\\\.|\" + attributes + \"|\" + pseudos.replace( 2, 7 ) + \"|[^\\\\\\\\(),])+\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcombinators = new RegExp( \"^\" + combinators ),\n\n\t// All simple (non-comma) selectors, excluding insignifant trailing whitespace\n\trgroups = new RegExp( groups + \"?(?=\" + whitespace + \"*,|$)\", \"g\" ),\n\n\t// A selector, or everything after leading whitespace\n\t// Optionally followed in either case by a \")\" for terminating sub-selectors\n\trselector = new RegExp( \"^(?:(?!,)(?:(?:^|,)\" + whitespace + \"*\" + groups + \")*?|\" + whitespace + \"*(.*?))(\\\\)|$)\" ),\n\n\t// All combinators and selector components (attribute test, tag, pseudo, etc.), the latter appearing together when consecutive\n\trtokens = new RegExp( groups.slice( 19, -6 ) + \"\\\\x20\\\\t\\\\r\\\\n\\\\f>+~])+|\" + combinators, \"g\" ),\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w\\-]+)|(\\w+)|\\.([\\w\\-]+))$/,\n\n\trsibling = /[\\x20\\t\\r\\n\\f]*[+~]/,\n\trendsWithNot = /:not\\($/,\n\n\trheader = /h\\d/i,\n\trinputs = /input|select|textarea|button/i,\n\n\trbackslash = /\\\\(?!\\\\)/g,\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"NAME\": new RegExp( \"^\\\\[name=['\\\"]?(\" + characterEncoding + \")['\\\"]?\\\\]\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"[-\", \"[-\\\\*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|nth|last|first)-child(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"POS\": new RegExp( pos, \"ig\" ),\n\t\t// For use in libraries implementing .is()\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|\" + pos, \"i\" )\n\t},\n\n\tclassCache = {},\n\tcachedClasses = [],\n\tcompilerCache = {},\n\tcachedSelectors = [],\n\n\t// Mark a function for use in filtering\n\tmarkFunction = function( fn ) {\n\t\tfn.sizzleFilter = true;\n\t\treturn fn;\n\t},\n\n\t// Returns a function to use in pseudos for input types\n\tcreateInputFunction = function( type ) {\n\t\treturn function( elem ) {\n\t\t\t// Check the input's nodeName and type\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && elem.type === type;\n\t\t};\n\t},\n\n\t// Returns a function to use in pseudos for buttons\n\tcreateButtonFunction = function( type ) {\n\t\treturn function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t\t};\n\t},\n\n\t// Used for testing something on an element\n\tassert = function( fn ) {\n\t\tvar pass = false,\n\t\t\tdiv = document.createElement(\"div\");\n\t\ttry {\n\t\t\tpass = fn( div );\n\t\t} catch (e) {}\n\t\t// release memory in IE\n\t\tdiv = null;\n\t\treturn pass;\n\t},\n\n\t// Check if attributes should be retrieved by attribute nodes\n\tassertAttributes = assert(function( div ) {\n\t\tdiv.innerHTML = \"<select></select>\";\n\t\tvar type = typeof div.lastChild.getAttribute(\"multiple\");\n\t\t// IE8 returns a string for some attributes even when not present\n\t\treturn type !== \"boolean\" && type !== \"string\";\n\t}),\n\n\t// Check if getElementById returns elements by name\n\t// Check if getElementsByName privileges form controls or returns elements by ID\n\tassertUsableName = assert(function( div ) {\n\t\t// Inject content\n\t\tdiv.id = expando + 0;\n\t\tdiv.innerHTML = \"<a name='\" + expando + \"'></a><div name='\" + expando + \"'></div>\";\n\t\tdocElem.insertBefore( div, docElem.firstChild );\n\n\t\t// Test\n\t\tvar pass = document.getElementsByName &&\n\t\t\t// buggy browsers will return fewer than the correct 2\n\t\t\tdocument.getElementsByName( expando ).length ===\n\t\t\t// buggy browsers will return more than the correct 0\n\t\t\t2 + document.getElementsByName( expando + 0 ).length;\n\t\tassertGetIdNotName = !document.getElementById( expando );\n\n\t\t// Cleanup\n\t\tdocElem.removeChild( div );\n\n\t\treturn pass;\n\t}),\n\n\t// Check if the browser returns only elements\n\t// when doing getElementsByTagName(\"*\")\n\tassertTagNameNoComments = assert(function( div ) {\n\t\tdiv.appendChild( document.createComment(\"\") );\n\t\treturn div.getElementsByTagName(\"*\").length === 0;\n\t}),\n\n\t// Check if getAttribute returns normalized href attributes\n\tassertHrefNotNormalized = assert(function( div ) {\n\t\tdiv.innerHTML = \"<a href='#'></a>\";\n\t\treturn div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&\n\t\t\tdiv.firstChild.getAttribute(\"href\") === \"#\";\n\t}),\n\n\t// Check if getElementsByClassName can be trusted\n\tassertUsableClassName = assert(function( div ) {\n\t\t// Opera can't find a second classname (in 9.6)\n\t\tdiv.innerHTML = \"<div class='hidden e'></div><div class='hidden'></div>\";\n\t\tif ( !div.getElementsByClassName || div.getElementsByClassName(\"e\").length === 0 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Safari caches class attributes, doesn't catch changes (in 3.2)\n\t\tdiv.lastChild.className = \"e\";\n\t\treturn div.getElementsByClassName(\"e\").length !== 1;\n\t});\n\nvar Sizzle = function( selector, context, results, seed ) {\n\tresults = results || [];\n\tcontext = context || document;\n\tvar match, elem, xml, m,\n\t\tnodeType = context.nodeType;\n\n\tif ( nodeType !== 1 && nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\txml = isXML( context );\n\n\tif ( !xml && !seed ) {\n\t\tif ( (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, slice.call(context.getElementsByClassName( m ), 0) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector, context, results, seed, xml );\n};\n\nvar Expr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tmatch: matchExpr,\n\n\torder: [ \"ID\", \"TAG\" ],\n\n\tattrHandle: {},\n\n\tcreatePseudo: markFunction,\n\n\tfind: {\n\t\t\"ID\": assertGetIdNotName ?\n\t\t\tfunction( id, context, xml ) {\n\t\t\t\tif ( typeof context.getElementById !== strundefined && !xml ) {\n\t\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\treturn m && m.parentNode ? [m] : [];\n\t\t\t\t}\n\t\t\t} :\n\t\t\tfunction( id, context, xml ) {\n\t\t\t\tif ( typeof context.getElementById !== strundefined && !xml ) {\n\t\t\t\t\tvar m = context.getElementById( id );\n\n\t\t\t\t\treturn m ?\n\t\t\t\t\t\tm.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode(\"id\").value === id ?\n\t\t\t\t\t\t\t[m] :\n\t\t\t\t\t\t\tundefined :\n\t\t\t\t\t\t[];\n\t\t\t\t}\n\t\t\t},\n\n\t\t\"TAG\": assertTagNameNoComments ?\n\t\t\tfunction( tag, context ) {\n\t\t\t\tif ( typeof context.getElementsByTagName !== strundefined ) {\n\t\t\t\t\treturn context.getElementsByTagName( tag );\n\t\t\t\t}\n\t\t\t} :\n\t\t\tfunction( tag, context ) {\n\t\t\t\tvar results = context.getElementsByTagName( tag );\n\n\t\t\t\t// Filter out possible comments\n\t\t\t\tif ( tag === \"*\" ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\ttmp = [],\n\t\t\t\t\t\ti = 0;\n\n\t\t\t\t\tfor ( ; (elem = results[i]); i++ ) {\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn tmp;\n\t\t\t\t}\n\t\t\t\treturn results;\n\t\t\t}\n\t},\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( rbackslash, \"\" );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[4] || match[5] || \"\" ).replace( rbackslash, \"\" );\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 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t3 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t4 sign of xn-component\n\t\t\t\t5 x of xn-component\n\t\t\t\t6 sign of y-component\n\t\t\t\t7 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1] === \"nth\" ) {\n\t\t\t\t// nth-child requires argument\n\t\t\t\tif ( !match[2] ) {\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[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === \"even\" || match[2] === \"odd\" ) );\n\t\t\t\tmatch[4] = +( ( match[6] + match[7] ) || match[2] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[2] ) {\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 argument,\n\t\t\t\tunquoted = match[4];\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// Relinquish our claim on characters in `unquoted` from a closing parenthesis on\n\t\t\tif ( unquoted && (argument = rselector.exec( unquoted )) && argument.pop() ) {\n\n\t\t\t\tmatch[0] = match[0].slice( 0, argument[0].length - unquoted.length - 1 );\n\t\t\t\tunquoted = argument[0].slice( 0, -1 );\n\t\t\t}\n\n\t\t\t// Quoted or unquoted, we have the full argument\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\tmatch.splice( 2, 3, unquoted || match[3] );\n\t\t\treturn match;\n\t\t}\n\t},\n\n\tfilter: {\n\t\t\"ID\": assertGetIdNotName ?\n\t\t\tfunction( id ) {\n\t\t\t\tid = id.replace( rbackslash, \"\" );\n\t\t\t\treturn function( elem ) {\n\t\t\t\t\treturn elem.getAttribute(\"id\") === id;\n\t\t\t\t};\n\t\t\t} :\n\t\t\tfunction( id ) {\n\t\t\t\tid = id.replace( rbackslash, \"\" );\n\t\t\t\treturn function( elem ) {\n\t\t\t\t\tvar node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode(\"id\");\n\t\t\t\t\treturn node && node.value === id;\n\t\t\t\t};\n\t\t\t},\n\n\t\t\"TAG\": function( nodeName ) {\n\t\t\tif ( nodeName === \"*\" ) {\n\t\t\t\treturn function() { return true; };\n\t\t\t}\n\t\t\tnodeName = nodeName.replace( rbackslash, \"\" ).toLowerCase();\n\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className ];\n\t\t\tif ( !pattern ) {\n\t\t\t\tpattern = classCache[ className ] = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" );\n\t\t\t\tcachedClasses.push( className );\n\t\t\t\t// Avoid too large of a cache\n\t\t\t\tif ( cachedClasses.length > Expr.cacheLength ) {\n\t\t\t\t\tdelete classCache[ cachedClasses.shift() ];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn function( elem ) {\n\t\t\t\treturn pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute(\"class\")) || \"\" );\n\t\t\t};\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\tif ( !operator ) {\n\t\t\t\treturn function( elem ) {\n\t\t\t\t\treturn Sizzle.attr( elem, name ) != null;\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name ),\n\t\t\t\t\tvalue = result + \"\";\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\n\t\t\t\tswitch ( operator ) {\n\t\t\t\t\tcase \"=\":\n\t\t\t\t\t\treturn value === check;\n\t\t\t\t\tcase \"!=\":\n\t\t\t\t\t\treturn value !== check;\n\t\t\t\t\tcase \"^=\":\n\t\t\t\t\t\treturn check && value.indexOf( check ) === 0;\n\t\t\t\t\tcase \"*=\":\n\t\t\t\t\t\treturn check && value.indexOf( check ) > -1;\n\t\t\t\t\tcase \"$=\":\n\t\t\t\t\t\treturn check && value.substr( value.length - check.length ) === check;\n\t\t\t\t\tcase \"~=\":\n\t\t\t\t\t\treturn ( \" \" + value + \" \" ).indexOf( check ) > -1;\n\t\t\t\t\tcase \"|=\":\n\t\t\t\t\t\treturn value === check || value.substr( 0, check.length + 1 ) === check + \"-\";\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, argument, first, last ) {\n\n\t\t\tif ( type === \"nth\" ) {\n\t\t\t\tvar doneName = done++;\n\n\t\t\t\treturn function( elem ) {\n\t\t\t\t\tvar parent, diff,\n\t\t\t\t\t\tcount = 0,\n\t\t\t\t\t\tnode = elem;\n\n\t\t\t\t\tif ( first === 1 && last === 0 ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\tparent = elem.parentNode;\n\n\t\t\t\t\tif ( parent && (parent[ expando ] !== doneName || !elem.sizset) ) {\n\t\t\t\t\t\tfor ( node = parent.firstChild; node; node = node.nextSibling ) {\n\t\t\t\t\t\t\tif ( node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\tnode.sizset = ++count;\n\t\t\t\t\t\t\t\tif ( node === elem ) {\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\t\t\t\t\t\t}\n\n\t\t\t\t\t\tparent[ expando ] = doneName;\n\t\t\t\t\t}\n\n\t\t\t\t\tdiff = elem.sizset - last;\n\n\t\t\t\t\tif ( first === 0 ) {\n\t\t\t\t\t\treturn diff === 0;\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = elem;\n\n\t\t\t\tswitch ( type ) {\n\t\t\t\t\tcase \"only\":\n\t\t\t\t\tcase \"first\":\n\t\t\t\t\t\twhile ( (node = node.previousSibling) ) {\n\t\t\t\t\t\t\tif ( node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( type === \"first\" ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnode = elem;\n\n\t\t\t\t\t\t/* falls through */\n\t\t\t\t\tcase \"last\":\n\t\t\t\t\t\twhile ( (node = node.nextSibling) ) {\n\t\t\t\t\t\t\tif ( node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument, context, xml ) {\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\tvar fn = Expr.pseudos[ pseudo ] || Expr.pseudos[ pseudo.toLowerCase() ];\n\n\t\t\tif ( !fn ) {\n\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\t\t\t}\n\n\t\t\t// The user may set fn.sizzleFilter to indicate\n\t\t\t// that arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( !fn.sizzleFilter ) {\n\t\t\t\treturn fn;\n\t\t\t}\n\n\t\t\treturn fn( argument, context, xml );\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t\"not\": markFunction(function( selector, context, xml ) {\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 matcher = compile( selector.replace( rtrim, \"$1\" ), context, xml );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn !matcher( elem );\n\t\t\t};\n\t\t}),\n\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\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),\n\t\t\t//   not comment, processing instructions, or others\n\t\t\t// Thanks to Diego Perini for the nodeName shortcut\n\t\t\t//   Greater than \"@\" means alpha characters (specifically not starting with \"#\" or \"?\")\n\t\t\tvar nodeType;\n\t\t\telem = elem.firstChild;\n\t\t\twhile ( elem ) {\n\t\t\t\tif ( elem.nodeName > \"@\" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\telem = elem.nextSibling;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t\"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\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar type, attr;\n\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\n\t\t\t// use getAttribute instead to test this case\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\t(type = elem.type) === \"text\" &&\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === type );\n\t\t},\n\n\t\t// Input types\n\t\t\"radio\": createInputFunction(\"radio\"),\n\t\t\"checkbox\": createInputFunction(\"checkbox\"),\n\t\t\"file\": createInputFunction(\"file\"),\n\t\t\"password\": createInputFunction(\"password\"),\n\t\t\"image\": createInputFunction(\"image\"),\n\n\t\t\"submit\": createButtonFunction(\"submit\"),\n\t\t\"reset\": createButtonFunction(\"reset\"),\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\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\tvar doc = elem.ownerDocument;\n\t\t\treturn elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href);\n\t\t},\n\n\t\t\"active\": function( elem ) {\n\t\t\treturn elem === elem.ownerDocument.activeElement;\n\t\t}\n\t},\n\n\tsetFilters: {\n\t\t\"first\": function( elements, argument, not ) {\n\t\t\treturn not ? elements.slice( 1 ) : [ elements[0] ];\n\t\t},\n\n\t\t\"last\": function( elements, argument, not ) {\n\t\t\tvar elem = elements.pop();\n\t\t\treturn not ? elements : [ elem ];\n\t\t},\n\n\t\t\"even\": function( elements, argument, not ) {\n\t\t\tvar results = [],\n\t\t\t\ti = not ? 1 : 0,\n\t\t\t\tlen = elements.length;\n\t\t\tfor ( ; i < len; i = i + 2 ) {\n\t\t\t\tresults.push( elements[i] );\n\t\t\t}\n\t\t\treturn results;\n\t\t},\n\n\t\t\"odd\": function( elements, argument, not ) {\n\t\t\tvar results = [],\n\t\t\t\ti = not ? 0 : 1,\n\t\t\t\tlen = elements.length;\n\t\t\tfor ( ; i < len; i = i + 2 ) {\n\t\t\t\tresults.push( elements[i] );\n\t\t\t}\n\t\t\treturn results;\n\t\t},\n\n\t\t\"lt\": function( elements, argument, not ) {\n\t\t\treturn not ? elements.slice( +argument ) : elements.slice( 0, +argument );\n\t\t},\n\n\t\t\"gt\": function( elements, argument, not ) {\n\t\t\treturn not ? elements.slice( 0, +argument + 1 ) : elements.slice( +argument + 1 );\n\t\t},\n\n\t\t\"eq\": function( elements, argument, not ) {\n\t\t\tvar elem = elements.splice( +argument, 1 );\n\t\t\treturn not ? elements : elem;\n\t\t}\n\t}\n};\n\n// Deprecated\nExpr.setFilters[\"nth\"] = Expr.setFilters[\"eq\"];\n\n// Back-compat\nExpr.filters = Expr.pseudos;\n\n// IE6/7 return a modified href\nif ( !assertHrefNotNormalized ) {\n\tExpr.attrHandle = {\n\t\t\"href\": function( elem ) {\n\t\t\treturn elem.getAttribute( \"href\", 2 );\n\t\t},\n\t\t\"type\": function( elem ) {\n\t\t\treturn elem.getAttribute(\"type\");\n\t\t}\n\t};\n}\n\n// Add getElementsByName if usable\nif ( assertUsableName ) {\n\tExpr.order.push(\"NAME\");\n\tExpr.find[\"NAME\"] = function( name, context ) {\n\t\tif ( typeof context.getElementsByName !== strundefined ) {\n\t\t\treturn context.getElementsByName( name );\n\t\t}\n\t};\n}\n\n// Add getElementsByClassName if usable\nif ( assertUsableClassName ) {\n\tExpr.order.splice( 1, 0, \"CLASS\" );\n\tExpr.find[\"CLASS\"] = function( className, context, xml ) {\n\t\tif ( typeof context.getElementsByClassName !== strundefined && !xml ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n}\n\n// If slice is not available, provide a backup\ntry {\n\tslice.call( docElem.childNodes, 0 )[0].nodeType;\n} catch ( e ) {\n\tslice = function( i ) {\n\t\tvar elem, results = [];\n\t\tfor ( ; (elem = this[i]); i++ ) {\n\t\t\tresults.push( elem );\n\t\t}\n\t\treturn results;\n\t};\n}\n\nvar isXML = 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// Element contains another\nvar contains = Sizzle.contains = docElem.compareDocumentPosition ?\n\tfunction( a, b ) {\n\t\treturn !!( a.compareDocumentPosition( b ) & 16 );\n\t} :\n\tdocElem.contains ?\n\tfunction( a, b ) {\n\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\tbup = b.parentNode;\n\t\treturn a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) );\n\t} :\n\tfunction( a, b ) {\n\t\twhile ( (b = b.parentNode) ) {\n\t\t\tif ( b === a ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\nvar getText = 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\tif ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t\t// Use textContent for elements\n\t\t\t// innerText usage removed for consistency of new lines (see #11153)\n\t\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\t\treturn elem.textContent;\n\t\t\t} else {\n\t\t\t\t// Traverse its children\n\t\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\t\tret += getText( elem );\n\t\t\t\t}\n\t\t\t}\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\t} else {\n\n\t\t// If no nodeType, this is expected to be an array\n\t\tfor ( ; (node = elem[i]); i++ ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t}\n\treturn ret;\n};\n\nSizzle.attr = function( elem, name ) {\n\tvar attr,\n\t\txml = isXML( elem );\n\n\tif ( !xml ) {\n\t\tname = name.toLowerCase();\n\t}\n\tif ( Expr.attrHandle[ name ] ) {\n\t\treturn Expr.attrHandle[ name ]( elem );\n\t}\n\tif ( assertAttributes || xml ) {\n\t\treturn elem.getAttribute( name );\n\t}\n\tattr = elem.getAttributeNode( name );\n\treturn attr ?\n\t\ttypeof elem[ name ] === \"boolean\" ?\n\t\t\telem[ name ] ? name : null :\n\t\t\tattr.specified ? attr.value : null :\n\t\tnull;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n// 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\treturn (baseHasDuplicate = 0);\n});\n\n\nif ( docElem.compareDocumentPosition ) {\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn ( !a.compareDocumentPosition || !b.compareDocumentPosition ?\n\t\t\ta.compareDocumentPosition :\n\t\t\ta.compareDocumentPosition(b) & 4\n\t\t) ? -1 : 1;\n\t};\n\n} else {\n\tsortOrder = function( a, b ) {\n\t\t// The nodes are identical, we can exit early\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\n\t\t// Fallback to using sourceIndex (in IE) if it's available on both nodes\n\t\t} else if ( a.sourceIndex && b.sourceIndex ) {\n\t\t\treturn a.sourceIndex - b.sourceIndex;\n\t\t}\n\n\t\tvar al, bl,\n\t\t\tap = [],\n\t\t\tbp = [],\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tcur = aup;\n\n\t\t// If the nodes are siblings (or identical) we can do a quick check\n\t\tif ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\n\t\t// If no parents were found then the nodes are disconnected\n\t\t} else if ( !aup ) {\n\t\t\treturn -1;\n\n\t\t} else if ( !bup ) {\n\t\t\treturn 1;\n\t\t}\n\n\t\t// Otherwise they're somewhere else in the tree so we need\n\t\t// to build up a full list of the parentNodes for comparison\n\t\twhile ( cur ) {\n\t\t\tap.unshift( cur );\n\t\t\tcur = cur.parentNode;\n\t\t}\n\n\t\tcur = bup;\n\n\t\twhile ( cur ) {\n\t\t\tbp.unshift( cur );\n\t\t\tcur = cur.parentNode;\n\t\t}\n\n\t\tal = ap.length;\n\t\tbl = bp.length;\n\n\t\t// Start walking down the tree looking for a discrepancy\n\t\tfor ( var i = 0; i < al && i < bl; i++ ) {\n\t\t\tif ( ap[i] !== bp[i] ) {\n\t\t\t\treturn siblingCheck( ap[i], bp[i] );\n\t\t\t}\n\t\t}\n\n\t\t// We ended someplace up the tree so do a sibling check\n\t\treturn i === al ?\n\t\t\tsiblingCheck( a, bp[i], -1 ) :\n\t\t\tsiblingCheck( ap[i], b, 1 );\n\t};\n\n\tsiblingCheck = function( a, b, ret ) {\n\t\tif ( a === b ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tvar cur = a.nextSibling;\n\n\t\twhile ( cur ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\tcur = cur.nextSibling;\n\t\t}\n\n\t\treturn 1;\n\t};\n}\n\n// Document sorting and removing duplicates\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\ti = 1;\n\n\tif ( sortOrder ) {\n\t\thasDuplicate = baseHasDuplicate;\n\t\tresults.sort( sortOrder );\n\n\t\tif ( hasDuplicate ) {\n\t\t\tfor ( ; (elem = results[i]); i++ ) {\n\t\t\t\tif ( elem === results[ i - 1 ] ) {\n\t\t\t\t\tresults.splice( i--, 1 );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn results;\n};\n\nfunction multipleContexts( selector, contexts, results, seed ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results, seed );\n\t}\n}\n\nfunction handlePOSGroup( selector, posfilter, argument, contexts, seed, not ) {\n\tvar results,\n\t\tfn = Expr.setFilters[ posfilter.toLowerCase() ];\n\n\tif ( !fn ) {\n\t\tSizzle.error( posfilter );\n\t}\n\n\tif ( selector || !(results = seed) ) {\n\t\tmultipleContexts( selector || \"*\", contexts, (results = []), seed );\n\t}\n\n\treturn results.length > 0 ? fn( results, argument, not ) : [];\n}\n\nfunction handlePOS( selector, context, results, seed, groups ) {\n\tvar match, not, anchor, ret, elements, currentContexts, part, lastIndex,\n\t\ti = 0,\n\t\tlen = groups.length,\n\t\trpos = matchExpr[\"POS\"],\n\t\t// This is generated here in case matchExpr[\"POS\"] is extended\n\t\trposgroups = new RegExp( \"^\" + rpos.source + \"(?!\" + whitespace + \")\", \"i\" ),\n\t\t// This is for making sure non-participating\n\t\t// matching groups are represented cross-browser (IE6-8)\n\t\tsetUndefined = function() {\n\t\t\tvar i = 1,\n\t\t\t\tlen = arguments.length - 2;\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tif ( arguments[i] === undefined ) {\n\t\t\t\t\tmatch[i] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\tfor ( ; i < len; i++ ) {\n\t\t// Reset regex index to 0\n\t\trpos.exec(\"\");\n\t\tselector = groups[i];\n\t\tret = [];\n\t\tanchor = 0;\n\t\telements = seed;\n\t\twhile ( (match = rpos.exec( selector )) ) {\n\t\t\tlastIndex = rpos.lastIndex = match.index + match[0].length;\n\t\t\tif ( lastIndex > anchor ) {\n\t\t\t\tpart = selector.slice( anchor, match.index );\n\t\t\t\tanchor = lastIndex;\n\t\t\t\tcurrentContexts = [ context ];\n\n\t\t\t\tif ( rcombinators.test(part) ) {\n\t\t\t\t\tif ( elements ) {\n\t\t\t\t\t\tcurrentContexts = elements;\n\t\t\t\t\t}\n\t\t\t\t\telements = seed;\n\t\t\t\t}\n\n\t\t\t\tif ( (not = rendsWithNot.test( part )) ) {\n\t\t\t\t\tpart = part.slice( 0, -5 ).replace( rcombinators, \"$&*\" );\n\t\t\t\t}\n\n\t\t\t\tif ( match.length > 1 ) {\n\t\t\t\t\tmatch[0].replace( rposgroups, setUndefined );\n\t\t\t\t}\n\t\t\t\telements = handlePOSGroup( part, match[1], match[2], currentContexts, elements, not );\n\t\t\t}\n\t\t}\n\n\t\tif ( elements ) {\n\t\t\tret = ret.concat( elements );\n\n\t\t\tif ( (part = selector.slice( anchor )) && part !== \")\" ) {\n\t\t\t\tif ( rcombinators.test(part) ) {\n\t\t\t\t\tmultipleContexts( part, ret, results, seed );\n\t\t\t\t} else {\n\t\t\t\t\tSizzle( part, context, results, seed ? seed.concat(elements) : elements );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tpush.apply( results, ret );\n\t\t\t}\n\t\t} else {\n\t\t\tSizzle( selector, context, results, seed );\n\t\t}\n\t}\n\n\t// Do not sort if this is a single filter\n\treturn len === 1 ? results : Sizzle.uniqueSort( results );\n}\n\nfunction tokenize( selector, context, xml ) {\n\tvar tokens, soFar, type,\n\t\tgroups = [],\n\t\ti = 0,\n\n\t\t// Catch obvious selector issues: terminal \")\"; nonempty fallback match\n\t\t// rselector never fails to match *something*\n\t\tmatch = rselector.exec( selector ),\n\t\tmatched = !match.pop() && !match.pop(),\n\t\tselectorGroups = matched && selector.match( rgroups ) || [\"\"],\n\n\t\tpreFilters = Expr.preFilter,\n\t\tfilters = Expr.filter,\n\t\tcheckContext = !xml && context !== document;\n\n\tfor ( ; (soFar = selectorGroups[i]) != null && matched; i++ ) {\n\t\tgroups.push( tokens = [] );\n\n\t\t// Need to make sure we're within a narrower context if necessary\n\t\t// Adding a descendant combinator will generate what is needed\n\t\tif ( checkContext ) {\n\t\t\tsoFar = \" \" + soFar;\n\t\t}\n\n\t\twhile ( soFar ) {\n\t\t\tmatched = false;\n\n\t\t\t// Combinators\n\t\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\t\tsoFar = soFar.slice( match[0].length );\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\tmatched = tokens.push({ part: match.pop().replace( rtrim, \" \" ), captures: match });\n\t\t\t}\n\n\t\t\t// Filters\n\t\t\tfor ( type in filters ) {\n\t\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t\t(match = preFilters[ type ]( match, context, xml )) ) ) {\n\n\t\t\t\t\tsoFar = soFar.slice( match.shift().length );\n\t\t\t\t\tmatched = tokens.push({ part: type, captures: match });\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !matched ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( !matched ) {\n\t\tSizzle.error( selector );\n\t}\n\n\treturn groups;\n}\n\nfunction addCombinator( matcher, combinator, context ) {\n\tvar dir = combinator.dir,\n\t\tdoneName = done++;\n\n\tif ( !matcher ) {\n\t\t// If there is no matcher to check, check against the context\n\t\tmatcher = function( elem ) {\n\t\t\treturn elem === context;\n\t\t};\n\t}\n\treturn combinator.first ?\n\t\tfunction( elem, context ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\treturn matcher( elem, context ) && elem;\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\t\tfunction( elem, context ) {\n\t\t\tvar cache,\n\t\t\t\tdirkey = doneName + \".\" + dirruns,\n\t\t\t\tcachedkey = dirkey + \".\" + cachedruns;\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\tif ( (cache = elem[ expando ]) === cachedkey ) {\n\t\t\t\t\t\treturn elem.sizset;\n\t\t\t\t\t} else if ( typeof cache === \"string\" && cache.indexOf(dirkey) === 0 ) {\n\t\t\t\t\t\tif ( elem.sizset ) {\n\t\t\t\t\t\t\treturn elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem[ expando ] = cachedkey;\n\t\t\t\t\t\tif ( matcher( elem, context ) ) {\n\t\t\t\t\t\t\telem.sizset = true;\n\t\t\t\t\t\t\treturn elem;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telem.sizset = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction addMatcher( higher, deeper ) {\n\treturn higher ?\n\t\tfunction( elem, context ) {\n\t\t\tvar result = deeper( elem, context );\n\t\t\treturn result && higher( result === true ? elem : result, context );\n\t\t} :\n\t\tdeeper;\n}\n\n// [\"TAG\", \">\", \"ID\", \" \", \"CLASS\"]\nfunction matcherFromTokens( tokens, context, xml ) {\n\tvar token, matcher,\n\t\ti = 0;\n\n\tfor ( ; (token = tokens[i]); i++ ) {\n\t\tif ( Expr.relative[ token.part ] ) {\n\t\t\tmatcher = addCombinator( matcher, Expr.relative[ token.part ], context );\n\t\t} else {\n\t\t\ttoken.captures.push( context, xml );\n\t\t\tmatcher = addMatcher( matcher, Expr.filter[ token.part ].apply( null, token.captures ) );\n\t\t}\n\t}\n\n\treturn matcher;\n}\n\nfunction matcherFromGroupMatchers( matchers ) {\n\treturn function( elem, context ) {\n\t\tvar matcher,\n\t\t\tj = 0;\n\t\tfor ( ; (matcher = matchers[j]); j++ ) {\n\t\t\tif ( matcher(elem, context) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t};\n}\n\nvar compile = Sizzle.compile = function( selector, context, xml ) {\n\tvar tokens, group, i,\n\t\tcached = compilerCache[ selector ];\n\n\t// Return a cached group function if already generated (context dependent)\n\tif ( cached && cached.context === context ) {\n\t\treturn cached;\n\t}\n\n\t// Generate a function of recursive functions that can be used to check each element\n\tgroup = tokenize( selector, context, xml );\n\tfor ( i = 0; (tokens = group[i]); i++ ) {\n\t\tgroup[i] = matcherFromTokens( tokens, context, xml );\n\t}\n\n\t// Cache the compiled function\n\tcached = compilerCache[ selector ] = matcherFromGroupMatchers( group );\n\tcached.context = context;\n\tcached.runs = cached.dirruns = 0;\n\tcachedSelectors.push( selector );\n\t// Ensure only the most recent are cached\n\tif ( cachedSelectors.length > Expr.cacheLength ) {\n\t\tdelete compilerCache[ cachedSelectors.shift() ];\n\t}\n\treturn cached;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\treturn Sizzle( expr, null, null, [ elem ] ).length > 0;\n};\n\nvar select = function( selector, context, results, seed, xml ) {\n\t// Remove excessive whitespace\n\tselector = selector.replace( rtrim, \"$1\" );\n\tvar elements, matcher, i, len, elem, token,\n\t\ttype, findContext, notTokens,\n\t\tmatch = selector.match( rgroups ),\n\t\ttokens = selector.match( rtokens ),\n\t\tcontextNodeType = context.nodeType;\n\n\t// POS handling\n\tif ( matchExpr[\"POS\"].test(selector) ) {\n\t\treturn handlePOS( selector, context, results, seed, match );\n\t}\n\n\tif ( seed ) {\n\t\telements = slice.call( seed, 0 );\n\n\t// To maintain document order, only narrow the\n\t// set if there is one group\n\t} else if ( match && match.length === 1 ) {\n\n\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\tif ( tokens.length > 1 && contextNodeType === 9 && !xml &&\n\t\t\t\t(match = matchExpr[\"ID\"].exec( tokens[0] )) ) {\n\n\t\t\tcontext = Expr.find[\"ID\"]( match[1], context, xml )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().length );\n\t\t}\n\n\t\tfindContext = ( (match = rsibling.exec( tokens[0] )) && !match.index && context.parentNode ) || context;\n\n\t\t// Get the last token, excluding :not\n\t\tnotTokens = tokens.pop();\n\t\ttoken = notTokens.split(\":not\")[0];\n\n\t\tfor ( i = 0, len = Expr.order.length; i < len; i++ ) {\n\t\t\ttype = Expr.order[i];\n\n\t\t\tif ( (match = matchExpr[ type ].exec( token )) ) {\n\t\t\t\telements = Expr.find[ type ]( (match[1] || \"\").replace( rbackslash, \"\" ), findContext, xml );\n\n\t\t\t\tif ( elements == null ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( token === notTokens ) {\n\t\t\t\t\tselector = selector.slice( 0, selector.length - notTokens.length ) +\n\t\t\t\t\t\ttoken.replace( matchExpr[ type ], \"\" );\n\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, slice.call(elements, 0) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Only loop over the given elements once\n\t// If selector is empty, we're already done\n\tif ( selector ) {\n\t\tmatcher = compile( selector, context, xml );\n\t\tdirruns = matcher.dirruns++;\n\n\t\tif ( elements == null ) {\n\t\t\telements = Expr.find[\"TAG\"]( \"*\", (rsibling.test( selector ) && context.parentNode) || context );\n\t\t}\n\t\tfor ( i = 0; (elem = elements[i]); i++ ) {\n\t\t\tcachedruns = matcher.runs++;\n\t\t\tif ( matcher(elem, context) ) {\n\t\t\t\tresults.push( elem );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn results;\n};\n\nif ( document.querySelectorAll ) {\n\t(function() {\n\t\tvar disconnectedMatch,\n\t\t\toldSelect = select,\n\t\t\trescape = /'|\\\\/g,\n\t\t\trattributeQuotes = /\\=[\\x20\\t\\r\\n\\f]*([^'\"\\]]*)[\\x20\\t\\r\\n\\f]*\\]/g,\n\t\t\trbuggyQSA = [],\n\t\t\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\t\t\t// A support test would require too much code (would include document ready)\n\t\t\t// just skip matchesSelector for :active\n\t\t\trbuggyMatches = [\":active\"],\n\t\t\tmatches = docElem.matchesSelector ||\n\t\t\t\tdocElem.mozMatchesSelector ||\n\t\t\t\tdocElem.webkitMatchesSelector ||\n\t\t\t\tdocElem.oMatchesSelector ||\n\t\t\t\tdocElem.msMatchesSelector;\n\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\tdiv.innerHTML = \"<select><option selected></option></select>\";\n\n\t\t\t// IE8 - Some boolean attributes are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:checked|disabled|ismap|multiple|readonly|selected|value)\" );\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 (do not put tests after this one)\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\n\t\t\t// Opera 10-12/IE9 - ^= $= *= and empty values\n\t\t\t// Should not select anything\n\t\t\tdiv.innerHTML = \"<p test=''></p>\";\n\t\t\tif ( div.querySelectorAll(\"[test^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:\\\"\\\"|'')\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here (do not put tests after this one)\n\t\t\tdiv.innerHTML = \"<input type='hidden'>\";\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push(\":enabled\", \":disabled\");\n\t\t\t}\n\t\t});\n\n\t\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\n\t\tselect = function( selector, context, results, seed, xml ) {\n\t\t\t// Only use querySelectorAll when not filtering,\n\t\t\t// when this is not xml,\n\t\t\t// and when no QSA bugs apply\n\t\t\tif ( !seed && !xml && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\t\t\t\tif ( context.nodeType === 9 ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpush.apply( results, slice.call(context.querySelectorAll( selector ), 0) );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t} catch(qsaError) {}\n\t\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t\t// IE 8 doesn't work on object elements\n\t\t\t\t} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\t\tvar old = context.getAttribute(\"id\"),\n\t\t\t\t\t\tnid = old || expando,\n\t\t\t\t\t\tnewContext = rsibling.test( selector ) && context.parentNode || context;\n\n\t\t\t\t\tif ( old ) {\n\t\t\t\t\t\tnid = nid.replace( rescape, \"\\\\$&\" );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpush.apply( results, slice.call( newContext.querySelectorAll(\n\t\t\t\t\t\t\tselector.replace( rgroups, \"[id='\" + nid + \"'] $&\" )\n\t\t\t\t\t\t), 0 ) );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t} catch(qsaError) {\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn oldSelect( selector, context, results, seed, xml );\n\t\t};\n\n\t\tif ( matches ) {\n\t\t\tassert(function( div ) {\n\t\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t\t// on a disconnected node (IE 9)\n\t\t\t\tdisconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t\t// This should fail with an exception\n\t\t\t\t// Gecko does not error, returns false instead\n\t\t\t\ttry {\n\t\t\t\t\tmatches.call( div, \"[test!='']:sizzle\" );\n\t\t\t\t\trbuggyMatches.push( Expr.match.PSEUDO );\n\t\t\t\t} catch ( e ) {}\n\t\t\t});\n\n\t\t\t// rbuggyMatches always contains :active, so no need for a length check\n\t\t\trbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join(\"|\") );\n\n\t\t\tSizzle.matchesSelector = function( elem, expr ) {\n\t\t\t\t// Make sure that attribute selectors are quoted\n\t\t\t\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\t\t\t\t// rbuggyMatches always contains :active, so no need for an existence check\n\t\t\t\tif ( !isXML( elem ) && !rbuggyMatches.test( expr ) && (!rbuggyQSA || !rbuggyQSA.test( expr )) ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\t\t\t\tif ( ret || disconnectedMatch ||\n\t\t\t\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\t\t\t\treturn ret;\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch(e) {}\n\t\t\t\t}\n\n\t\t\t\treturn Sizzle( expr, null, null, [ elem ] ).length > 0;\n\t\t\t};\n\t\t}\n\t})();\n}\n\n// Override sizzle attribute retrieval\nSizzle.attr = jQuery.attr;\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.pseudos;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n})( window );\nvar runtil = /Until$/,\n\trparentsprev = /^(?:parents|prev(?:Until|All))/,\n\tisSimple = /^.[^:#\\[\\.,]*$/,\n\trneedsContext = jQuery.expr.match.needsContext,\n\t// methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar i, l, length, n, r, ret,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0, l = self.length; i < l; 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\tret = this.pushStack( \"\", \"find\", selector );\n\n\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\n\t\t\tlength = ret.length;\n\t\t\tjQuery.find( selector, this[i], ret );\n\n\t\t\tif ( i > 0 ) {\n\t\t\t\t// Make sure that the results are unique\n\t\t\t\tfor ( n = length; n < ret.length; n++ ) {\n\t\t\t\t\tfor ( r = 0; r < length; r++ ) {\n\t\t\t\t\t\tif ( ret[r] === ret[n] ) {\n\t\t\t\t\t\t\tret.splice(n--, 1);\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}\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\thas: function( target ) {\n\t\tvar i,\n\t\t\ttargets = jQuery( target, this ),\n\t\t\tlen = targets.length;\n\n\t\treturn this.filter(function() {\n\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector, false), \"not\", selector);\n\t},\n\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector, true), \"filter\", selector );\n\t},\n\n\tis: function( selector ) {\n\t\treturn !!selector && (\n\t\t\ttypeof selector === \"string\" ?\n\t\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\t\trneedsContext.test( selector ) ?\n\t\t\t\t\tjQuery( selector, this.context ).index( this[0] ) >= 0 :\n\t\t\t\t\tjQuery.filter( selector, this ).length > 0 :\n\t\t\t\tthis.filter( selector ).length > 0 );\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\tret = [],\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\tcur = this[i];\n\n\t\t\twhile ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {\n\t\t\t\tif ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {\n\t\t\t\t\tret.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t}\n\n\t\tret = ret.length > 1 ? jQuery.unique( ret ) : ret;\n\n\t\treturn this.pushStack( ret, \"closest\", selectors );\n\t},\n\n\t// Determine the position of an element within\n\t// the matched set of elements\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;\n\t\t}\n\n\t\t// index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn jQuery.inArray( this[0], jQuery( elem ) );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn jQuery.inArray(\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[0] : elem, this );\n\t},\n\n\tadd: function( selector, context ) {\n\t\tvar set = typeof selector === \"string\" ?\n\t\t\t\tjQuery( selector, context ) :\n\t\t\t\tjQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),\n\t\t\tall = jQuery.merge( this.get(), set );\n\n\t\treturn this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?\n\t\t\tall :\n\t\t\tjQuery.unique( all ) );\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter(selector)\n\t\t);\n\t}\n});\n\njQuery.fn.andSelf = jQuery.fn.addBack;\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\treturn !node || !node.parentNode || node.parentNode.nodeType === 11;\n}\n\nfunction sibling( cur, dir ) {\n\tdo {\n\t\tcur = cur[ dir ];\n\t} while ( cur && cur.nodeType !== 1 );\n\n\treturn cur;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn 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 jQuery.nodeName( elem, \"iframe\" ) ?\n\t\t\telem.contentDocument || elem.contentWindow.document :\n\t\t\tjQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar ret = jQuery.map( this, fn, until );\n\n\t\tif ( !runtil.test( name ) ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tret = jQuery.filter( selector, ret );\n\t\t}\n\n\t\tret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;\n\n\t\tif ( this.length > 1 && rparentsprev.test( name ) ) {\n\t\t\tret = ret.reverse();\n\t\t}\n\n\t\treturn this.pushStack( ret, name, core_slice.call( arguments ).join(\",\") );\n\t};\n});\n\njQuery.extend({\n\tfilter: function( expr, elems, not ) {\n\t\tif ( not ) {\n\t\t\texpr = \":not(\" + expr + \")\";\n\t\t}\n\n\t\treturn elems.length === 1 ?\n\t\t\tjQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :\n\t\t\tjQuery.find.matches(expr, elems);\n\t},\n\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\tcur = elem[ dir ];\n\n\t\twhile ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\n\t\t\tif ( cur.nodeType === 1 ) {\n\t\t\t\tmatched.push( cur );\n\t\t\t}\n\t\t\tcur = cur[dir];\n\t\t}\n\t\treturn matched;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar r = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tr.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn r;\n\t}\n});\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, keep ) {\n\n\t// Can't pass null or undefined to indexOf in Firefox 4\n\t// Set to 0 to skip string check\n\tqualifier = qualifier || 0;\n\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep(elements, function( elem, i ) {\n\t\t\tvar retVal = !!qualifier.call( elem, i, elem );\n\t\t\treturn retVal === keep;\n\t\t});\n\n\t} else if ( qualifier.nodeType ) {\n\t\treturn jQuery.grep(elements, function( elem, i ) {\n\t\t\treturn ( elem === qualifier ) === keep;\n\t\t});\n\n\t} else if ( typeof qualifier === \"string\" ) {\n\t\tvar filtered = jQuery.grep(elements, function( elem ) {\n\t\t\treturn elem.nodeType === 1;\n\t\t});\n\n\t\tif ( isSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter(qualifier, filtered, !keep);\n\t\t} else {\n\t\t\tqualifier = jQuery.filter( qualifier, filtered );\n\t\t}\n\t}\n\n\treturn jQuery.grep(elements, function( elem, i ) {\n\t\treturn ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;\n\t});\n}\nfunction createSafeFragment( document ) {\n\tvar list = nodeNames.split( \"|\" ),\n\tsafeFrag = document.createDocumentFragment();\n\n\tif ( safeFrag.createElement ) {\n\t\twhile ( list.length ) {\n\t\t\tsafeFrag.createElement(\n\t\t\t\tlist.pop()\n\t\t\t);\n\t\t}\n\t}\n\treturn safeFrag;\n}\n\nvar nodeNames = \"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|\" +\n\t\t\"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",\n\trinlinejQuery = / jQuery\\d+=\"(?:null|\\d+)\"/g,\n\trleadingWhitespace = /^\\s+/,\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,\n\trtagName = /<([\\w:]+)/,\n\trtbody = /<tbody/i,\n\trhtml = /<|&#?\\w+;/,\n\trnoInnerhtml = /<(?:script|style|link)/i,\n\trnocache = /<(?:script|object|embed|option|style)/i,\n\trnoshimcache = new RegExp(\"<(?:\" + nodeNames + \")[\\\\s/>]\", \"i\"),\n\trcheckableType = /^(?:checkbox|radio)$/,\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /\\/(java|ecma)script/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|\\-\\-)|[\\]\\-]{2}>\\s*$/g,\n\twrapMap = {\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\t\tlegend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\t\tcol: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\n\t\tarea: [ 1, \"<map>\", \"</map>\" ],\n\t\t_default: [ 0, \"\", \"\" ]\n\t},\n\tsafeFragment = createSafeFragment( document ),\n\tfragmentDiv = safeFragment.appendChild( document.createElement(\"div\") );\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n// unless wrapped in a div with non-breaking characters in front of it.\nif ( !jQuery.support.htmlSerialize ) {\n\twrapMap._default = [ 1, \"X<div>\", \"</div>\" ];\n}\n\njQuery.fn.extend({\n\ttext: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );\n\t\t}, null, value, arguments.length );\n\t},\n\n\twrapAll: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\t// The elements to wrap the target around\n\t\t\tvar wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);\n\n\t\t\tif ( this[0].parentNode ) {\n\t\t\t\twrap.insertBefore( this[0] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\n\t\t\t\t\telem = elem.firstChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each(function(i) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip(arguments, true, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 ) {\n\t\t\t\tthis.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip(arguments, true, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 ) {\n\t\t\t\tthis.insertBefore( elem, this.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\tif ( !isDisconnected( this[0] ) ) {\n\t\t\treturn this.domManip(arguments, false, function( elem ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t});\n\t\t}\n\n\t\tif ( arguments.length ) {\n\t\t\tvar set = jQuery.clean( arguments );\n\t\t\treturn this.pushStack( jQuery.merge( set, this ), \"before\", this.selector );\n\t\t}\n\t},\n\n\tafter: function() {\n\t\tif ( !isDisconnected( this[0] ) ) {\n\t\t\treturn this.domManip(arguments, false, function( elem ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t});\n\t\t}\n\n\t\tif ( arguments.length ) {\n\t\t\tvar set = jQuery.clean( arguments );\n\t\t\treturn this.pushStack( jQuery.merge( this, set ), \"after\", this.selector );\n\t\t}\n\t},\n\n\t// keepData is for internal use only--do not document\n\tremove: function( selector, keepData ) {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\t\t\tif ( !selector || jQuery.filter( selector, [ elem ] ).length ) {\n\t\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\t\tjQuery.cleanData( elem.getElementsByTagName(\"*\") );\n\t\t\t\t\tjQuery.cleanData( [ elem ] );\n\t\t\t\t}\n\n\t\t\t\tif ( elem.parentNode ) {\n\t\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t\t}\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\t// Remove element nodes and prevent memory leaks\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( elem.getElementsByTagName(\"*\") );\n\t\t\t}\n\n\t\t\t// Remove any remaining nodes\n\t\t\twhile ( elem.firstChild ) {\n\t\t\t\telem.removeChild( elem.firstChild );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function () {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t});\n\t},\n\n\thtml: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\tvar elem = this[0] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined ) {\n\t\t\t\treturn elem.nodeType === 1 ?\n\t\t\t\t\telem.innerHTML.replace( rinlinejQuery, \"\" ) :\n\t\t\t\t\tundefined;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&\n\t\t\t\t( jQuery.support.leadingWhitespace || !rleadingWhitespace.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\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\telem = this[i] || {};\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( elem.getElementsByTagName( \"*\" ) );\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( value ) {\n\t\tif ( !isDisconnected( this[0] ) ) {\n\t\t\t// Make sure that the elements are removed from the DOM before they are inserted\n\t\t\t// this can help fix replacing a parent with child elements\n\t\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\t\treturn this.each(function(i) {\n\t\t\t\t\tvar self = jQuery(this), old = self.html();\n\t\t\t\t\tself.replaceWith( value.call( this, i, old ) );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif ( typeof value !== \"string\" ) {\n\t\t\t\tvalue = jQuery( value ).detach();\n\t\t\t}\n\n\t\t\treturn this.each(function() {\n\t\t\t\tvar next = this.nextSibling,\n\t\t\t\t\tparent = this.parentNode;\n\n\t\t\t\tjQuery( this ).remove();\n\n\t\t\t\tif ( next ) {\n\t\t\t\t\tjQuery(next).before( value );\n\t\t\t\t} else {\n\t\t\t\t\tjQuery(parent).append( value );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn this.length ?\n\t\t\tthis.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), \"replaceWith\", value ) :\n\t\t\tthis;\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, table, callback ) {\n\n\t\t// Flatten any nested arrays\n\t\targs = [].concat.apply( [], args );\n\n\t\tvar results, first, fragment, iNoClone,\n\t\t\ti = 0,\n\t\t\tvalue = args[0],\n\t\t\tscripts = [],\n\t\t\tl = this.length;\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( !jQuery.support.checkClone && l > 1 && typeof value === \"string\" && rchecked.test( value ) ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery(this).domManip( args, table, callback );\n\t\t\t});\n\t\t}\n\n\t\tif ( jQuery.isFunction(value) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tvar self = jQuery(this);\n\t\t\t\targs[0] = value.call( this, i, table ? self.html() : undefined );\n\t\t\t\tself.domManip( args, table, callback );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\tresults = jQuery.buildFragment( args, this, scripts );\n\t\t\tfragment = results.fragment;\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\ttable = table && jQuery.nodeName( first, \"tr\" );\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\t// Fragments from the fragment cache must always be cloned and never used in place.\n\t\t\t\tfor ( iNoClone = results.cacheable || l - 1; i < l; i++ ) {\n\t\t\t\t\tcallback.call(\n\t\t\t\t\t\ttable && jQuery.nodeName( this[i], \"table\" ) ?\n\t\t\t\t\t\t\tfindOrAppend( this[i], \"tbody\" ) :\n\t\t\t\t\t\t\tthis[i],\n\t\t\t\t\t\ti === iNoClone ?\n\t\t\t\t\t\t\tfragment :\n\t\t\t\t\t\t\tjQuery.clone( fragment, true, true )\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Fix #11809: Avoid leaking memory\n\t\t\tfragment = first = null;\n\n\t\t\tif ( scripts.length ) {\n\t\t\t\tjQuery.each( scripts, function( i, elem ) {\n\t\t\t\t\tif ( elem.src ) {\n\t\t\t\t\t\tif ( jQuery.ajax ) {\n\t\t\t\t\t\t\tjQuery.ajax({\n\t\t\t\t\t\t\t\turl: elem.src,\n\t\t\t\t\t\t\t\ttype: \"GET\",\n\t\t\t\t\t\t\t\tdataType: \"script\",\n\t\t\t\t\t\t\t\tasync: false,\n\t\t\t\t\t\t\t\tglobal: false,\n\t\t\t\t\t\t\t\t\"throws\": true\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tjQuery.error(\"no ajax\");\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tjQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || \"\" ).replace( rcleanScript, \"\" ) );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( elem.parentNode ) {\n\t\t\t\t\t\telem.parentNode.removeChild( elem );\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\nfunction findOrAppend( elem, tag ) {\n\treturn elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\n\tif ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\n\t\treturn;\n\t}\n\n\tvar type, i, l,\n\t\toldData = jQuery._data( src ),\n\t\tcurData = jQuery._data( dest, oldData ),\n\t\tevents = oldData.events;\n\n\tif ( events ) {\n\t\tdelete curData.handle;\n\t\tcurData.events = {};\n\n\t\tfor ( type in events ) {\n\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t}\n\t\t}\n\t}\n\n\t// make the cloned public data object a copy from the original\n\tif ( curData.data ) {\n\t\tcurData.data = jQuery.extend( {}, curData.data );\n\t}\n}\n\nfunction cloneFixAttributes( src, dest ) {\n\tvar nodeName;\n\n\t// We do not need to do anything for non-Elements\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// clearAttributes removes the attributes, which we don't want,\n\t// but also removes the attachEvent events, which we *do* want\n\tif ( dest.clearAttributes ) {\n\t\tdest.clearAttributes();\n\t}\n\n\t// mergeAttributes, in contrast, only merges back on the\n\t// original attributes, not the events\n\tif ( dest.mergeAttributes ) {\n\t\tdest.mergeAttributes( src );\n\t}\n\n\tnodeName = dest.nodeName.toLowerCase();\n\n\tif ( nodeName === \"object\" ) {\n\t\t// IE6-10 improperly clones children of object elements using classid.\n\t\t// IE10 throws NoModificationAllowedError if parent is null, #12132.\n\t\tif ( dest.parentNode ) {\n\t\t\tdest.outerHTML = src.outerHTML;\n\t\t}\n\n\t\t// This path appears unavoidable for IE9. When cloning an object\n\t\t// element in IE9, the outerHTML strategy above is not sufficient.\n\t\t// If the src has innerHTML and the destination does not,\n\t\t// copy the src.innerHTML into the dest.innerHTML. #10324\n\t\tif ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) {\n\t\t\tdest.innerHTML = src.innerHTML;\n\t\t}\n\n\t} else if ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\t// IE6-8 fails to persist the checked state of a cloned checkbox\n\t\t// or radio button. Worse, IE6-7 fail to give the cloned element\n\t\t// a checked appearance if the defaultChecked value isn't also set\n\n\t\tdest.defaultChecked = dest.checked = src.checked;\n\n\t\t// IE6-7 get confused and end up setting the value of a cloned\n\t\t// checkbox/radio button to an empty string instead of \"on\"\n\t\tif ( dest.value !== src.value ) {\n\t\t\tdest.value = src.value;\n\t\t}\n\n\t// IE6-8 fails to return the selected option to the default selected\n\t// state when cloning options\n\t} else if ( nodeName === \"option\" ) {\n\t\tdest.selected = src.defaultSelected;\n\n\t// IE6-8 fails to set the defaultValue to the correct value when\n\t// cloning other types of input fields\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\n\t// IE blanks contents when cloning scripts\n\t} else if ( nodeName === \"script\" && dest.text !== src.text ) {\n\t\tdest.text = src.text;\n\t}\n\n\t// Event data gets referenced instead of copied if the expando\n\t// gets copied too\n\tdest.removeAttribute( jQuery.expando );\n}\n\njQuery.buildFragment = function( args, context, scripts ) {\n\tvar fragment, cacheable, cachehit,\n\t\tfirst = args[ 0 ];\n\n\t// Set context from what may come in as undefined or a jQuery collection or a node\n\tcontext = context || document;\n\tcontext = (context[0] || context).ownerDocument || context[0] || context;\n\n\t// Ensure that an attr object doesn't incorrectly stand in as a document object\n\t// Chrome and Firefox seem to allow this to occur and will throw exception\n\t// Fixes #8950\n\tif ( typeof context.createDocumentFragment === \"undefined\" ) {\n\t\tcontext = document;\n\t}\n\n\t// Only cache \"small\" (1/2 KB) HTML strings that are associated with the main document\n\t// Cloning options loses the selected state, so don't cache them\n\t// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment\n\t// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache\n\t// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501\n\tif ( args.length === 1 && typeof first === \"string\" && first.length < 512 && context === document &&\n\t\tfirst.charAt(0) === \"<\" && !rnocache.test( first ) &&\n\t\t(jQuery.support.checkClone || !rchecked.test( first )) &&\n\t\t(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {\n\n\t\t// Mark cacheable and look for a hit\n\t\tcacheable = true;\n\t\tfragment = jQuery.fragments[ first ];\n\t\tcachehit = fragment !== undefined;\n\t}\n\n\tif ( !fragment ) {\n\t\tfragment = context.createDocumentFragment();\n\t\tjQuery.clean( args, context, fragment, scripts );\n\n\t\t// Update the cache, but only store false\n\t\t// unless this is a second parsing of the same content\n\t\tif ( cacheable ) {\n\t\t\tjQuery.fragments[ first ] = cachehit && fragment;\n\t\t}\n\t}\n\n\treturn { fragment: fragment, cacheable: cacheable };\n};\n\njQuery.fragments = {};\n\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\ti = 0,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tl = insert.length,\n\t\t\tparent = this.length === 1 && this[0].parentNode;\n\n\t\tif ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) {\n\t\t\tinsert[ original ]( this[0] );\n\t\t\treturn this;\n\t\t} else {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\telems = ( i > 0 ? this.clone(true) : this ).get();\n\t\t\t\tjQuery( insert[i] )[ original ]( elems );\n\t\t\t\tret = ret.concat( elems );\n\t\t\t}\n\n\t\t\treturn this.pushStack( ret, name, insert.selector );\n\t\t}\n\t};\n});\n\nfunction getAll( elem ) {\n\tif ( typeof elem.getElementsByTagName !== \"undefined\" ) {\n\t\treturn elem.getElementsByTagName( \"*\" );\n\n\t} else if ( typeof elem.querySelectorAll !== \"undefined\" ) {\n\t\treturn elem.querySelectorAll( \"*\" );\n\n\t} else {\n\t\treturn [];\n\t}\n}\n\n// Used in clean, fixes the defaultChecked property\nfunction fixDefaultChecked( elem ) {\n\tif ( rcheckableType.test( elem.type ) ) {\n\t\telem.defaultChecked = elem.checked;\n\t}\n}\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar srcElements,\n\t\t\tdestElements,\n\t\t\ti,\n\t\t\tclone;\n\n\t\tif ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( \"<\" + elem.nodeName + \">\" ) ) {\n\t\t\tclone = elem.cloneNode( true );\n\n\t\t// IE<=8 does not properly clone detached, unknown element nodes\n\t\t} else {\n\t\t\tfragmentDiv.innerHTML = elem.outerHTML;\n\t\t\tfragmentDiv.removeChild( clone = fragmentDiv.firstChild );\n\t\t}\n\n\t\tif ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&\n\t\t\t\t(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {\n\t\t\t// IE copies events bound via attachEvent when using cloneNode.\n\t\t\t// Calling detachEvent on the clone will also remove the events\n\t\t\t// from the original. In order to get around this, we use some\n\t\t\t// proprietary methods to clear the events. Thanks to MooTools\n\t\t\t// guys for this hotness.\n\n\t\t\tcloneFixAttributes( elem, clone );\n\n\t\t\t// Using Sizzle here is crazy slow, so we use getElementsByTagName instead\n\t\t\tsrcElements = getAll( elem );\n\t\t\tdestElements = getAll( clone );\n\n\t\t\t// Weird iteration because IE will replace the length property\n\t\t\t// with an element if you are cloning the body and one of the\n\t\t\t// elements on the page has a name or id of \"length\"\n\t\t\tfor ( i = 0; srcElements[i]; ++i ) {\n\t\t\t\t// Ensure that the destination node is not null; Fixes #9587\n\t\t\t\tif ( destElements[i] ) {\n\t\t\t\t\tcloneFixAttributes( srcElements[i], destElements[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tcloneCopyEvent( elem, clone );\n\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = getAll( elem );\n\t\t\t\tdestElements = getAll( clone );\n\n\t\t\t\tfor ( i = 0; srcElements[i]; ++i ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[i], destElements[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tsrcElements = destElements = null;\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tclean: function( elems, context, fragment, scripts ) {\n\t\tvar j, safe, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Ensure that context is a document\n\t\tif ( !context || typeof context.createDocumentFragment === \"undefined\" ) {\n\t\t\tcontext = document;\n\t\t}\n\n\t\t// Use the already-created safe fragment if context permits\n\t\tfor ( safe = context === document && safeFragment; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( typeof elem === \"number\" ) {\n\t\t\t\telem += \"\";\n\t\t\t}\n\n\t\t\tif ( !elem ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Convert html string into DOM nodes\n\t\t\tif ( typeof elem === \"string\" ) {\n\t\t\t\tif ( !rhtml.test( elem ) ) {\n\t\t\t\t\telem = context.createTextNode( elem );\n\t\t\t\t} else {\n\t\t\t\t\t// Ensure a safe container in which to render the html\n\t\t\t\t\tsafe = safe || createSafeFragment( context );\n\t\t\t\t\tdiv = div || safe.appendChild( context.createElement(\"div\") );\n\n\t\t\t\t\t// Fix \"XHTML\"-style tags in all browsers\n\t\t\t\t\telem = elem.replace(rxhtmlTag, \"<$1></$2>\");\n\n\t\t\t\t\t// Go to html and back, then peel off extra wrappers\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\tdepth = wrap[0];\n\t\t\t\t\tdiv.innerHTML = wrap[1] + elem + wrap[2];\n\n\t\t\t\t\t// Move to the right depth\n\t\t\t\t\twhile ( depth-- ) {\n\t\t\t\t\t\tdiv = div.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove IE's autoinserted <tbody> from table fragments\n\t\t\t\t\tif ( !jQuery.support.tbody ) {\n\n\t\t\t\t\t\t// String was a <table>, *may* have spurious <tbody>\n\t\t\t\t\t\thasBody = rtbody.test(elem);\n\t\t\t\t\t\t\ttbody = tag === \"table\" && !hasBody ?\n\t\t\t\t\t\t\t\tdiv.firstChild && div.firstChild.childNodes :\n\n\t\t\t\t\t\t\t\t// String was a bare <thead> or <tfoot>\n\t\t\t\t\t\t\t\twrap[1] === \"<table>\" && !hasBody ?\n\t\t\t\t\t\t\t\t\tdiv.childNodes :\n\t\t\t\t\t\t\t\t\t[];\n\n\t\t\t\t\t\tfor ( j = tbody.length - 1; j >= 0 ; --j ) {\n\t\t\t\t\t\t\tif ( jQuery.nodeName( tbody[ j ], \"tbody\" ) && !tbody[ j ].childNodes.length ) {\n\t\t\t\t\t\t\t\ttbody[ j ].parentNode.removeChild( tbody[ j ] );\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// IE completely kills leading whitespace when innerHTML is used\n\t\t\t\t\tif ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\n\t\t\t\t\t\tdiv.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );\n\t\t\t\t\t}\n\n\t\t\t\t\telem = div.childNodes;\n\n\t\t\t\t\t// Remember the top-level container for proper cleanup\n\t\t\t\t\tdiv = safe.lastChild;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( elem.nodeType ) {\n\t\t\t\tret.push( elem );\n\t\t\t} else {\n\t\t\t\tret = jQuery.merge( ret, elem );\n\t\t\t}\n\t\t}\n\n\t\t// Fix #11356: Clear elements from safeFragment\n\t\tif ( div ) {\n\t\t\tsafe.removeChild( div );\n\t\t\telem = div = safe = null;\n\t\t}\n\n\t\t// Reset defaultChecked for any radios and checkboxes\n\t\t// about to be appended to the DOM in IE 6/7 (#8060)\n\t\tif ( !jQuery.support.appendChecked ) {\n\t\t\tfor ( i = 0; (elem = ret[i]) != null; i++ ) {\n\t\t\t\tif ( jQuery.nodeName( elem, \"input\" ) ) {\n\t\t\t\t\tfixDefaultChecked( elem );\n\t\t\t\t} else if ( typeof elem.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\t\tjQuery.grep( elem.getElementsByTagName(\"input\"), fixDefaultChecked );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Append elements to a provided document fragment\n\t\tif ( fragment ) {\n\t\t\t// Special handling of each script element\n\t\t\thandleScript = function( elem ) {\n\t\t\t\t// Check if we consider it executable\n\t\t\t\tif ( !elem.type || rscriptType.test( elem.type ) ) {\n\t\t\t\t\t// Detach the script and store it in the scripts array (if provided) or the fragment\n\t\t\t\t\t// Return truthy to indicate that it has been handled\n\t\t\t\t\treturn scripts ?\n\t\t\t\t\t\tscripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :\n\t\t\t\t\t\tfragment.appendChild( elem );\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tfor ( i = 0; (elem = ret[i]) != null; i++ ) {\n\t\t\t\t// Check if we're done after handling an executable script\n\t\t\t\tif ( !( jQuery.nodeName( elem, \"script\" ) && handleScript( elem ) ) ) {\n\t\t\t\t\t// Append to fragment and handle embedded scripts\n\t\t\t\t\tfragment.appendChild( elem );\n\t\t\t\t\tif ( typeof elem.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\t\t\t// handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration\n\t\t\t\t\t\tjsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName(\"script\") ), handleScript );\n\n\t\t\t\t\t\t// Splice the scripts into ret after their former ancestor and advance our index beyond them\n\t\t\t\t\t\tret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );\n\t\t\t\t\t\ti += jsTags.length;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tcleanData: function( elems, /* internal */ acceptData ) {\n\t\tvar data, id, elem, type,\n\t\t\ti = 0,\n\t\t\tinternalKey = jQuery.expando,\n\t\t\tcache = jQuery.cache,\n\t\t\tdeleteExpando = jQuery.support.deleteExpando,\n\t\t\tspecial = jQuery.event.special;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\n\t\t\tif ( acceptData || jQuery.acceptData( elem ) ) {\n\n\t\t\t\tid = elem[ internalKey ];\n\t\t\t\tdata = id && cache[ id ];\n\n\t\t\t\tif ( data ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove cache only if it was not already removed by jQuery.event.remove\n\t\t\t\t\tif ( cache[ id ] ) {\n\n\t\t\t\t\t\tdelete cache[ id ];\n\n\t\t\t\t\t\t// IE does not allow us to delete expando properties from nodes,\n\t\t\t\t\t\t// nor does it have a removeAttribute function on Document nodes;\n\t\t\t\t\t\t// we must handle all of these cases\n\t\t\t\t\t\tif ( deleteExpando ) {\n\t\t\t\t\t\t\tdelete elem[ internalKey ];\n\n\t\t\t\t\t\t} else if ( elem.removeAttribute ) {\n\t\t\t\t\t\t\telem.removeAttribute( internalKey );\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telem[ internalKey ] = null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tjQuery.deletedIds.push( id );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n});\n// Limit scope pollution from any deprecated API\n(function() {\n\nvar matched, browser;\n\n// Use of jQuery.browser is frowned upon.\n// More details: http://api.jquery.com/jQuery.browser\n// jQuery.uaMatch maintained for back-compat\njQuery.uaMatch = function( ua ) {\n\tua = ua.toLowerCase();\n\n\tvar match = /(chrome)[ \\/]([\\w.]+)/.exec( ua ) ||\n\t\t/(webkit)[ \\/]([\\w.]+)/.exec( ua ) ||\n\t\t/(opera)(?:.*version|)[ \\/]([\\w.]+)/.exec( ua ) ||\n\t\t/(msie) ([\\w.]+)/.exec( ua ) ||\n\t\tua.indexOf(\"compatible\") < 0 && /(mozilla)(?:.*? rv:([\\w.]+)|)/.exec( ua ) ||\n\t\t[];\n\n\treturn {\n\t\tbrowser: match[ 1 ] || \"\",\n\t\tversion: match[ 2 ] || \"0\"\n\t};\n};\n\nmatched = jQuery.uaMatch( navigator.userAgent );\nbrowser = {};\n\nif ( matched.browser ) {\n\tbrowser[ matched.browser ] = true;\n\tbrowser.version = matched.version;\n}\n\n// Deprecated, use jQuery.browser.webkit instead\n// Maintained for back-compat only\nif ( browser.webkit ) {\n\tbrowser.safari = true;\n}\n\njQuery.browser = browser;\n\njQuery.sub = function() {\n\tfunction jQuerySub( selector, context ) {\n\t\treturn new jQuerySub.fn.init( selector, context );\n\t}\n\tjQuery.extend( true, jQuerySub, this );\n\tjQuerySub.superclass = this;\n\tjQuerySub.fn = jQuerySub.prototype = this();\n\tjQuerySub.fn.constructor = jQuerySub;\n\tjQuerySub.sub = this.sub;\n\tjQuerySub.fn.init = function init( selector, context ) {\n\t\tif ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {\n\t\t\tcontext = jQuerySub( context );\n\t\t}\n\n\t\treturn jQuery.fn.init.call( this, selector, context, rootjQuerySub );\n\t};\n\tjQuerySub.fn.init.prototype = jQuerySub.fn;\n\tvar rootjQuerySub = jQuerySub(document);\n\treturn jQuerySub;\n};\n\t\n})();\nvar curCSS, iframe, iframeDoc,\n\tralpha = /alpha\\([^)]*\\)/i,\n\tropacity = /opacity=([^)]*)/,\n\trposition = /^(top|right|bottom|left)$/,\n\trmargin = /^margin/,\n\trnumsplit = new RegExp( \"^(\" + core_pnum + \")(.*)$\", \"i\" ),\n\trnumnonpx = new RegExp( \"^(\" + core_pnum + \")(?!px)[a-z%]+$\", \"i\" ),\n\trrelNum = new RegExp( \"^([-+])=(\" + core_pnum + \")\", \"i\" ),\n\telemdisplay = {},\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: 0,\n\t\tfontWeight: 400,\n\t\tlineHeight: 1\n\t},\n\n\tcssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ],\n\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ],\n\n\teventsToggle = jQuery.fn.toggle;\n\n// return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( style, name ) {\n\n\t// shortcut for names that are not vendor prefixed\n\tif ( name in style ) {\n\t\treturn name;\n\t}\n\n\t// check for vendor prefixed names\n\tvar capName = name.charAt(0).toUpperCase() + name.slice(1),\n\t\torigName = name,\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in style ) {\n\t\t\treturn name;\n\t\t}\n\t}\n\n\treturn origName;\n}\n\nfunction isHidden( elem, el ) {\n\telem = el || elem;\n\treturn jQuery.css( elem, \"display\" ) === \"none\" || !jQuery.contains( elem.ownerDocument, elem );\n}\n\nfunction showHide( elements, show ) {\n\tvar elem, display,\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\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\" );\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 ] && elem.style.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 ] = jQuery._data( elem, \"olddisplay\", css_defaultDisplay(elem.nodeName) );\n\t\t\t}\n\t\t} else {\n\t\t\tdisplay = curCSS( elem, \"display\" );\n\n\t\t\tif ( !values[ index ] && display !== \"none\" ) {\n\t\t\t\tjQuery._data( elem, \"olddisplay\", 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.fn.extend({\n\tcss: function( name, value ) {\n\t\treturn jQuery.access( this, function( elem, name, value ) {\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, fn2 ) {\n\t\tvar bool = typeof state === \"boolean\";\n\n\t\tif ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) {\n\t\t\treturn eventsToggle.apply( this, arguments );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( bool ? state : isHidden( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Exclude the following css properties to add px\n\tcssNumber: {\n\t\t\"fillOpacity\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t// normalize float css property\n\t\t\"float\": jQuery.support.cssFloat ? \"cssFloat\" : \"styleFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style;\n\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// convert relative number strings (+= or -=) to relative numbers. #7345\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n\t\t\t\tvalue = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that NaN and null values aren't set. See: #7116\n\t\t\tif ( value == null || type === \"number\" && isNaN( value ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"px\";\n\t\t\t}\n\n\t\t\t// 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\t// Wrapped to prevent IE from throwing errors when 'invalid' values are provided\n\t\t\t\t// Fixes bug #5509\n\t\t\t\ttry {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t} else {\n\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, numeric, extra ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = jQuery.camelCase( name );\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name );\n\t\t}\n\n\t\t//convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Return, converting to number if forced or a qualifier was provided and val looks numeric\n\t\tif ( numeric || extra !== undefined ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn numeric || jQuery.isNumeric( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t},\n\n\t// A method for quickly swapping in/out CSS properties to get correct calculations\n\tswap: function( elem, options, callback ) {\n\t\tvar ret, name,\n\t\t\told = {};\n\n\t\t// Remember the old values, and insert the new ones\n\t\tfor ( name in options ) {\n\t\t\told[ name ] = elem.style[ name ];\n\t\t\telem.style[ name ] = options[ name ];\n\t\t}\n\n\t\tret = callback.call( elem );\n\n\t\t// Revert the old values\n\t\tfor ( name in options ) {\n\t\t\telem.style[ name ] = old[ name ];\n\t\t}\n\n\t\treturn ret;\n\t}\n});\n\n// NOTE: To any future maintainer, we've used both window.getComputedStyle\n// and getComputedStyle here to produce a better gzip size\nif ( window.getComputedStyle ) {\n\tcurCSS = function( elem, name ) {\n\t\tvar ret, width, minWidth, maxWidth,\n\t\t\tcomputed = getComputedStyle( elem, null ),\n\t\t\tstyle = elem.style;\n\n\t\tif ( computed ) {\n\n\t\t\tret = computed[ name ];\n\t\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {\n\t\t\t\tret = jQuery.style( elem, name );\n\t\t\t}\n\n\t\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t\t// Chrome < 17 and Safari 5.0 uses \"computed value\" instead of \"used value\" for margin-right\n\t\t\t// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels\n\t\t\t// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\n\t\t\tif ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\t\t\t\twidth = style.width;\n\t\t\t\tminWidth = style.minWidth;\n\t\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\t\tret = computed.width;\n\n\t\t\t\tstyle.width = width;\n\t\t\t\tstyle.minWidth = minWidth;\n\t\t\t\tstyle.maxWidth = maxWidth;\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t};\n} else if ( document.documentElement.currentStyle ) {\n\tcurCSS = function( elem, name ) {\n\t\tvar left, rsLeft,\n\t\t\tret = elem.currentStyle && elem.currentStyle[ name ],\n\t\t\tstyle = elem.style;\n\n\t\t// Avoid setting ret to empty string here\n\t\t// so we don't default to auto\n\t\tif ( ret == null && style && style[ name ] ) {\n\t\t\tret = style[ name ];\n\t\t}\n\n\t\t// From the awesome hack by Dean Edwards\n\t\t// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\n\t\t// If we're not dealing with a regular pixel number\n\t\t// but a number that has a weird ending, we need to convert it to pixels\n\t\t// but not position css attributes, as those are proportional to the parent element instead\n\t\t// and we can't measure the parent instead because it might trigger a \"stacking dolls\" problem\n\t\tif ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\tleft = style.left;\n\t\t\trsLeft = elem.runtimeStyle && elem.runtimeStyle.left;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tif ( rsLeft ) {\n\t\t\t\telem.runtimeStyle.left = elem.currentStyle.left;\n\t\t\t}\n\t\t\tstyle.left = name === \"fontSize\" ? \"1em\" : ret;\n\t\t\tret = style.pixelLeft + \"px\";\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.left = left;\n\t\t\tif ( rsLeft ) {\n\t\t\t\telem.runtimeStyle.left = rsLeft;\n\t\t\t}\n\t\t}\n\n\t\treturn ret === \"\" ? \"auto\" : ret;\n\t};\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\tvar matches = rnumsplit.exec( value );\n\treturn matches ?\n\t\t\tMath.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || \"px\" ) :\n\t\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox ) {\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\t// we use jQuery.css instead of curCSS here\n\t\t\t// because of the reliableMarginRight CSS hook!\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true );\n\t\t}\n\n\t\t// From this point on we use curCSS for maximum performance (relevant in animations)\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 -= parseFloat( curCSS( elem, \"padding\" + cssExpand[ i ] ) ) || 0;\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 -= parseFloat( curCSS( elem, \"border\" + cssExpand[ i ] + \"Width\" ) ) || 0;\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 += parseFloat( curCSS( elem, \"padding\" + cssExpand[ i ] ) ) || 0;\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 += parseFloat( curCSS( elem, \"border\" + cssExpand[ i ] + \"Width\" ) ) || 0;\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 val = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\tvalueIsBorderBox = true,\n\t\tisBorderBox = jQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\" ) === \"border-box\";\n\n\tif ( val <= 0 ) {\n\t\t// Fall back to computed then uncomputed css if necessary\n\t\tval = curCSS( elem, name );\n\t\tif ( val < 0 || val == null ) {\n\t\t\tval = elem.style[ name ];\n\t\t}\n\n\t\t// Computed unit is not pixels. Stop here and return.\n\t\tif ( rnumnonpx.test(val) ) {\n\t\t\treturn val;\n\t\t}\n\n\t\t// we need the check for style in case a browser which returns unreliable values\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\t\tvalueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );\n\n\t\t// Normalize \"\", auto, and prepare for extra\n\t\tval = parseFloat( val ) || 0;\n\t}\n\n\t// use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox\n\t\t)\n\t) + \"px\";\n}\n\n\n// Try to determine the default display value of an element\nfunction css_defaultDisplay( nodeName ) {\n\tif ( elemdisplay[ nodeName ] ) {\n\t\treturn elemdisplay[ nodeName ];\n\t}\n\n\tvar elem = jQuery( \"<\" + nodeName + \">\" ).appendTo( document.body ),\n\t\tdisplay = elem.css(\"display\");\n\telem.remove();\n\n\t// If the simple way fails,\n\t// get element's real default display by attaching it to a temp iframe\n\tif ( display === \"none\" || display === \"\" ) {\n\t\t// Use the already-created iframe if possible\n\t\tiframe = document.body.appendChild(\n\t\t\tiframe || jQuery.extend( document.createElement(\"iframe\"), {\n\t\t\t\tframeBorder: 0,\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0\n\t\t\t})\n\t\t);\n\n\t\t// Create a cacheable copy of the iframe document on first call.\n\t\t// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML\n\t\t// document to it; WebKit & Firefox won't allow reusing the iframe document.\n\t\tif ( !iframeDoc || !iframe.createElement ) {\n\t\t\tiframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;\n\t\t\tiframeDoc.write(\"<!doctype html><html><body>\");\n\t\t\tiframeDoc.close();\n\t\t}\n\n\t\telem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );\n\n\t\tdisplay = curCSS( elem, \"display\" );\n\t\tdocument.body.removeChild( iframe );\n\t}\n\n\t// Store the correct default display\n\telemdisplay[ nodeName ] = display;\n\n\treturn display;\n}\n\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\t\t\t\tif ( elem.offsetWidth !== 0 || curCSS( elem, \"display\" ) !== \"none\" ) {\n\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t} else {\n\t\t\t\t\treturn jQuery.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}\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\treturn setPositiveNumber( elem, value, extra ?\n\t\t\t\taugmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tjQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\" ) === \"border-box\"\n\t\t\t\t) : 0\n\t\t\t);\n\t\t}\n\t};\n});\n\nif ( !jQuery.support.opacity ) {\n\tjQuery.cssHooks.opacity = {\n\t\tget: function( elem, computed ) {\n\t\t\t// IE uses filters for opacity\n\t\t\treturn ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || \"\" ) ?\n\t\t\t\t( 0.01 * parseFloat( RegExp.$1 ) ) + \"\" :\n\t\t\t\tcomputed ? \"1\" : \"\";\n\t\t},\n\n\t\tset: function( elem, value ) {\n\t\t\tvar style = elem.style,\n\t\t\t\tcurrentStyle = elem.currentStyle,\n\t\t\t\topacity = jQuery.isNumeric( value ) ? \"alpha(opacity=\" + value * 100 + \")\" : \"\",\n\t\t\t\tfilter = currentStyle && currentStyle.filter || style.filter || \"\";\n\n\t\t\t// IE has trouble with opacity if it does not have layout\n\t\t\t// Force it by setting the zoom level\n\t\t\tstyle.zoom = 1;\n\n\t\t\t// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652\n\t\t\tif ( value >= 1 && jQuery.trim( filter.replace( ralpha, \"\" ) ) === \"\" &&\n\t\t\t\tstyle.removeAttribute ) {\n\n\t\t\t\t// Setting style.filter to null, \"\" & \" \" still leave \"filter:\" in the cssText\n\t\t\t\t// if \"filter:\" is present at all, clearType is disabled, we want to avoid this\n\t\t\t\t// style.removeAttribute is IE Only, but so apparently is this code path...\n\t\t\t\tstyle.removeAttribute( \"filter\" );\n\n\t\t\t\t// if there there is no filter style applied in a css rule, we are done\n\t\t\t\tif ( currentStyle && !currentStyle.filter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// otherwise, set new filter values\n\t\t\tstyle.filter = ralpha.test( filter ) ?\n\t\t\t\tfilter.replace( ralpha, opacity ) :\n\t\t\t\tfilter + \" \" + opacity;\n\t\t}\n\t};\n}\n\n// These hooks cannot be added until DOM ready because the support test\n// for it is not run until after DOM ready\njQuery(function() {\n\tif ( !jQuery.support.reliableMarginRight ) {\n\t\tjQuery.cssHooks.marginRight = {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t\t// Work around by temporarily setting element display to inline-block\n\t\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" }, function() {\n\t\t\t\t\tif ( computed ) {\n\t\t\t\t\t\treturn curCSS( elem, \"marginRight\" );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t}\n\n\t// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n\t// getComputedStyle returns percent when specified for top/left/bottom/right\n\t// rather than make the css module depend on the offset module, we just check for it here\n\tif ( !jQuery.support.pixelPosition && jQuery.fn.position ) {\n\t\tjQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\t\t\tjQuery.cssHooks[ prop ] = {\n\t\t\t\tget: function( elem, computed ) {\n\t\t\t\t\tif ( computed ) {\n\t\t\t\t\t\tvar ret = curCSS( elem, prop );\n\t\t\t\t\t\t// if curCSS returns percentage, fallback to offset\n\t\t\t\t\t\treturn rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + \"px\" : ret;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t});\n\t}\n\n});\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.hidden = function( elem ) {\n\t\treturn ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, \"display\" )) === \"none\");\n\t};\n\n\tjQuery.expr.filters.visible = function( elem ) {\n\t\treturn !jQuery.expr.filters.hidden( elem );\n\t};\n}\n\n// These hooks are used by animate to expand properties\njQuery.each({\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i,\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\t\t\t\texpanded = {};\n\n\t\t\tfor ( i = 0; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n});\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,\n\trselectTextarea = /^(?:select|textarea)/i;\n\njQuery.fn.extend({\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map(function(){\n\t\t\treturn this.elements ? jQuery.makeArray( this.elements ) : this;\n\t\t})\n\t\t.filter(function(){\n\t\t\treturn this.name && !this.disabled &&\n\t\t\t\t( this.checked || rselectTextarea.test( this.nodeName ) ||\n\t\t\t\t\trinput.test( this.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, i ){\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t}).get();\n\t}\n});\n\n//Serialize an array of form elements or a set of\n//key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, value ) {\n\t\t\t// If value is a function, invoke it and return its value\n\t\t\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t};\n\n\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\tif ( traditional === undefined ) {\n\t\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t});\n\n\t} else {\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" ).replace( r20, \"+\" );\n};\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\t\t\t\t// If array item is non-scalar (array or object), encode its\n\t\t\t\t// numeric index to resolve deserialization ambiguity issues.\n\t\t\t\t// Note that rack (as of 1.0.0) can't currently deserialize\n\t\t\t\t// nested arrays properly, and attempting to do so may cause\n\t\t\t\t// a server error. Possible fixes are to modify rack's\n\t\t\t\t// deserialization algorithm or to provide an option or flag\n\t\t\t\t// to force array serialization to be shallow.\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}\nvar // Document location\n\tajaxLocation,\n\t// Document location segments\n\tajaxLocParts,\n\n\trhash = /#.*$/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg, // IE leaves an \\r character at EOL\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\trquery = /\\?/,\n\trscript = /<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,\n\trts = /([?&])_=[^&]*/,\n\trurl = /^([\\w\\+\\.\\-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+)|)|)/,\n\n\t// Keep a copy of the old load method\n\t_load = jQuery.fn.load,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = [\"*/\"] + [\"*\"];\n\n// #8138, IE may throw an exception when accessing\n// a field from window.location if document.domain has been set\ntry {\n\tajaxLocation = location.href;\n} catch( e ) {\n\t// Use the href attribute of an A element\n\t// since IE will modify it given document.location\n\tajaxLocation = document.createElement( \"a\" );\n\tajaxLocation.href = \"\";\n\tajaxLocation = ajaxLocation.href;\n}\n\n// Segment location into parts\najaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType, list, placeBefore,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().split( core_rspace ),\n\t\t\ti = 0,\n\t\t\tlength = dataTypes.length;\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tdataType = dataTypes[ i ];\n\t\t\t\t// We control if we're asked to add before\n\t\t\t\t// any existing element\n\t\t\t\tplaceBefore = /^\\+/.test( dataType );\n\t\t\t\tif ( placeBefore ) {\n\t\t\t\t\tdataType = dataType.substr( 1 ) || \"*\";\n\t\t\t\t}\n\t\t\t\tlist = structure[ dataType ] = structure[ dataType ] || [];\n\t\t\t\t// then we add to the structure accordingly\n\t\t\t\tlist[ placeBefore ? \"unshift\" : \"push\" ]( func );\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\t\tdataType /* internal */, inspected /* internal */ ) {\n\n\tdataType = dataType || options.dataTypes[ 0 ];\n\tinspected = inspected || {};\n\n\tinspected[ dataType ] = true;\n\n\tvar selection,\n\t\tlist = structure[ dataType ],\n\t\ti = 0,\n\t\tlength = list ? list.length : 0,\n\t\texecuteOnly = ( structure === prefilters );\n\n\tfor ( ; i < length && ( executeOnly || !selection ); i++ ) {\n\t\tselection = list[ i ]( options, originalOptions, jqXHR );\n\t\t// If we got redirected to another dataType\n\t\t// we try there if executing only and not done already\n\t\tif ( typeof selection === \"string\" ) {\n\t\t\tif ( !executeOnly || inspected[ selection ] ) {\n\t\t\t\tselection = undefined;\n\t\t\t} else {\n\t\t\t\toptions.dataTypes.unshift( selection );\n\t\t\t\tselection = inspectPrefiltersOrTransports(\n\t\t\t\t\t\tstructure, options, originalOptions, jqXHR, selection, inspected );\n\t\t\t}\n\t\t}\n\t}\n\t// If we're only executing or nothing was selected\n\t// we try the catchall dataType if not done already\n\tif ( ( executeOnly || !selection ) && !inspected[ \"*\" ] ) {\n\t\tselection = inspectPrefiltersOrTransports(\n\t\t\t\tstructure, options, originalOptions, jqXHR, \"*\", inspected );\n\t}\n\t// unnecessary when only executing (prefilters)\n\t// but it'll be ignored by the caller in that case\n\treturn 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\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\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\njQuery.fn.load = function( url, params, callback ) {\n\tif ( typeof url !== \"string\" && _load ) {\n\t\treturn _load.apply( this, arguments );\n\t}\n\n\t// Don't do a request if no elements are being requested\n\tif ( !this.length ) {\n\t\treturn this;\n\t}\n\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf(\" \");\n\n\tif ( off >= 0 ) {\n\t\tselector = url.slice( off, url.length );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// Request the remote document\n\tjQuery.ajax({\n\t\turl: url,\n\n\t\t// if \"type\" variable is undefined, then \"GET\" method will be used\n\t\ttype: type,\n\t\tdataType: \"html\",\n\t\tdata: params,\n\t\tcomplete: function( jqXHR, status ) {\n\t\t\tif ( callback ) {\n\t\t\t\tself.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t}\n\t\t}\n\t}).done(function( responseText ) {\n\n\t\t// Save response for use in complete callback\n\t\tresponse = arguments;\n\n\t\t// See if a selector was specified\n\t\tself.html( selector ?\n\n\t\t\t// Create a dummy div to hold the results\n\t\t\tjQuery(\"<div>\")\n\n\t\t\t\t// inject the contents of the document in, removing the scripts\n\t\t\t\t// to avoid any 'Permission Denied' errors in IE\n\t\t\t\t.append( responseText.replace( rscript, \"\" ) )\n\n\t\t\t\t// Locate the specified elements\n\t\t\t\t.find( selector ) :\n\n\t\t\t// If not, just inject the full result\n\t\t\tresponseText );\n\n\t});\n\n\treturn this;\n};\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( \"ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend\".split( \" \" ), function( i, o ){\n\tjQuery.fn[ o ] = function( f ){\n\t\treturn this.on( o, f );\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\ttype: method,\n\t\t\turl: url,\n\t\t\tdata: data,\n\t\t\tsuccess: callback,\n\t\t\tdataType: type\n\t\t});\n\t};\n});\n\njQuery.extend({\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\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\tif ( settings ) {\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( target, jQuery.ajaxSettings );\n\t\t} else {\n\t\t\t// Extending ajaxSettings\n\t\t\tsettings = target;\n\t\t\ttarget = jQuery.ajaxSettings;\n\t\t}\n\t\tajaxExtend( target, settings );\n\t\treturn target;\n\t},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\ttype: \"GET\",\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\t\tprocessData: true,\n\t\tasync: true,\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\txml: \"application/xml, text/xml\",\n\t\t\thtml: \"text/html\",\n\t\t\ttext: \"text/plain\",\n\t\t\tjson: \"application/json, text/javascript\",\n\t\t\t\"*\": allTypes\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},\n\n\t\t// List of data converters\n\t\t// 1) key format is \"source_type destination_type\" (a single space in-between)\n\t\t// 2) the catchall symbol \"*\" can be used for source_type\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": window.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\tcontext: true,\n\t\t\turl: true\n\t\t}\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 // ifModified key\n\t\t\tifModifiedKey,\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\t\t\t// transport\n\t\t\ttransport,\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\n\t\t\t// It's the callbackContext if one was provided in the options\n\t\t\t// and if it's a DOM node or a jQuery collection\n\t\t\tglobalEventContext = callbackContext !== s &&\n\t\t\t\t( callbackContext.nodeType || callbackContext instanceof jQuery ) ?\n\t\t\t\t\t\tjQuery( callbackContext ) : jQuery.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\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tvar lname = name.toLowerCase();\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// 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// 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 === undefined ? null : match;\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// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tstatusText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( statusText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, statusText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Callback for when everything is done\n\t\t// It is defined here because jslint complains if it is declared\n\t\t// at the end of the function (which would be more logical and readable)\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// 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// If successful, handle type chaining\n\t\t\tif ( status >= 200 && status < 300 || status === 304 ) {\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\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[ ifModifiedKey ] = 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[ ifModifiedKey ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If not modified\n\t\t\t\tif ( status === 304 ) {\n\n\t\t\t\t\tstatusText = \"notmodified\";\n\t\t\t\t\tisSuccess = true;\n\n\t\t\t\t// If we have data\n\t\t\t\t} else {\n\n\t\t\t\t\tisSuccess = ajaxConvert( s, response );\n\t\t\t\t\tstatusText = isSuccess.state;\n\t\t\t\t\tsuccess = isSuccess.data;\n\t\t\t\t\terror = isSuccess.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// We extract error from statusText\n\t\t\t\t// then normalize statusText and status for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( !statusText || status ) {\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( \"ajax\" + ( isSuccess ? \"Success\" : \"Error\" ),\n\t\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\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\t\tjqXHR.complete = completeDeferred.add;\n\n\t\t// Status-dependent callbacks\n\t\tjqXHR.statusCode = function( map ) {\n\t\t\tif ( map ) {\n\t\t\t\tvar tmp;\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tfor ( tmp in map ) {\n\t\t\t\t\t\tstatusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttmp = map[ jqXHR.status ];\n\t\t\t\t\tjqXHR.always( tmp );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this;\n\t\t};\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url ) + \"\" ).replace( rhash, \"\" ).replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().split( core_rspace );\n\n\t\t// Determine if a cross-domain request is in order\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? 80 : 443 ) ) !=\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? 80 : 443 ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\tfireGlobals = s.global;\n\n\t\t// 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// 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// 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\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + 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// Get ifModifiedKey before adding the anti-cache parameter\n\t\t\tifModifiedKey = s.url;\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\n\t\t\t\tvar ts = jQuery.now(),\n\t\t\t\t\t// try replacing _= if it is there\n\t\t\t\t\tret = s.url.replace( rts, \"$1_=\" + ts );\n\n\t\t\t\t// if nothing was replaced, add timestamp to the end\n\t\t\t\ts.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? \"&\" : \"?\" ) + \"_=\" + ts : \"\" );\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 If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tifModifiedKey = ifModifiedKey || s.url;\n\t\t\tif ( jQuery.lastModified[ ifModifiedKey ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ ifModifiedKey ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ ifModifiedKey ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ ifModifiedKey ] );\n\t\t\t}\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\t// Abort if not done already and return\n\t\t\t\treturn jqXHR.abort();\n\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\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\treturn jqXHR;\n\t},\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});\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\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes,\n\t\tresponseFields = s.responseFields;\n\n\t// Fill responseXXX fields\n\tfor ( type in responseFields ) {\n\t\tif ( type in responses ) {\n\t\t\tjqXHR[ responseFields[type] ] = responses[ type ];\n\t\t}\n\t}\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\nfunction ajaxConvert( s, response ) {\n\n\tvar conv, conv2, current, tmp,\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\t\tprev = dataTypes[ 0 ],\n\t\tconverters = {},\n\t\ti = 0;\n\n\t// Apply the dataFilter if provided\n\tif ( s.dataFilter ) {\n\t\tresponse = s.dataFilter( response, s.dataType );\n\t}\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\t// Convert to each sequential dataType, tolerating list modification\n\tfor ( ; (current = dataTypes[++i]); ) {\n\n\t\t// There's only work to do if current dataType is non-auto\n\t\tif ( current !== \"*\" ) {\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\tif ( 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.splice( i--, 0, current );\n\t\t\t\t\t\t\t\t}\n\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\n\t\t\t// Update prev for next iteration\n\t\t\tprev = current;\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\nvar oldCallbacks = [],\n\trquestion = /\\?/,\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/,\n\tnonce = jQuery.now();\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\tdata = s.data,\n\t\turl = s.url,\n\t\thasCallback = s.jsonp !== false,\n\t\treplaceInUrl = hasCallback && rjsonp.test( url ),\n\t\treplaceInData = hasCallback && !replaceInUrl && typeof data === \"string\" &&\n\t\t\t!( s.contentType || \"\" ).indexOf(\"application/x-www-form-urlencoded\") &&\n\t\t\trjsonp.test( data );\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( s.dataTypes[ 0 ] === \"jsonp\" || replaceInUrl || replaceInData ) {\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\t\toverwritten = window[ callbackName ];\n\n\t\t// Insert callback into url or form data\n\t\tif ( replaceInUrl ) {\n\t\t\ts.url = url.replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( replaceInData ) {\n\t\t\ts.data = data.replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( hasCallback ) {\n\t\t\ts.url += ( rquestion.test( 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\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// 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: /javascript|ecmascript/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n});\n\n// Handle cache's special case and global\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t\ts.global = false;\n\t}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function(s) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\n\t\tvar script,\n\t\t\thead = document.head || document.getElementsByTagName( \"head\" )[0] || document.documentElement;\n\n\t\treturn {\n\n\t\t\tsend: function( _, callback ) {\n\n\t\t\t\tscript = document.createElement( \"script\" );\n\n\t\t\t\tscript.async = \"async\";\n\n\t\t\t\tif ( s.scriptCharset ) {\n\t\t\t\t\tscript.charset = s.scriptCharset;\n\t\t\t\t}\n\n\t\t\t\tscript.src = s.url;\n\n\t\t\t\t// Attach handlers for all browsers\n\t\t\t\tscript.onload = script.onreadystatechange = function( _, isAbort ) {\n\n\t\t\t\t\tif ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n\t\t\t\t\t\t// Handle memory leak in IE\n\t\t\t\t\t\tscript.onload = script.onreadystatechange = null;\n\n\t\t\t\t\t\t// Remove the script\n\t\t\t\t\t\tif ( head && script.parentNode ) {\n\t\t\t\t\t\t\thead.removeChild( script );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Dereference the script\n\t\t\t\t\t\tscript = undefined;\n\n\t\t\t\t\t\t// Callback if not abort\n\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\tcallback( 200, \"success\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\t// Use insertBefore instead of appendChild  to circumvent an IE6 bug.\n\t\t\t\t// This arises when a base node is used (#2709 and #4378).\n\t\t\t\thead.insertBefore( script, head.firstChild );\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( script ) {\n\t\t\t\t\tscript.onload( 0, 1 );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\nvar xhrCallbacks,\n\t// #5280: Internet Explorer will keep connections alive if we don't abort on unload\n\txhrOnUnloadAbort = window.ActiveXObject ? function() {\n\t\t// Abort all pending requests\n\t\tfor ( var key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]( 0, 1 );\n\t\t}\n\t} : false,\n\txhrId = 0;\n\n// Functions to create xhrs\nfunction createStandardXHR() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch( e ) {}\n}\n\nfunction createActiveXHR() {\n\ttry {\n\t\treturn new window.ActiveXObject( \"Microsoft.XMLHTTP\" );\n\t} catch( e ) {}\n}\n\n// Create the request object\n// (This is still attached to ajaxSettings for backward compatibility)\njQuery.ajaxSettings.xhr = window.ActiveXObject ?\n\t/* Microsoft failed to properly\n\t * implement the XMLHttpRequest in IE7 (can't request local files),\n\t * so we use the ActiveXObject when it is available\n\t * Additionally XMLHttpRequest can be disabled in IE7/IE8 so\n\t * we need a fallback.\n\t */\n\tfunction() {\n\t\treturn !this.isLocal && createStandardXHR() || createActiveXHR();\n\t} :\n\t// For all other browsers, use the standard XMLHttpRequest object\n\tcreateStandardXHR;\n\n// Determine support properties\n(function( xhr ) {\n\tjQuery.extend( jQuery.support, {\n\t\tajax: !!xhr,\n\t\tcors: !!xhr && ( \"withCredentials\" in xhr )\n\t});\n})( jQuery.ajaxSettings.xhr() );\n\n// Create transport if the browser can provide an xhr\nif ( jQuery.support.ajax ) {\n\n\tjQuery.ajaxTransport(function( s ) {\n\t\t// Cross domain only allowed if supported through XMLHttpRequest\n\t\tif ( !s.crossDomain || jQuery.support.cors ) {\n\n\t\t\tvar callback;\n\n\t\t\treturn {\n\t\t\t\tsend: function( headers, complete ) {\n\n\t\t\t\t\t// Get a new xhr\n\t\t\t\t\tvar handle, i,\n\t\t\t\t\t\txhr = s.xhr();\n\n\t\t\t\t\t// Open the socket\n\t\t\t\t\t// Passing null username, generates a login popup on Opera (#2865)\n\t\t\t\t\tif ( s.username ) {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async, s.username, s.password );\n\t\t\t\t\t} else {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Apply custom fields if provided\n\t\t\t\t\tif ( s.xhrFields ) {\n\t\t\t\t\t\tfor ( i in s.xhrFields ) {\n\t\t\t\t\t\t\txhr[ i ] = s.xhrFields[ i ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Override mime type if needed\n\t\t\t\t\tif ( s.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\t\txhr.overrideMimeType( s.mimeType );\n\t\t\t\t\t}\n\n\t\t\t\t\t// X-Requested-With header\n\t\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\t\tif ( !s.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Need an extra try/catch for cross domain requests in Firefox 3\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch( _ ) {}\n\n\t\t\t\t\t// Do send the request\n\t\t\t\t\t// This may raise an exception which is actually\n\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\n\t\t\t\t\txhr.send( ( s.hasContent && s.data ) || null );\n\n\t\t\t\t\t// Listener\n\t\t\t\t\tcallback = function( _, isAbort ) {\n\n\t\t\t\t\t\tvar status,\n\t\t\t\t\t\t\tstatusText,\n\t\t\t\t\t\t\tresponseHeaders,\n\t\t\t\t\t\t\tresponses,\n\t\t\t\t\t\t\txml;\n\n\t\t\t\t\t\t// Firefox throws exceptions when accessing properties\n\t\t\t\t\t\t// of an xhr when a network error occurred\n\t\t\t\t\t\t// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)\n\t\t\t\t\t\ttry {\n\n\t\t\t\t\t\t\t// Was never called and is aborted or complete\n\t\t\t\t\t\t\tif ( callback && ( isAbort || xhr.readyState === 4 ) ) {\n\n\t\t\t\t\t\t\t\t// Only called once\n\t\t\t\t\t\t\t\tcallback = undefined;\n\n\t\t\t\t\t\t\t\t// Do not keep as active anymore\n\t\t\t\t\t\t\t\tif ( handle ) {\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = jQuery.noop;\n\t\t\t\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t\t\t\tdelete xhrCallbacks[ handle ];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// If it's an abort\n\t\t\t\t\t\t\t\tif ( isAbort ) {\n\t\t\t\t\t\t\t\t\t// Abort it manually if needed\n\t\t\t\t\t\t\t\t\tif ( xhr.readyState !== 4 ) {\n\t\t\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tstatus = xhr.status;\n\t\t\t\t\t\t\t\t\tresponseHeaders = xhr.getAllResponseHeaders();\n\t\t\t\t\t\t\t\t\tresponses = {};\n\t\t\t\t\t\t\t\t\txml = xhr.responseXML;\n\n\t\t\t\t\t\t\t\t\t// Construct response list\n\t\t\t\t\t\t\t\t\tif ( xml && xml.documentElement /* #4958 */ ) {\n\t\t\t\t\t\t\t\t\t\tresponses.xml = xml;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// When requesting binary data, IE6-9 will throw an exception\n\t\t\t\t\t\t\t\t\t// on any attempt to access responseText (#11426)\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tresponses.text = xhr.responseText;\n\t\t\t\t\t\t\t\t\t} catch( _ ) {\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Firefox throws an exception when accessing\n\t\t\t\t\t\t\t\t\t// statusText for faulty cross-domain requests\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tstatusText = xhr.statusText;\n\t\t\t\t\t\t\t\t\t} catch( e ) {\n\t\t\t\t\t\t\t\t\t\t// We normalize with Webkit giving an empty statusText\n\t\t\t\t\t\t\t\t\t\tstatusText = \"\";\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Filter status for non standard behaviors\n\n\t\t\t\t\t\t\t\t\t// If the request is local and we have data: assume a success\n\t\t\t\t\t\t\t\t\t// (success with no data won't get notified, that's the best we\n\t\t\t\t\t\t\t\t\t// can do given current implementations)\n\t\t\t\t\t\t\t\t\tif ( !status && s.isLocal && !s.crossDomain ) {\n\t\t\t\t\t\t\t\t\t\tstatus = responses.text ? 200 : 404;\n\t\t\t\t\t\t\t\t\t// IE - #1450: sometimes returns 1223 when it should be 204\n\t\t\t\t\t\t\t\t\t} else if ( status === 1223 ) {\n\t\t\t\t\t\t\t\t\t\tstatus = 204;\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} catch( firefoxAccessException ) {\n\t\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\t\tcomplete( -1, firefoxAccessException );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Call complete if needed\n\t\t\t\t\t\tif ( responses ) {\n\t\t\t\t\t\t\tcomplete( status, statusText, responses, responseHeaders );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\tif ( !s.async ) {\n\t\t\t\t\t\t// if we're in sync mode we fire the callback\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t} else if ( xhr.readyState === 4 ) {\n\t\t\t\t\t\t// (IE6 & IE7) if it's in cache and has been\n\t\t\t\t\t\t// retrieved directly we need to fire the callback\n\t\t\t\t\t\tsetTimeout( callback, 0 );\n\t\t\t\t\t} else {\n\t\t\t\t\t\thandle = ++xhrId;\n\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t// Create the active xhrs callbacks list if needed\n\t\t\t\t\t\t\t// and attach the unload handler\n\t\t\t\t\t\t\tif ( !xhrCallbacks ) {\n\t\t\t\t\t\t\t\txhrCallbacks = {};\n\t\t\t\t\t\t\t\tjQuery( window ).unload( xhrOnUnloadAbort );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Add to list of active xhrs callbacks\n\t\t\t\t\t\t\txhrCallbacks[ handle ] = callback;\n\t\t\t\t\t\t}\n\t\t\t\t\t\txhr.onreadystatechange = callback;\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tabort: function() {\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tcallback(0,1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t});\n}\nvar fxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = new RegExp( \"^(?:([-+])=|)(\" + core_pnum + \")([a-z%]*)$\", \"i\" ),\n\trrun = /queueHooks$/,\n\tanimationPrefilters = [ defaultPrefilter ],\n\ttweeners = {\n\t\t\"*\": [function( prop, value ) {\n\t\t\tvar end, unit, prevScale,\n\t\t\t\ttween = this.createTween( prop, value ),\n\t\t\t\tparts = rfxnum.exec( value ),\n\t\t\t\ttarget = tween.cur(),\n\t\t\t\tstart = +target || 0,\n\t\t\t\tscale = 1;\n\n\t\t\tif ( parts ) {\n\t\t\t\tend = +parts[2];\n\t\t\t\tunit = parts[3] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\n\t\t\t\t// We need to compute starting value\n\t\t\t\tif ( unit !== \"px\" && start ) {\n\t\t\t\t\t// Iteratively approximate from a nonzero starting point\n\t\t\t\t\t// Prefer the current property, because this process will be trivial if it uses the same units\n\t\t\t\t\t// Fallback to end or a simple constant\n\t\t\t\t\tstart = jQuery.css( tween.elem, prop, true ) || end || 1;\n\n\t\t\t\t\tdo {\n\t\t\t\t\t\t// If previous iteration zeroed out, double until we get *something*\n\t\t\t\t\t\t// Use a string for doubling factor so we don't accidentally see scale as unchanged below\n\t\t\t\t\t\tprevScale = scale = scale || \".5\";\n\n\t\t\t\t\t\t// Adjust and apply\n\t\t\t\t\t\tstart = start / scale;\n\t\t\t\t\t\tjQuery.style( tween.elem, prop, start + unit );\n\n\t\t\t\t\t\t// Update scale, tolerating zeroes from tween.cur()\n\t\t\t\t\t\tscale = tween.cur() / target;\n\n\t\t\t\t\t// Stop looping if we've hit the mark or scale is unchanged\n\t\t\t\t\t} while ( scale !== 1 && scale !== prevScale );\n\t\t\t\t}\n\n\t\t\t\ttween.unit = unit;\n\t\t\t\ttween.start = start;\n\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\ttween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;\n\t\t\t}\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}, 0 );\n\treturn ( fxNow = jQuery.now() );\n}\n\nfunction createTweens( animation, props ) {\n\tjQuery.each( props, function( prop, value ) {\n\t\tvar collection = ( tweeners[ prop ] || [] ).concat( tweeners[ \"*\" ] ),\n\t\t\tindex = 0,\n\t\t\tlength = collection.length;\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tif ( collection[ index ].call( animation, prop, value ) ) {\n\n\t\t\t\t// we're done with this property\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tindex = 0,\n\t\ttweenerIndex = 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\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\t\t\t\tpercent = 1 - ( remaining / animation.duration || 0 ),\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, easing ) {\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\n\t\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// resolve when we played the last frame\n\t\t\t\t// otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length ; index++ ) {\n\t\tresult = animationPrefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tcreateTweens( animation, props );\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\tanim: animation,\n\t\t\tqueue: animation.opts.queue,\n\t\t\telem: elem\n\t\t})\n\t);\n\n\t// attach callbacks from options\n\treturn animation.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( jQuery.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// not quite $.extend, this wont overwrite keys already present.\n\t\t\t// also - reusing 'index' from above because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.split(\" \");\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length ; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\ttweeners[ prop ] = tweeners[ prop ] || [];\n\t\t\ttweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tanimationPrefilters.unshift( callback );\n\t\t} else {\n\t\t\tanimationPrefilters.push( callback );\n\t\t}\n\t}\n});\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar index, prop, value, length, dataShow, tween, hooks, oldfire,\n\t\tanim = this,\n\t\tstyle = elem.style,\n\t\torig = {},\n\t\thandled = [],\n\t\thidden = elem.nodeType && isHidden( elem );\n\n\t// handle queue: false promises\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always(function() {\n\t\t\t// doing this makes sure that the complete handler will be called\n\t\t\t// before this completes\n\t\t\tanim.always(function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t// height/width overflow pass\n\tif ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\n\t\t// Make sure that nothing sneaks out\n\t\t// Record all 3 overflow attributes because IE does not\n\t\t// change the overflow attribute when overflowX and\n\t\t// overflowY are set to the same value\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Set display property to inline-block for height/width\n\t\t// animations on inline elements that are having width/height animated\n\t\tif ( jQuery.css( elem, \"display\" ) === \"inline\" &&\n\t\t\t\tjQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t// inline-level elements accept inline-block;\n\t\t\t// block-level elements need to be inline with layout\n\t\t\tif ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === \"inline\" ) {\n\t\t\t\tstyle.display = \"inline-block\";\n\n\t\t\t} else {\n\t\t\t\tstyle.zoom = 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tif ( !jQuery.support.shrinkWrapBlocks ) {\n\t\t\tanim.done(function() {\n\t\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t\t});\n\t\t}\n\t}\n\n\n\t// show/hide pass\n\tfor ( index in props ) {\n\t\tvalue = props[ index ];\n\t\tif ( rfxtypes.exec( value ) ) {\n\t\t\tdelete props[ index ];\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\thandled.push( index );\n\t\t}\n\t}\n\n\tlength = handled.length;\n\tif ( length ) {\n\t\tdataShow = jQuery._data( elem, \"fxshow\" ) || jQuery._data( elem, \"fxshow\", {} );\n\t\tif ( hidden ) {\n\t\t\tjQuery( elem ).show();\n\t\t} else {\n\t\t\tanim.done(function() {\n\t\t\t\tjQuery( elem ).hide();\n\t\t\t});\n\t\t}\n\t\tanim.done(function() {\n\t\t\tvar prop;\n\t\t\tjQuery.removeData( elem, \"fxshow\", true );\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 ( index = 0 ; index < length ; index++ ) {\n\t\t\tprop = handled[ index ];\n\t\t\ttween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );\n\t\t\torig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );\n\n\t\t\tif ( !( prop in dataShow ) ) {\n\t\t\t\tdataShow[ prop ] = tween.start;\n\t\t\t\tif ( hidden ) {\n\t\t\t\t\ttween.end = tween.start;\n\t\t\t\t\ttween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || \"swing\";\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tthis.pos = eased = jQuery.easing[ this.easing ]( percent, this.options.duration * percent, 0, 1, this.options.duration );\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 any value as a 4th parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails\n\t\t\t// so, simple values such as \"10px\" are parsed to Float.\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, false, \"\" );\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\t\t\t// use step hook for back compat - use cssHook if its there - use .style if its\n\t\t\t// available and use plain properties where available\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Remove in 2.0 - this supports IE8's panic based approach\n// to setting things on disconnected nodes\n\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.each([ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ||\n\t\t\t// special check for .toggle( handler, handler, ... )\n\t\t\t( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n});\n\njQuery.fn.extend({\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHidden ).css( \"opacity\", 0 ).show()\n\n\t\t\t// animate to the value specified\n\t\t\t.end().animate({ opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations resolve immediately\n\t\t\t\tif ( empty ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = jQuery._data( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// start the next in the queue if the last step wasn't forced\n\t\t\t// timers currently will call their complete callbacks, which will dequeue\n\t\t\t// but only if they were gotoEnd\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t}\n});\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\tattrs = { height: type },\n\t\ti = 0;\n\n\t// if we include width, step value is 1 to do all cssExpand values,\n\t// if we don't include width, step value is 2 to skip over Left and Right\n\tfor( ; i < 4 ; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx(\"show\"),\n\tslideUp: genFx(\"hide\"),\n\tslideToggle: genFx(\"toggle\"),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n});\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t// normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p*Math.PI ) / 2;\n\t}\n};\n\njQuery.timers = [];\njQuery.fx = Tween.prototype.init;\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ttimers = jQuery.timers,\n\t\ti = 0;\n\n\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};\n\njQuery.fx.timer = function( timer ) {\n\tif ( timer() && jQuery.timers.push( timer ) && !timerId ) {\n\t\ttimerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.interval = 13;\n\njQuery.fx.stop = function() {\n\tclearInterval( timerId );\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\t// Default speed\n\t_default: 400\n};\n\n// Back Compat <1.8 extension point\njQuery.fx.step = {};\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.animated = function( elem ) {\n\t\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\t\treturn elem === fn.elem;\n\t\t}).length;\n\t};\n}\nvar rroot = /^(?:body|html)$/i;\n\njQuery.fn.offset = function( options ) {\n\tif ( arguments.length ) {\n\t\treturn options === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function( i ) {\n\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t});\n\t}\n\n\tvar box, docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft, top, left,\n\t\telem = this[ 0 ],\n\t\tdoc = elem && elem.ownerDocument;\n\n\tif ( !doc ) {\n\t\treturn;\n\t}\n\n\tif ( (body = doc.body) === elem ) {\n\t\treturn jQuery.offset.bodyOffset( elem );\n\t}\n\n\tdocElem = doc.documentElement;\n\n\t// Make sure we're not dealing with a disconnected DOM node\n\tif ( !jQuery.contains( docElem, elem ) ) {\n\t\treturn { top: 0, left: 0 };\n\t}\n\n\tbox = elem.getBoundingClientRect();\n\twin = getWindow( doc );\n\tclientTop  = docElem.clientTop  || body.clientTop  || 0;\n\tclientLeft = docElem.clientLeft || body.clientLeft || 0;\n\tscrollTop  = win.pageYOffset || docElem.scrollTop;\n\tscrollLeft = win.pageXOffset || docElem.scrollLeft;\n\ttop  = box.top  + scrollTop  - clientTop;\n\tleft = box.left + scrollLeft - clientLeft;\n\n\treturn { top: top, left: left };\n};\n\njQuery.offset = {\n\n\tbodyOffset: function( body ) {\n\t\tvar top = body.offsetTop,\n\t\t\tleft = body.offsetLeft;\n\n\t\tif ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {\n\t\t\ttop  += parseFloat( jQuery.css(body, \"marginTop\") ) || 0;\n\t\t\tleft += parseFloat( jQuery.css(body, \"marginLeft\") ) || 0;\n\t\t}\n\n\t\treturn { top: top, left: left };\n\t},\n\n\tsetOffset: function( elem, options, i ) {\n\t\tvar position = jQuery.css( elem, \"position\" );\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\tvar curElem = jQuery( elem ),\n\t\t\tcurOffset = curElem.offset(),\n\t\t\tcurCSSTop = jQuery.css( elem, \"top\" ),\n\t\t\tcurCSSLeft = jQuery.css( elem, \"left\" ),\n\t\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) && jQuery.inArray(\"auto\", [curCSSTop, curCSSLeft]) > -1,\n\t\t\tprops = {}, curPosition = {}, curTop, curLeft;\n\n\t\t// need to be able to calculate position if either top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\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\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\n\njQuery.fn.extend({\n\n\tposition: function() {\n\t\tif ( !this[0] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar elem = this[0],\n\n\t\t// Get *real* offsetParent\n\t\toffsetParent = this.offsetParent(),\n\n\t\t// Get correct offsets\n\t\toffset       = this.offset(),\n\t\tparentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();\n\n\t\t// Subtract element margins\n\t\t// note: when an element has margin: auto the offsetLeft and marginLeft\n\t\t// are the same in Safari causing offset.left to incorrectly be 0\n\t\toffset.top  -= parseFloat( jQuery.css(elem, \"marginTop\") ) || 0;\n\t\toffset.left -= parseFloat( jQuery.css(elem, \"marginLeft\") ) || 0;\n\n\t\t// Add offsetParent borders\n\t\tparentOffset.top  += parseFloat( jQuery.css(offsetParent[0], \"borderTopWidth\") ) || 0;\n\t\tparentOffset.left += parseFloat( jQuery.css(offsetParent[0], \"borderLeftWidth\") ) || 0;\n\n\t\t// Subtract the two offsets\n\t\treturn {\n\t\t\ttop:  offset.top  - parentOffset.top,\n\t\t\tleft: offset.left - parentOffset.left\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || document.body;\n\t\t\twhile ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, \"position\") === \"static\") ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\t\t\treturn offsetParent || document.body;\n\t\t});\n\t}\n});\n\n\n// Create scrollLeft and scrollTop methods\njQuery.each( {scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\"}, function( method, prop ) {\n\tvar top = /Y/.test( prop );\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn jQuery.access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? (prop in win) ? win[ prop ] :\n\t\t\t\t\twin.document.documentElement[ method ] :\n\t\t\t\t\telem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : jQuery( win ).scrollLeft(),\n\t\t\t\t\t top ? val : jQuery( win ).scrollTop()\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length, null );\n\t};\n});\n\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ?\n\t\telem :\n\t\telem.nodeType === 9 ?\n\t\t\telem.defaultView || elem.parentWindow :\n\t\t\tfalse;\n}\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name }, function( defaultExtra, funcName ) {\n\t\t// margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn jQuery.access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t\t\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\n\t\t\t\t\t// isn't a whole lot we can do. See pull request at this URL for discussion:\n\t\t\t\t\t// https://github.com/jquery/jquery/pull/764\n\t\t\t\t\treturn elem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest\n\t\t\t\t\t// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\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, value, 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 );\n\t\t};\n\t});\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\tdefine( \"jquery\", [], function () { return jQuery; } );\n}\n\n})( window );\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/demo/killer.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta charset=\"utf-8\">\n    <title>Killer Option</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"demonstration of some noty capabilities\">\n\n    <link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic&amp;subset=latin,latin-ext,cyrillic' rel='stylesheet' type='text/css'>\n    <style type=\"text/css\">\n\n        html {\n            height: 100%;\n            width: 100%;\n        }\n\n        body {\n            font-family: 'PT Sans', Tahoma, Arial, serif;\n            line-height: 13px\n        }\n\n    </style>\n\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"buttons.css\"/>\n\n</head>\n<body>\n\n<div class=\"container\">\n\n    <div id=\"customContainer\"></div>\n\n</div>\n\n<script src=\"jquery-1.7.2.min.js\"></script>\n\n<!-- noty -->\n<script type=\"text/javascript\" src=\"../js/noty/packaged/jquery.noty.packaged.js\"></script>\n\n<script type=\"text/javascript\">\n\n    function generate(type) {\n        var n = noty({\n            text        : type,\n            type        : type,\n            dismissQueue: true,\n            layout      : 'topCenter',\n            theme       : 'relax'\n        });\n        console.log('html: ' + n.options.id);\n    }\n\n    function generateKiller() {\n        var n = noty({\n            text        : 'I\\'m the killer noty!',\n            type        : 'error',\n            dismissQueue: true,\n            killer      : true,\n            layout      : 'topLeft',\n            theme       : 'relax'\n        });\n        console.log('html: ' + n.options.id);\n    }\n\n    function generateAll() {\n        generate('alert');\n        generate('information');\n        generate('error');\n        generate('warning');\n        generate('notification');\n        generate('success');\n    }\n\n    $(document).ready(function () {\n\n        generateAll();\n\n        setTimeout(function () {\n            generateKiller();\n        }, 2000);\n\n    });\n\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/demo/noanim.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta charset=\"utf-8\">\n    <title>No Animation</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"demonstration of some noty capabilities\">\n\n    <link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic&amp;subset=latin,latin-ext,cyrillic' rel='stylesheet' type='text/css'>\n    <style type=\"text/css\">\n\n        html {\n            height: 100%;\n            width: 100%;\n        }\n\n        body {\n            font-family: 'PT Sans', Tahoma, Arial, serif;\n            line-height: 13px\n        }\n\n    </style>\n\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"buttons.css\"/>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"animate.css\"/>\n\n</head>\n<body>\n\n<div class=\"container\">\n\n    <div id=\"customContainer\"></div>\n\n</div>\n\n<script src=\"jquery-1.7.2.min.js\"></script>\n\n<!-- noty -->\n<script type=\"text/javascript\" src=\"../js/noty/packaged/jquery.noty.packaged.js\"></script>\n\n<script type=\"text/javascript\">\n\n    function generate(type) {\n        var n = noty({\n            text        : type,\n            type        : type,\n            dismissQueue: true,\n            closeWith: ['click'],\n            layout      : 'topCenter',\n            theme       : 'relax',\n            animation: {\n                open: null,\n                close: null\n            }\n        });\n        console.log(type + ' - ' + n.options.id);\n        return n;\n    }\n\n    $(document).ready(function () {\n\n        var alert = generate('alert');\n        var information = generate('information');\n        var error = generate('error');\n        var warning = generate('warning');\n        var notification = generate('notification');\n        var success = generate('success');\n\n\n    });\n\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/demo/notification_html.js",
    "content": "// notification body's can be any html string or just string\nvar notification_html = [];\nnotification_html[0] = '<div class=\"activity-item\"> <i class=\"fa fa-tasks text-warning\"></i> <div class=\"activity\"> There are <a href=\"#\">6 new tasks</a> waiting for you. Don\\'t forget! <span>About 3 hours ago</span> </div> </div>',\n    notification_html[1] = '<div class=\"activity-item\"> <i class=\"fa fa-check text-success\"></i> <div class=\"activity\"> Mail server was updated. See <a href=\"#\">changelog</a> <span>About 2 hours ago</span> </div> </div>',\n    notification_html[2] = '<div class=\"activity-item\"> <i class=\"fa fa-heart text-danger\"></i> <div class=\"activity\"> Your <a href=\"#\">latest post</a> was liked by <a href=\"#\">Audrey Mall</a> <span>35 minutes ago</span> </div> </div>',\n    notification_html[3] = '<div class=\"activity-item\"> <i class=\"fa fa-shopping-cart text-success\"></i> <div class=\"activity\"> <a href=\"#\">Eugene</a> ordered 2 copies of <a href=\"#\">OEM license</a> <span>14 minutes ago</span> </div> </div>';\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/demo/progressbar.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta charset=\"utf-8\">\n    <title>Using with progress bar</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"demonstration of some noty capabilities\">\n\n    <link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic&amp;subset=latin,latin-ext,cyrillic' rel='stylesheet' type='text/css'>\n    <style type=\"text/css\">\n        html {\n            height: 100%;\n            width: 100%;\n        }\n\n        body {\n            font-family: 'PT Sans', Tahoma, Arial, serif;\n            line-height: 13px\n        }\n    </style>\n\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"buttons.css\"/>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"animate.css\"/>\n    <link rel=\"stylesheet\" href=\"font-awesome/css/font-awesome.min.css\"/>\n\n</head>\n<body>\n\n    <div class=\"container\">\n        <div id=\"customContainer\"></div>\n    </div>\n\n    <script src=\"jquery-1.7.2.min.js\"></script>\n\n    <!-- noty -->\n    <script type=\"text/javascript\" src=\"../js/noty/packaged/jquery.noty.packaged.js\"></script>\n    <script type=\"text/javascript\" src=\"notification_html.js\"></script>\n\n    <script type=\"text/javascript\">\n\n        function generate(type, text) {\n\n            var n = noty({\n                text        : text,\n                type        : type,\n                dismissQueue: true,\n                progressBar : true,\n                timeout     : 5000,\n                layout      : 'topLeft',\n                closeWith   : ['click'],\n                theme       : 'relax',\n                maxVisible  : 10,\n                animation   : {\n                    open  : 'animated bounceInLeft',\n                    close : 'animated bounceOutLeft',\n                    easing: 'swing',\n                    speed : 500\n                }\n            });\n            console.log('html: ' + n.options.id);\n            return n;\n        }\n\n        function generateAll() {\n            generate('warning', notification_html[0]);\n            generate('error', notification_html[1]);\n            generate('information', notification_html[2]);\n            generate('success', notification_html[3]);\n//            generate('notification');\n//            generate('success');\n        }\n\n        $(document).ready(function () {\n\n            setTimeout(function () {\n                generateAll();\n            }, 500);\n\n        });\n\n    </script>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/demo/themeBootstrap.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta charset=\"utf-8\">\n    <title>Bootstrap Theme</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"demonstration of some noty capabilities\">\n\n    <link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic&amp;subset=latin,latin-ext,cyrillic' rel='stylesheet' type='text/css'>\n    <style type=\"text/css\">\n\n        html {\n            height: 100%;\n            width: 100%;\n        }\n\n        body {\n            font-family: 'PT Sans', Tahoma, Arial, serif;\n            line-height: 13px\n        }\n\n    </style>\n\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"buttons.css\"/>\n    <link href=\"//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css\" rel=\"stylesheet\">\n</head>\n<body>\n\n<div class=\"container\">\n\n    <div id=\"customContainer\"></div>\n\n</div>\n\n<script src=\"jquery-1.7.2.min.js\"></script>\n\n<!-- noty -->\n<script type=\"text/javascript\" src=\"../js/noty/packaged/jquery.noty.packaged.js\"></script>\n\n<script type=\"text/javascript\">\n\n    function generate(type, theme) {\n        var n = noty({\n            text        : theme + ' > ' + type,\n            type        : type,\n            dismissQueue: true,\n            layout      : 'topCenter',\n            theme       : theme,\n            closeWith   : ['button', 'click'],\n            maxVisible  : 20,\n            modal       : false\n        });\n        console.log('html: ' + n.options.id);\n    }\n\n    function generateAll() {\n        generate('alert', 'bootstrapTheme');\n        generate('information', 'bootstrapTheme');\n        generate('error', 'bootstrapTheme');\n        generate('warning', 'bootstrapTheme');\n        generate('success', 'bootstrapTheme');\n    }\n\n    $(document).ready(function () {\n        generateAll();\n    });\n\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/demo/themeCss.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta charset=\"utf-8\">\n    <title>CSS Theme</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"demonstration of some noty capabilities\">\n\n    <link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic&amp;subset=latin,latin-ext,cyrillic' rel='stylesheet' type='text/css'>\n    <style type=\"text/css\">\n\n        html {\n            height: 100%;\n            width: 100%;\n        }\n\n        body {\n            font-family: 'PT Sans', Tahoma, Arial, serif;\n            line-height: 13px\n        }\n\n    </style>\n\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"buttons.css\"/>\n\n    <style type=\"text/css\">\n\n        .someOtherTheme {\n            overflow: hidden;\n            border: 1px solid #fff;\n            box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.1);\n            position: relative;\n        }\n\n        .someOtherTheme.noty_container_type_alert {\n            background-color: #f5f5f5;\n        }\n\n        .someOtherTheme.noty_container_type_information {\n            background-color: #bbe1e8;\n        }\n\n        .someOtherTheme.noty_container_type_error {\n            background-color: #eaadad;\n            color: #fff;\n            font-weight: bold\n        }\n\n        .someOtherTheme.noty_container_type_warning {\n            background-color: #fbb450;\n            color: #fff;\n        }\n\n        .someOtherTheme.noty_container_type_success {\n            background-color: #b1ce8c;\n            color: #fff;\n        }\n\n        .someOtherTheme .noty_message {\n            padding: 10px 20px;\n        }\n\n        .someOtherTheme .noty_close {\n            position: absolute;\n            top: 4px;\n            right: 4px;\n            width: 10px;\n            height: 10px;\n            background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAATpJREFUeNoszrFqVFEUheG19zlz7sQ7ijMQBAvfYBqbpJCoZSAQbOwEE1IHGytbLQUJ8SUktW8gCCFJMSGSNxCmFBJO7j5rpXD6n5/P5vM53H3b3T9LOiB5AQDuDjM7BnA7DMPHDGBH0nuSzwHsRcRVRNRSysuU0i6AOwA/02w2+9Fae00SEbEh6SGAR5K+k3zWWptKepCm0+kpyRoRGyRBcpPkDsn1iEBr7drdP2VJZyQXERGSPpiZAViTBACXKaV9kqd5uVzCzO5KKb/d/UZSDwD/eyxqree1VqSu6zKAF2Z2RPJJaw0rAkjOJT0m+SuT/AbgDcmnkmBmfwAsJL1dXQ8lWY6IGwB1ZbrOOb8zs8thGP4COFwx/mE8Ho9Go9ErMzvJOW/1fY/JZIJSypqZfXX3L13X9fcDAKJct1sx3OiuAAAAAElFTkSuQmCC\");\n            visibility: hidden;\n            opacity: 0.5;\n            cursor: pointer;\n        }\n\n        .someOtherTheme:hover > .noty_bar > .noty_message > .noty_close {\n            visibility: visible;\n        }\n\n        .noty_modal.someOtherTheme {\n            position: fixed;\n            width: 100%;\n            height: 100%;\n            background-color: #000;\n            z-index: 10000;\n            opacity: 0.6;\n            display: none;\n            border: none;\n            left: 0;\n            top: 0\n        }\n\n    </style>\n\n</head>\n<body>\n\n<div class=\"container\">\n\n    <div id=\"customContainer\"></div>\n\n</div>\n\n<script src=\"jquery-1.7.2.min.js\"></script>\n\n<!-- noty -->\n<script type=\"text/javascript\" src=\"../js/noty/packaged/jquery.noty.packaged.js\"></script>\n\n<script type=\"text/javascript\">\n\n    function generate(type, theme) {\n        var n = noty({\n            text        : theme + ' > ' + type,\n            type        : type,\n            dismissQueue: true,\n            layout      : theme == 'defaultTheme' ? 'topCenter' : 'bottomCenter',\n            theme       : theme,\n            closeWith   : ['button', 'click'],\n            maxVisible  : 20,\n            modal       : true\n        });\n        console.log('html: ' + n.options.id);\n    }\n\n    function generateAll() {\n//        generate('alert', 'defaultTheme');\n//        generate('information', 'defaultTheme');\n//        generate('error', 'defaultTheme');\n//        generate('warning', 'defaultTheme');\n//        generate('success', 'defaultTheme');\n\n        generate('alert', 'someOtherTheme');\n        generate('information', 'someOtherTheme');\n        generate('error', 'someOtherTheme');\n        generate('warning', 'someOtherTheme');\n        generate('success', 'someOtherTheme');\n    }\n\n    $(document).ready(function () {\n        generateAll();\n    });\n\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/demo/usingMaxVisible.html",
    "content": "﻿<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta charset=\"utf-8\">\n    <title>MaxVisible Option</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"demonstration of some noty capabilities\">\n\n    <link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic&amp;subset=latin,latin-ext,cyrillic' rel='stylesheet' type='text/css'>\n    <style type=\"text/css\">\n\n        html {\n            height: 100%;\n            width: 100%;\n        }\n\n        body {\n            font-family: 'PT Sans', Tahoma, Arial, serif;\n            line-height: 13px\n        }\n\n    </style>\n\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"buttons.css\"/>\n\n</head>\n<body>\n\n<h3>maxVisible: 3</h3>\n<script src=\"jquery-1.7.2.min.js\"></script>\n\n<!-- noty -->\n<script type=\"text/javascript\" src=\"../js/noty/packaged/jquery.noty.packaged.js\"></script>\n\n<script type=\"text/javascript\">\n\n    function generate(type) {\n\n        var n = noty({\n            text        : type,\n            type        : type,\n            dismissQueue: true,\n            modal       : false,\n            maxVisible  : 3,\n            timeout     : 2000,\n            layout      : 'topCenter',\n            theme       : 'relax'\n        });\n\n        console.log('html: ' + n.options.id);\n    }\n\n    function generateAll() {\n        generate('alert');\n        generate('information 1');\n        generate('information 2');\n        generate('information 3');\n        generate('information 4');\n        generate('information 5');\n        generate('information 6');\n        generate('information 7');\n        generate('information 8');\n        generate('information 9');\n        generate('information 10');\n        generate('information 11');\n        generate('information 12');\n        generate('information 13');\n        generate('information 14');\n        generate('information 15');\n        generate('information 16');\n        generate('information 17');\n        generate('information 18');\n        generate('information 19');\n        generate('information 20');\n        generate('error');\n        generate('warning');\n        generate('notification');\n        generate('success');\n    }\n\n    $(document).ready(function () {\n\n        generateAll();\n\n    });\n\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/demo/usingWithAnimate.css.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta charset=\"utf-8\">\n    <title>Using with Animate.css</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"demonstration of some noty capabilities\">\n\n    <link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic&amp;subset=latin,latin-ext,cyrillic' rel='stylesheet' type='text/css'>\n    <style type=\"text/css\">\n\n        html {\n            height: 100%;\n            width: 100%;\n        }\n\n        body {\n            font-family: 'PT Sans', Tahoma, Arial, serif;\n            line-height: 13px\n        }\n\n    </style>\n\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"buttons.css\"/>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"animate.css\"/>\n    <link rel=\"stylesheet\" href=\"font-awesome/css/font-awesome.min.css\"/>\n\n</head>\n<body>\n\n    <div class=\"container\">\n\n        <div id=\"customContainer\"></div>\n\n    </div>\n\n    <script src=\"jquery-1.7.2.min.js\"></script>\n\n    <!-- noty -->\n    <script type=\"text/javascript\" src=\"../js/noty/packaged/jquery.noty.packaged.js\"></script>\n    <script type=\"text/javascript\" src=\"notification_html.js\"></script>\n\n    <script type=\"text/javascript\">\n\n\n        function generate(type, text) {\n\n            var n = noty({\n                text        : text,\n                type        : type,\n                dismissQueue: true,\n                layout      : 'topLeft',\n                closeWith   : ['click'],\n                theme       : 'relax',\n                maxVisible  : 10,\n                animation   : {\n                    open  : 'animated bounceInLeft',\n                    close : 'animated bounceOutLeft',\n                    easing: 'swing',\n                    speed : 500\n                }\n            });\n            console.log('html: ' + n.options.id);\n            return n;\n        }\n\n        function generateAll() {\n            generate('warning', notification_html[0]);\n            generate('error', notification_html[1]);\n            generate('information', notification_html[2]);\n            generate('success', notification_html[3]);\n//            generate('notification');\n//            generate('success');\n        }\n\n        $(document).ready(function () {\n\n            setTimeout(function() {\n                generateAll();\n            }, 500);\n\n        });\n\n    </script>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/demo/usingWithButtons.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta charset=\"utf-8\">\n    <title>Using with Buttons</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"demonstration of some noty capabilities\">\n\n    <link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic&amp;subset=latin,latin-ext,cyrillic' rel='stylesheet' type='text/css'>\n    <style type=\"text/css\">\n\n        html {\n            height: 100%;\n            width: 100%;\n        }\n\n        body {\n            font-family: 'PT Sans', Tahoma, Arial, serif;\n            line-height: 13px\n        }\n\n    </style>\n\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"buttons.css\"/>\n\n</head>\n<body>\n\n<div class=\"container\">\n\n    <div id=\"customContainer\"></div>\n\n</div>\n\n<script src=\"jquery-1.7.2.min.js\"></script>\n\n<!-- noty -->\n<script type=\"text/javascript\" src=\"../js/noty/packaged/jquery.noty.packaged.js\"></script>\n\n<script type=\"text/javascript\">\n\n    function generate(layout) {\n        var n = noty({\n            text        : 'Do you want to continue?',\n            type        : 'alert',\n            dismissQueue: true,\n            layout      : layout,\n            theme       : 'relax',\n            buttons     : [\n                {addClass: 'btn btn-primary', text: 'Ok', onClick: function ($noty) {\n                    $noty.close();\n                    noty({dismissQueue: true, force: true, layout: layout, theme: 'defaultTheme', text: 'You clicked \"Ok\" button', type: 'success'});\n                }\n                },\n                {addClass: 'btn btn-danger', text: 'Cancel', onClick: function ($noty) {\n                    $noty.close();\n                    noty({dismissQueue: true, force: true, layout: layout, theme: 'defaultTheme', text: 'You clicked \"Cancel\" button', type: 'error'});\n                }\n                }\n            ]\n        });\n        console.log('html: ' + n.options.id);\n    }\n\n    function generateAll() {\n        generate('top');\n        generate('topCenter');\n        generate('topLeft');\n        generate('topRight');\n        generate('center');\n        generate('centerLeft');\n        generate('centerRight');\n        generate('bottom');\n        generate('bottomCenter');\n        generate('bottomLeft');\n        generate('bottomRight');\n\n    }\n\n    $(document).ready(function () {\n\n        generateAll();\n\n    });\n\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/demo/usingWithButtons2.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta charset=\"utf-8\">\n    <title>Notification Types</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"demonstration of some noty capabilities\">\n\n    <link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic&amp;subset=latin,latin-ext,cyrillic' rel='stylesheet' type='text/css'>\n    <style type=\"text/css\">\n\n        html {\n            height: 100%;\n            width: 100%;\n        }\n\n        body {\n            font-family: 'PT Sans', Tahoma, Arial, serif;\n            line-height: 13px\n        }\n\n    </style>\n\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"buttons.css\"/>\n\n</head>\n<body>\n\n<div class=\"container\">\n\n    <div id=\"customContainer\"></div>\n\n</div>\n\n<script src=\"jquery-1.7.2.min.js\"></script>\n\n<!-- noty -->\n<script type=\"text/javascript\" src=\"../js/noty/packaged/jquery.noty.packaged.js\"></script>\n\n<script type=\"text/javascript\">\n\n    function generate(type, layout) {\n        var n = noty({\n            text        : type,\n            type        : type,\n            dismissQueue: true,\n            layout      : layout,\n            theme       : 'relax',\n            buttons     : [\n                {addClass: 'btn btn-primary', text: 'Ok', onClick: function ($noty) {\n                    $noty.close();\n                    noty({dismissQueue: true, force: true, layout: layout, theme: 'defaultTheme', text: 'You clicked \"Ok\" button', type: 'success'});\n                }\n                },\n                {addClass: 'btn btn-danger', text: 'Cancel', onClick: function ($noty) {\n                    $noty.close();\n                    noty({dismissQueue: true, force: true, layout: layout, theme: 'defaultTheme', text: 'You clicked \"Cancel\" button', type: 'error'});\n                }\n                }\n            ]\n        });\n        console.log('html: ' + n.options.id);\n    }\n\n    function generateAll() {\n        generate('alert', 'topCenter');\n        generate('information', 'topLeft');\n        generate('error', 'topRight');\n        generate('warning', 'center');\n        generate('notification', 'centerRight');\n        generate('success', 'centerLeft');\n    }\n\n    $(document).ready(function () {\n\n        generateAll();\n\n    });\n\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/demo/usingWithModal.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta charset=\"utf-8\">\n    <title>Notification Types</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"demonstration of some noty capabilities\">\n\n    <link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic&amp;subset=latin,latin-ext,cyrillic' rel='stylesheet' type='text/css'>\n    <style type=\"text/css\">\n\n        html {\n            height: 100%;\n            width: 100%;\n        }\n\n        body {\n            font-family: 'PT Sans', Tahoma, Arial, serif;\n            line-height: 13px\n        }\n\n    </style>\n\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"buttons.css\"/>\n\n</head>\n<body>\n\n<div class=\"container\">\n\n    <div id=\"customContainer\"></div>\n\n</div>\n\n<script src=\"jquery-1.7.2.min.js\"></script>\n\n<!-- noty -->\n<script type=\"text/javascript\" src=\"../js/noty/packaged/jquery.noty.packaged.js\"></script>\n\n<script type=\"text/javascript\">\n\n    function generate(type) {\n        var n = noty({\n            text        : type,\n            type        : type,\n            dismissQueue: true,\n            closeWith   : ['click', 'backdrop'],\n            modal       : true,\n            layout      : 'topCenter',\n            theme       : 'relax',\n            maxVisible  : 10\n        });\n        console.log('html: ' + n.options.id);\n    }\n\n    function generateAll() {\n        generate('alert');\n        generate('information');\n        generate('error');\n        generate('warning');\n        generate('notification');\n        generate('success');\n    }\n\n    $(document).ready(function () {\n\n        generateAll();\n\n    });\n\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/demo/usingWithOldOptions.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta charset=\"utf-8\">\n    <title>Using noty v2 with Old Options</title>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"demonstration of some noty capabilities\">\n\n    <link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic&amp;subset=latin,latin-ext,cyrillic' rel='stylesheet' type='text/css'>\n    <style type=\"text/css\">\n\n        html {\n            height: 100%;\n            width: 100%;\n        }\n\n        body {\n            font-family: 'PT Sans', Tahoma, Arial, serif;\n            line-height: 13px\n        }\n\n    </style>\n\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"buttons.css\"/>\n\n</head>\n<body>\n\n<div class=\"container\">\n\n    <div id=\"customContainer\">Old options not supported anymore. (until: v2.2.0)</div>\n\n</div>\n\n<script src=\"jquery-1.7.2.min.js\"></script>\n\n<!-- noty -->\n<script type=\"text/javascript\" src=\"../js/noty/packaged/jquery.noty.packaged.js\"></script>\n\n</body>\n</html>\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/js/noty/jquery.noty.js",
    "content": "/*!\n @package noty - jQuery Notification Plugin\n @version version: 2.4.1\n @contributors https://github.com/needim/noty/v2/graphs/contributors\n\n @documentation Examples and Documentation - http://needim.github.com/noty/v2/\n\n @license Licensed under the MIT licenses: http://www.opensource.org/licenses/mit-license.php\n */\n\nif (typeof Object.create !== 'function') {\n  Object.create = function (o) {\n    function F() {\n    }\n\n    F.prototype = o;\n    return new F();\n  };\n}\n\nvar NotyObject = {\n\n  init: function (options) {\n\n    // Mix in the passed in options with the default options\n    this.options = $.extend({}, $.noty.defaults, options);\n\n    this.options.layout = (this.options.custom) ? $.noty.layouts['inline'] : $.noty.layouts[this.options.layout];\n\n    if ($.noty.themes[this.options.theme]) {\n      this.options.theme = $.noty.themes[this.options.theme];\n      if (this.options.theme.template)\n        this.options.template = this.options.theme.template;\n\n      if (this.options.theme.animation)\n        this.options.animation = this.options.theme.animation;\n    }\n    else {\n      this.options.themeClassName = this.options.theme;\n    }\n\n    this.options = $.extend({}, this.options, this.options.layout.options);\n\n    if (this.options.id) {\n      if ($.noty.store[this.options.id]) {\n        return $.noty.store[this.options.id];\n      }\n    } else {\n      this.options.id = 'noty_' + (new Date().getTime() * Math.floor(Math.random() * 1000000));\n    }\n\n    // Build the noty dom initial structure\n    this._build();\n\n    // return this so we can chain/use the bridge with less code.\n    return this;\n  }, // end init\n\n  _build: function () {\n\n    // Generating noty bar\n    var $bar = $('<div class=\"noty_bar noty_type_' + this.options.type + '\"></div>').attr('id', this.options.id);\n    $bar.append(this.options.template).find('.noty_text').html(this.options.text);\n\n    this.$bar = (this.options.layout.parent.object !== null) ? $(this.options.layout.parent.object).css(this.options.layout.parent.css).append($bar) : $bar;\n\n    if (this.options.themeClassName)\n      this.$bar.addClass(this.options.themeClassName).addClass('noty_container_type_' + this.options.type);\n\n    // Set buttons if available\n    if (this.options.buttons) {\n\n      var $buttons;\n      // Try find container for buttons in presented template, and create it if not found\n      if (this.$bar.find('.noty_buttons').length > 0) {\n        $buttons = this.$bar.find('.noty_buttons');\n      } else {\n        $buttons = $('<div/>').addClass('noty_buttons');\n        (this.options.layout.parent.object !== null) ? this.$bar.find('.noty_bar').append($buttons) : this.$bar.append($buttons);\n      }\n\n      var self = this;\n\n      $.each(this.options.buttons, function (i, button) {\n        var $button = $('<button/>').addClass((button.addClass) ? button.addClass : 'gray').html(button.text).attr('id', button.id ? button.id : 'button-' + i)\n            .attr('title', button.title)\n            .appendTo($buttons)\n            .on('click', function (event) {\n              if ($.isFunction(button.onClick)) {\n                button.onClick.call($button, self, event);\n              }\n            });\n      });\n    } else {\n      // If buttons is not available, then remove containers if exist\n      this.$bar.find('.noty_buttons').remove();\n    }\n\n    if (this.options.progressBar && this.options.timeout) {\n      var $progressBar = $('<div/>').addClass('noty_progress_bar');\n      (this.options.layout.parent.object !== null) ? this.$bar.find('.noty_bar').append($progressBar) : this.$bar.append($progressBar);\n    }\n\n    // For easy access\n    this.$message     = this.$bar.find('.noty_message');\n    this.$closeButton = this.$bar.find('.noty_close');\n    this.$buttons     = this.$bar.find('.noty_buttons');\n    this.$progressBar = this.$bar.find('.noty_progress_bar');\n\n    $.noty.store[this.options.id] = this; // store noty for api\n\n  }, // end _build\n\n  show: function () {\n\n    var self = this;\n\n    (self.options.custom) ? self.options.custom.find(self.options.layout.container.selector).append(self.$bar) : $(self.options.layout.container.selector).append(self.$bar);\n\n    if (self.options.theme && self.options.theme.style)\n      self.options.theme.style.apply(self);\n\n    ($.type(self.options.layout.css) === 'function') ? this.options.layout.css.apply(self.$bar) : self.$bar.css(this.options.layout.css || {});\n\n    self.$bar.addClass(self.options.layout.addClass);\n\n    self.options.layout.container.style.apply($(self.options.layout.container.selector), [self.options.within]);\n\n    self.showing = true;\n\n    if (self.options.theme && self.options.theme.style)\n      self.options.theme.callback.onShow.apply(this);\n\n    if ($.inArray('click', self.options.closeWith) > -1)\n      self.$bar.css('cursor', 'pointer').on('click', function (evt) {\n        self.stopPropagation(evt);\n        if (self.options.callback.onCloseClick) {\n          self.options.callback.onCloseClick.apply(self);\n        }\n        self.close();\n      });\n\n    if ($.inArray('hover', self.options.closeWith) > -1)\n      self.$bar.one('mouseenter', function () {\n        self.close();\n      });\n\n    if ($.inArray('button', self.options.closeWith) > -1)\n      self.$closeButton.one('click', function (evt) {\n        self.stopPropagation(evt);\n        self.close();\n      });\n\n    if ($.inArray('button', self.options.closeWith) == -1)\n      self.$closeButton.remove();\n\n    if (self.options.callback.beforeShow)\n      self.options.callback.beforeShow.apply(self);\n\n    if (typeof self.options.animation.open == 'string') {\n      self.animationTypeOpen = 'css';\n      self.$bar.css('min-height', self.$bar.innerHeight());\n      self.$bar.on('click', function (e) {\n        self.wasClicked = true;\n      });\n      self.$bar.show();\n\n      if (self.options.callback.onShow)\n        self.options.callback.onShow.apply(self);\n\n      self.$bar.addClass(self.options.animation.open).one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function () {\n        if (self.options.callback.afterShow) self.options.callback.afterShow.apply(self);\n        self.showing = false;\n        self.shown   = true;\n        self.bindTimeout();\n        if (self.hasOwnProperty('wasClicked')) {\n          self.$bar.off('click', function (e) {\n            self.wasClicked = true;\n          });\n          self.close();\n        }\n      });\n\n    } else if (typeof self.options.animation.open == 'object' && self.options.animation.open == null) {\n      self.animationTypeOpen = 'none';\n      self.showing           = false;\n      self.shown             = true;\n      self.$bar.show();\n      self.bindTimeout();\n\n      if (self.options.callback.onShow)\n        self.options.callback.onShow.apply(self);\n\n      self.$bar.queue(function () {\n        if (self.options.callback.afterShow)\n          self.options.callback.afterShow.apply(self);\n      });\n\n    } else {\n      self.animationTypeOpen = 'anim';\n\n      if (self.options.callback.onShow)\n        self.options.callback.onShow.apply(self);\n\n      self.$bar.animate(\n          self.options.animation.open,\n          self.options.animation.speed,\n          self.options.animation.easing,\n          function () {\n            if (self.options.callback.afterShow) self.options.callback.afterShow.apply(self);\n            self.showing = false;\n            self.shown   = true;\n            self.bindTimeout();\n          });\n    }\n\n    return this;\n\n  }, // end show\n\n  bindTimeout: function () {\n    var self = this;\n\n    // If noty is have a timeout option\n    if (self.options.timeout) {\n\n      if (self.options.progressBar && self.$progressBar) {\n        self.$progressBar.css({\n          transition: 'all ' + self.options.timeout + 'ms linear',\n          width: '0%'\n        });\n      }\n\n      self.queueClose(self.options.timeout);\n      self.$bar.on('mouseenter', self.dequeueClose.bind(self));\n      self.$bar.on('mouseleave', self.queueClose.bind(self, self.options.timeout));\n    }\n\n  },\n\n  dequeueClose: function () {\n    var self = this;\n\n    if (self.options.progressBar) {\n      this.$progressBar.css({\n        transition: 'none',\n        width: '100%'\n      });\n    }\n\n    if (!this.closeTimer) return;\n    clearTimeout(this.closeTimer);\n    this.closeTimer = null;\n  },\n\n  queueClose: function (timeout) {\n    var self = this;\n\n    if (self.options.progressBar) {\n      self.$progressBar.css({\n        transition: 'all ' + self.options.timeout + 'ms linear',\n        width: '0%'\n      });\n    }\n\n    if (this.closeTimer) return;\n    self.closeTimer = window.setTimeout(function () {\n      self.close();\n    }, timeout);\n    return self.closeTimer;\n  },\n\n  close: function () {\n    if (this.$progressBar) {\n      this.$progressBar.remove();\n    }\n\n    if (this.closeTimer) this.dequeueClose();\n\n    if (this.closed) return;\n    if (this.$bar && this.$bar.hasClass('i-am-closing-now')) return;\n\n    var self = this;\n\n    if (this.showing && (this.animationTypeOpen == 'anim' || this.animationTypeOpen == 'none')) {\n      self.$bar.queue(\n          function () {\n            self.close.apply(self);\n          }\n      );\n      return;\n    } else if (this.showing && this.animationTypeOpen == 'css') {\n      self.$bar.on('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function () {\n        self.close();\n      });\n    }\n\n    if (!this.shown && !this.showing) { // If we are still waiting in the queue just delete from queue\n      var queue = [];\n      $.each($.noty.queue, function (i, n) {\n        if (n.options.id != self.options.id) {\n          queue.push(n);\n        }\n      });\n      $.noty.queue = queue;\n      return;\n    }\n\n    self.$bar.addClass('i-am-closing-now');\n\n    if (self.options.callback.onClose) {\n      self.options.callback.onClose.apply(self);\n    }\n\n    if (typeof self.options.animation.close == 'string') {\n      self.$bar.removeClass(self.options.animation.open).addClass(self.options.animation.close).one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function () {\n        if (self.options.callback.afterClose) self.options.callback.afterClose.apply(self);\n        self.closeCleanUp();\n      });\n\n    } else if (typeof self.options.animation.close == 'object' && self.options.animation.close == null) {\n      self.$bar.dequeue().hide(0, function () {\n        if (self.options.callback.afterClose) self.options.callback.afterClose.apply(self);\n        self.closeCleanUp();\n      });\n\n    } else {\n      self.$bar.clearQueue().stop().animate(\n          self.options.animation.close,\n          self.options.animation.speed,\n          self.options.animation.easing,\n          function () {\n            if (self.options.callback.afterClose) self.options.callback.afterClose.apply(self);\n          })\n          .promise().done(function () {\n        self.closeCleanUp();\n      });\n    }\n\n  }, // end close\n\n  closeCleanUp: function () {\n\n    var self = this;\n\n    // Modal Cleaning\n    if (self.options.modal) {\n      $.notyRenderer.setModalCount(-1);\n      if ($.notyRenderer.getModalCount() == 0 && !$.noty.queue.length) $('.noty_modal').fadeOut(self.options.animation.fadeSpeed, function () {\n        $(this).remove();\n      });\n    }\n\n    // Layout Cleaning\n    $.notyRenderer.setLayoutCountFor(self, -1);\n    if ($.notyRenderer.getLayoutCountFor(self) == 0) $(self.options.layout.container.selector).remove();\n\n    // Make sure self.$bar has not been removed before attempting to remove it\n    if (typeof self.$bar !== 'undefined' && self.$bar !== null) {\n\n      if (typeof self.options.animation.close == 'string') {\n        self.$bar.css('transition', 'all 10ms ease').css('border', 0).css('margin', 0).height(0);\n        self.$bar.one('transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd', function () {\n          self.$bar.remove();\n          self.$bar   = null;\n          self.closed = true;\n\n          if (self.options.theme.callback && self.options.theme.callback.onClose) {\n            self.options.theme.callback.onClose.apply(self);\n          }\n\n          self.handleNext();\n        });\n      } else {\n        self.$bar.remove();\n        self.$bar   = null;\n        self.closed = true;\n\n        self.handleNext();\n      }\n    } else {\n      self.handleNext();\n    }\n\n  }, // end close clean up\n\n  handleNext: function () {\n    var self = this;\n\n    delete $.noty.store[self.options.id]; // deleting noty from store\n\n    if (self.options.theme.callback && self.options.theme.callback.onClose) {\n      self.options.theme.callback.onClose.apply(self);\n    }\n\n    if (!self.options.dismissQueue) {\n      // Queue render\n      $.noty.ontap = true;\n\n      $.notyRenderer.render();\n    }\n\n    if (self.options.maxVisible > 0 && self.options.dismissQueue) {\n      $.notyRenderer.render();\n    }\n  },\n\n  setText: function (text) {\n    if (!this.closed) {\n      this.options.text = text;\n      this.$bar.find('.noty_text').html(text);\n    }\n    return this;\n  },\n\n  setType: function (type) {\n    if (!this.closed) {\n      this.options.type = type;\n      this.options.theme.style.apply(this);\n      this.options.theme.callback.onShow.apply(this);\n    }\n    return this;\n  },\n\n  setTimeout: function (time) {\n    if (!this.closed) {\n      var self             = this;\n      this.options.timeout = time;\n      self.$bar.delay(self.options.timeout).promise().done(function () {\n        self.close();\n      });\n    }\n    return this;\n  },\n\n  stopPropagation: function (evt) {\n    evt = evt || window.event;\n    if (typeof evt.stopPropagation !== \"undefined\") {\n      evt.stopPropagation();\n    }\n    else {\n      evt.cancelBubble = true;\n    }\n  },\n\n  closed : false,\n  showing: false,\n  shown  : false\n\n}; // end NotyObject\n\n$.notyRenderer = {};\n\n$.notyRenderer.init = function (options) {\n\n  // Renderer creates a new noty\n  var notification = Object.create(NotyObject).init(options);\n\n  if (notification.options.killer)\n    $.noty.closeAll();\n\n  (notification.options.force) ? $.noty.queue.unshift(notification) : $.noty.queue.push(notification);\n\n  $.notyRenderer.render();\n\n  return ($.noty.returns == 'object') ? notification : notification.options.id;\n};\n\n$.notyRenderer.render = function () {\n\n  var instance = $.noty.queue[0];\n\n  if ($.type(instance) === 'object') {\n    if (instance.options.dismissQueue) {\n      if (instance.options.maxVisible > 0) {\n        if ($(instance.options.layout.container.selector + ' > li').length < instance.options.maxVisible) {\n          $.notyRenderer.show($.noty.queue.shift());\n        }\n        else {\n\n        }\n      }\n      else {\n        $.notyRenderer.show($.noty.queue.shift());\n      }\n    }\n    else {\n      if ($.noty.ontap) {\n        $.notyRenderer.show($.noty.queue.shift());\n        $.noty.ontap = false;\n      }\n    }\n  }\n  else {\n    $.noty.ontap = true; // Queue is over\n  }\n\n};\n\n$.notyRenderer.show = function (notification) {\n\n  if (notification.options.modal) {\n    $.notyRenderer.createModalFor(notification);\n    $.notyRenderer.setModalCount(+1);\n  }\n\n  // Where is the container?\n  if (notification.options.custom) {\n    if (notification.options.custom.find(notification.options.layout.container.selector).length == 0) {\n      notification.options.custom.append($(notification.options.layout.container.object).addClass('i-am-new'));\n    }\n    else {\n      notification.options.custom.find(notification.options.layout.container.selector).removeClass('i-am-new');\n    }\n  }\n  else {\n    if ($(notification.options.layout.container.selector).length == 0) {\n      $('body').append($(notification.options.layout.container.object).addClass('i-am-new'));\n    }\n    else {\n      $(notification.options.layout.container.selector).removeClass('i-am-new');\n    }\n  }\n\n  $.notyRenderer.setLayoutCountFor(notification, +1);\n\n  notification.show();\n};\n\n$.notyRenderer.createModalFor = function (notification) {\n  if ($('.noty_modal').length == 0) {\n    var modal = $('<div/>').addClass('noty_modal').addClass(notification.options.theme).data('noty_modal_count', 0);\n\n    if (notification.options.theme.modal && notification.options.theme.modal.css)\n      modal.css(notification.options.theme.modal.css);\n\n    modal.prependTo($('body')).fadeIn(notification.options.animation.fadeSpeed);\n\n    if ($.inArray('backdrop', notification.options.closeWith) > -1)\n      modal.on('click', function () {\n        $.noty.closeAll();\n      });\n  }\n};\n\n$.notyRenderer.getLayoutCountFor = function (notification) {\n  return $(notification.options.layout.container.selector).data('noty_layout_count') || 0;\n};\n\n$.notyRenderer.setLayoutCountFor = function (notification, arg) {\n  return $(notification.options.layout.container.selector).data('noty_layout_count', $.notyRenderer.getLayoutCountFor(notification) + arg);\n};\n\n$.notyRenderer.getModalCount = function () {\n  return $('.noty_modal').data('noty_modal_count') || 0;\n};\n\n$.notyRenderer.setModalCount = function (arg) {\n  return $('.noty_modal').data('noty_modal_count', $.notyRenderer.getModalCount() + arg);\n};\n\n// This is for custom container\n$.fn.noty = function (options) {\n  options.custom = $(this);\n  return $.notyRenderer.init(options);\n};\n\n$.noty         = {};\n$.noty.queue   = [];\n$.noty.ontap   = true;\n$.noty.layouts = {};\n$.noty.themes  = {};\n$.noty.returns = 'object';\n$.noty.store   = {};\n\n$.noty.get = function (id) {\n  return $.noty.store.hasOwnProperty(id) ? $.noty.store[id] : false;\n};\n\n$.noty.close = function (id) {\n  return $.noty.get(id) ? $.noty.get(id).close() : false;\n};\n\n$.noty.setText = function (id, text) {\n  return $.noty.get(id) ? $.noty.get(id).setText(text) : false;\n};\n\n$.noty.setType = function (id, type) {\n  return $.noty.get(id) ? $.noty.get(id).setType(type) : false;\n};\n\n$.noty.clearQueue = function () {\n  $.noty.queue = [];\n};\n\n$.noty.closeAll = function () {\n  $.noty.clearQueue();\n  $.each($.noty.store, function (id, noty) {\n    noty.close();\n  });\n};\n\nvar windowAlert = window.alert;\n\n$.noty.consumeAlert = function (options) {\n  window.alert = function (text) {\n    if (options)\n      options.text = text;\n    else\n      options = {text: text};\n\n    $.notyRenderer.init(options);\n  };\n};\n\n$.noty.stopConsumeAlert = function () {\n  window.alert = windowAlert;\n};\n\n$.noty.defaults = {\n  layout      : 'topRight',\n  theme       : 'relax',\n  type        : 'alert',\n  text        : '',\n  progressBar : false,\n  dismissQueue: true,\n  template    : '<div class=\"noty_message\"><span class=\"noty_text\"></span><div class=\"noty_close\"></div></div>',\n  animation   : {\n    open     : {height: 'toggle'},\n    close    : {height: 'toggle'},\n    easing   : 'swing',\n    speed    : 500,\n    fadeSpeed: 'fast'\n  },\n  timeout     : false,\n  force       : false,\n  modal       : false,\n  maxVisible  : 5,\n  killer      : false,\n  closeWith   : ['click'],\n  callback    : {\n    beforeShow  : function () {\n    },\n    onShow      : function () {\n    },\n    afterShow   : function () {\n    },\n    onClose     : function () {\n    },\n    afterClose  : function () {\n    },\n    onCloseClick: function () {\n    }\n  },\n  buttons     : false\n};\n\n$(window).on('resize', function () {\n  $.each($.noty.layouts, function (index, layout) {\n    layout.container.style.apply($(layout.container.selector));\n  });\n});\n\n// Helpers\nwindow.noty = function noty(options) {\n  return $.notyRenderer.init(options);\n};\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/js/noty/layouts/bottom.js",
    "content": "$.noty.layouts.bottom = {\n    name     : 'bottom',\n    options  : {},\n    container: {\n        object  : '<ul id=\"noty_bottom_layout_container\" />',\n        selector: 'ul#noty_bottom_layout_container',\n        style   : function() {\n            $(this).css({\n                bottom       : 0,\n                left         : '5%',\n                position     : 'fixed',\n                width        : '90%',\n                height       : 'auto',\n                margin       : 0,\n                padding      : 0,\n                listStyleType: 'none',\n                zIndex       : 9999999\n            });\n        }\n    },\n    parent   : {\n        object  : '<li />',\n        selector: 'li',\n        css     : {}\n    },\n    css      : {\n        display: 'none'\n    },\n    addClass : ''\n};\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/js/noty/layouts/bottomCenter.js",
    "content": "$.noty.layouts.bottomCenter = {\n    name     : 'bottomCenter',\n    options  : { // overrides options\n\n    },\n    container: {\n        object  : '<ul id=\"noty_bottomCenter_layout_container\" />',\n        selector: 'ul#noty_bottomCenter_layout_container',\n        style   : function() {\n            $(this).css({\n                bottom       : 20,\n                left         : 0,\n                position     : 'fixed',\n                width        : '310px',\n                height       : 'auto',\n                margin       : 0,\n                padding      : 0,\n                listStyleType: 'none',\n                zIndex       : 10000000\n            });\n\n            $(this).css({\n                left: ($(window).width() - $(this).outerWidth(false)) / 2 + 'px'\n            });\n        }\n    },\n    parent   : {\n        object  : '<li />',\n        selector: 'li',\n        css     : {}\n    },\n    css      : {\n        display: 'none',\n        width  : '310px'\n    },\n    addClass : ''\n};\n\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/js/noty/layouts/bottomLeft.js",
    "content": "$.noty.layouts.bottomLeft = {\n    name     : 'bottomLeft',\n    options  : { // overrides options\n\n    },\n    container: {\n        object  : '<ul id=\"noty_bottomLeft_layout_container\" />',\n        selector: 'ul#noty_bottomLeft_layout_container',\n        style   : function() {\n            $(this).css({\n                bottom       : 20,\n                left         : 20,\n                position     : 'fixed',\n                width        : '310px',\n                height       : 'auto',\n                margin       : 0,\n                padding      : 0,\n                listStyleType: 'none',\n                zIndex       : 10000000\n            });\n\n            if(window.innerWidth < 600) {\n                $(this).css({\n                    left: 5\n                });\n            }\n        }\n    },\n    parent   : {\n        object  : '<li />',\n        selector: 'li',\n        css     : {}\n    },\n    css      : {\n        display: 'none',\n        width  : '310px'\n    },\n    addClass : ''\n};"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/js/noty/layouts/bottomRight.js",
    "content": "$.noty.layouts.bottomRight = {\n    name     : 'bottomRight',\n    options  : { // overrides options\n\n    },\n    container: {\n        object  : '<ul id=\"noty_bottomRight_layout_container\" />',\n        selector: 'ul#noty_bottomRight_layout_container',\n        style   : function() {\n            $(this).css({\n                bottom       : 20,\n                right        : 20,\n                position     : 'fixed',\n                width        : '310px',\n                height       : 'auto',\n                margin       : 0,\n                padding      : 0,\n                listStyleType: 'none',\n                zIndex       : 10000000\n            });\n\n            if(window.innerWidth < 600) {\n                $(this).css({\n                    right: 5\n                });\n            }\n        }\n    },\n    parent   : {\n        object  : '<li />',\n        selector: 'li',\n        css     : {}\n    },\n    css      : {\n        display: 'none',\n        width  : '310px'\n    },\n    addClass : ''\n};"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/js/noty/layouts/center.js",
    "content": "$.noty.layouts.center = {\n    name     : 'center',\n    options  : { // overrides options\n\n    },\n    container: {\n        object  : '<ul id=\"noty_center_layout_container\" />',\n        selector: 'ul#noty_center_layout_container',\n        style   : function() {\n            $(this).css({\n                position     : 'fixed',\n                width        : '310px',\n                height       : 'auto',\n                margin       : 0,\n                padding      : 0,\n                listStyleType: 'none',\n                zIndex       : 10000000\n            });\n\n            // getting hidden height\n            var dupe = $(this).clone().css({visibility: \"hidden\", display: \"block\", position: \"absolute\", top: 0, left: 0}).attr('id', 'dupe');\n            $(\"body\").append(dupe);\n            dupe.find('.i-am-closing-now').remove();\n            dupe.find('li').css('display', 'block');\n            var actual_height = dupe.height();\n            dupe.remove();\n\n            if($(this).hasClass('i-am-new')) {\n                $(this).css({\n                    left: ($(window).width() - $(this).outerWidth(false)) / 2 + 'px',\n                    top : ($(window).height() - actual_height) / 2 + 'px'\n                });\n            }\n            else {\n                $(this).animate({\n                    left: ($(window).width() - $(this).outerWidth(false)) / 2 + 'px',\n                    top : ($(window).height() - actual_height) / 2 + 'px'\n                }, 500);\n            }\n\n        }\n    },\n    parent   : {\n        object  : '<li />',\n        selector: 'li',\n        css     : {}\n    },\n    css      : {\n        display: 'none',\n        width  : '310px'\n    },\n    addClass : ''\n};"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/js/noty/layouts/centerLeft.js",
    "content": "$.noty.layouts.centerLeft = {\n    name     : 'centerLeft',\n    options  : { // overrides options\n\n    },\n    container: {\n        object  : '<ul id=\"noty_centerLeft_layout_container\" />',\n        selector: 'ul#noty_centerLeft_layout_container',\n        style   : function() {\n            $(this).css({\n                left         : 20,\n                position     : 'fixed',\n                width        : '310px',\n                height       : 'auto',\n                margin       : 0,\n                padding      : 0,\n                listStyleType: 'none',\n                zIndex       : 10000000\n            });\n\n            // getting hidden height\n            var dupe = $(this).clone().css({visibility: \"hidden\", display: \"block\", position: \"absolute\", top: 0, left: 0}).attr('id', 'dupe');\n            $(\"body\").append(dupe);\n            dupe.find('.i-am-closing-now').remove();\n            dupe.find('li').css('display', 'block');\n            var actual_height = dupe.height();\n            dupe.remove();\n\n            if($(this).hasClass('i-am-new')) {\n                $(this).css({\n                    top: ($(window).height() - actual_height) / 2 + 'px'\n                });\n            }\n            else {\n                $(this).animate({\n                    top: ($(window).height() - actual_height) / 2 + 'px'\n                }, 500);\n            }\n\n            if(window.innerWidth < 600) {\n                $(this).css({\n                    left: 5\n                });\n            }\n\n        }\n    },\n    parent   : {\n        object  : '<li />',\n        selector: 'li',\n        css     : {}\n    },\n    css      : {\n        display: 'none',\n        width  : '310px'\n    },\n    addClass : ''\n};\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/js/noty/layouts/centerRight.js",
    "content": "$.noty.layouts.centerRight = {\n    name     : 'centerRight',\n    options  : { // overrides options\n\n    },\n    container: {\n        object  : '<ul id=\"noty_centerRight_layout_container\" />',\n        selector: 'ul#noty_centerRight_layout_container',\n        style   : function() {\n            $(this).css({\n                right        : 20,\n                position     : 'fixed',\n                width        : '310px',\n                height       : 'auto',\n                margin       : 0,\n                padding      : 0,\n                listStyleType: 'none',\n                zIndex       : 10000000\n            });\n\n            // getting hidden height\n            var dupe = $(this).clone().css({visibility: \"hidden\", display: \"block\", position: \"absolute\", top: 0, left: 0}).attr('id', 'dupe');\n            $(\"body\").append(dupe);\n            dupe.find('.i-am-closing-now').remove();\n            dupe.find('li').css('display', 'block');\n            var actual_height = dupe.height();\n            dupe.remove();\n\n            if($(this).hasClass('i-am-new')) {\n                $(this).css({\n                    top: ($(window).height() - actual_height) / 2 + 'px'\n                });\n            }\n            else {\n                $(this).animate({\n                    top: ($(window).height() - actual_height) / 2 + 'px'\n                }, 500);\n            }\n\n            if(window.innerWidth < 600) {\n                $(this).css({\n                    right: 5\n                });\n            }\n\n        }\n    },\n    parent   : {\n        object  : '<li />',\n        selector: 'li',\n        css     : {}\n    },\n    css      : {\n        display: 'none',\n        width  : '310px'\n    },\n    addClass : ''\n};"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/js/noty/layouts/inline.js",
    "content": "$.noty.layouts.inline = {\n    name     : 'inline',\n    options  : {},\n    container: {\n        object  : '<ul class=\"noty_inline_layout_container\" />',\n        selector: 'ul.noty_inline_layout_container',\n        style   : function() {\n            $(this).css({\n                width        : '100%',\n                height       : 'auto',\n                margin       : 0,\n                padding      : 0,\n                listStyleType: 'none',\n                zIndex       : 9999999\n            });\n        }\n    },\n    parent   : {\n        object  : '<li />',\n        selector: 'li',\n        css     : {}\n    },\n    css      : {\n        display: 'none'\n    },\n    addClass : ''\n};"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/js/noty/layouts/top.js",
    "content": "$.noty.layouts.top = {\n    name     : 'top',\n    options  : {},\n    container: {\n        object  : '<ul id=\"noty_top_layout_container\" />',\n        selector: 'ul#noty_top_layout_container',\n        style   : function() {\n            $(this).css({\n                top          : 0,\n                left         : '5%',\n                position     : 'fixed',\n                width        : '90%',\n                height       : 'auto',\n                margin       : 0,\n                padding      : 0,\n                listStyleType: 'none',\n                zIndex       : 9999999\n            });\n        }\n    },\n    parent   : {\n        object  : '<li />',\n        selector: 'li',\n        css     : {}\n    },\n    css      : {\n        display: 'none'\n    },\n    addClass : ''\n};"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/js/noty/layouts/topCenter.js",
    "content": "$.noty.layouts.topCenter = {\n    name     : 'topCenter',\n    options  : { // overrides options\n\n    },\n    container: {\n        object  : '<ul id=\"noty_topCenter_layout_container\" />',\n        selector: 'ul#noty_topCenter_layout_container',\n        style   : function() {\n            $(this).css({\n                top          : 20,\n                left         : 0,\n                position     : 'fixed',\n                width        : '310px',\n                height       : 'auto',\n                margin       : 0,\n                padding      : 0,\n                listStyleType: 'none',\n                zIndex       : 10000000\n            });\n\n            $(this).css({\n                left: ($(window).width() - $(this).outerWidth(false)) / 2 + 'px'\n            });\n        }\n    },\n    parent   : {\n        object  : '<li />',\n        selector: 'li',\n        css     : {}\n    },\n    css      : {\n        display: 'none',\n        width  : '310px'\n    },\n    addClass : ''\n};\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/js/noty/layouts/topLeft.js",
    "content": "$.noty.layouts.topLeft = {\n    name     : 'topLeft',\n    options  : { // overrides options\n\n    },\n    container: {\n        object  : '<ul id=\"noty_topLeft_layout_container\" />',\n        selector: 'ul#noty_topLeft_layout_container',\n        style   : function() {\n            $(this).css({\n                top          : 20,\n                left         : 20,\n                position     : 'fixed',\n                width        : '310px',\n                height       : 'auto',\n                margin       : 0,\n                padding      : 0,\n                listStyleType: 'none',\n                zIndex       : 10000000\n            });\n\n            if(window.innerWidth < 600) {\n                $(this).css({\n                    left: 5\n                });\n            }\n        }\n    },\n    parent   : {\n        object  : '<li />',\n        selector: 'li',\n        css     : {}\n    },\n    css      : {\n        display: 'none',\n        width  : '310px'\n    },\n    addClass : ''\n};"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/js/noty/layouts/topRight.js",
    "content": "$.noty.layouts.topRight = {\n    name     : 'topRight',\n    options  : { // overrides options\n\n    },\n    container: {\n        object  : '<ul id=\"noty_topRight_layout_container\" />',\n        selector: 'ul#noty_topRight_layout_container',\n        style   : function() {\n            $(this).css({\n                top          : 20,\n                right        : 20,\n                position     : 'fixed',\n                width        : '310px',\n                height       : 'auto',\n                margin       : 0,\n                padding      : 0,\n                listStyleType: 'none',\n                zIndex       : 10000000\n            });\n\n            if(window.innerWidth < 600) {\n                $(this).css({\n                    right: 5\n                });\n            }\n        }\n    },\n    parent   : {\n        object  : '<li />',\n        selector: 'li',\n        css     : {}\n    },\n    css      : {\n        display: 'none',\n        width  : '310px'\n    },\n    addClass : ''\n};"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/js/noty/packaged/jquery.noty.packaged.js",
    "content": "!function(root, factory) {\n\t if (typeof define === 'function' && define.amd) {\n\t\t define(['jquery'], factory);\n\t } else if (typeof exports === 'object') {\n\t\t module.exports = factory(require('jquery'));\n\t } else {\n\t\t factory(root.jQuery);\n\t }\n}(this, function($) {\n\n/*!\n @package noty - jQuery Notification Plugin\n @version version: 2.4.1\n @contributors https://github.com/needim/noty/v2/graphs/contributors\n\n @documentation Examples and Documentation - http://needim.github.com/noty/v2/\n\n @license Licensed under the MIT licenses: http://www.opensource.org/licenses/mit-license.php\n */\n\nif (typeof Object.create !== 'function') {\n  Object.create = function (o) {\n    function F() {\n    }\n\n    F.prototype = o;\n    return new F();\n  };\n}\n\nvar NotyObject = {\n\n  init: function (options) {\n\n    // Mix in the passed in options with the default options\n    this.options = $.extend({}, $.noty.defaults, options);\n\n    this.options.layout = (this.options.custom) ? $.noty.layouts['inline'] : $.noty.layouts[this.options.layout];\n\n    if ($.noty.themes[this.options.theme]) {\n      this.options.theme = $.noty.themes[this.options.theme];\n      if (this.options.theme.template)\n        this.options.template = this.options.theme.template;\n\n      if (this.options.theme.animation)\n        this.options.animation = this.options.theme.animation;\n    }\n    else {\n      this.options.themeClassName = this.options.theme;\n    }\n\n    this.options = $.extend({}, this.options, this.options.layout.options);\n\n    if (this.options.id) {\n      if ($.noty.store[this.options.id]) {\n        return $.noty.store[this.options.id];\n      }\n    } else {\n      this.options.id = 'noty_' + (new Date().getTime() * Math.floor(Math.random() * 1000000));\n    }\n\n    // Build the noty dom initial structure\n    this._build();\n\n    // return this so we can chain/use the bridge with less code.\n    return this;\n  }, // end init\n\n  _build: function () {\n\n    // Generating noty bar\n    var $bar = $('<div class=\"noty_bar noty_type_' + this.options.type + '\"></div>').attr('id', this.options.id);\n    $bar.append(this.options.template).find('.noty_text').html(this.options.text);\n\n    this.$bar = (this.options.layout.parent.object !== null) ? $(this.options.layout.parent.object).css(this.options.layout.parent.css).append($bar) : $bar;\n\n    if (this.options.themeClassName)\n      this.$bar.addClass(this.options.themeClassName).addClass('noty_container_type_' + this.options.type);\n\n    // Set buttons if available\n    if (this.options.buttons) {\n\n      var $buttons;\n      // Try find container for buttons in presented template, and create it if not found\n      if (this.$bar.find('.noty_buttons').length > 0) {\n        $buttons = this.$bar.find('.noty_buttons');\n      } else {\n        $buttons = $('<div/>').addClass('noty_buttons');\n        (this.options.layout.parent.object !== null) ? this.$bar.find('.noty_bar').append($buttons) : this.$bar.append($buttons);\n      }\n\n      var self = this;\n\n      $.each(this.options.buttons, function (i, button) {\n        var $button = $('<button/>').addClass((button.addClass) ? button.addClass : 'gray').html(button.text).attr('id', button.id ? button.id : 'button-' + i)\n            .attr('title', button.title)\n            .appendTo($buttons)\n            .on('click', function (event) {\n              if ($.isFunction(button.onClick)) {\n                button.onClick.call($button, self, event);\n              }\n            });\n      });\n    } else {\n      // If buttons is not available, then remove containers if exist\n      this.$bar.find('.noty_buttons').remove();\n    }\n\n    if (this.options.progressBar && this.options.timeout) {\n      var $progressBar = $('<div/>').addClass('noty_progress_bar');\n      (this.options.layout.parent.object !== null) ? this.$bar.find('.noty_bar').append($progressBar) : this.$bar.append($progressBar);\n    }\n\n    // For easy access\n    this.$message     = this.$bar.find('.noty_message');\n    this.$closeButton = this.$bar.find('.noty_close');\n    this.$buttons     = this.$bar.find('.noty_buttons');\n    this.$progressBar = this.$bar.find('.noty_progress_bar');\n\n    $.noty.store[this.options.id] = this; // store noty for api\n\n  }, // end _build\n\n  show: function () {\n\n    var self = this;\n\n    (self.options.custom) ? self.options.custom.find(self.options.layout.container.selector).append(self.$bar) : $(self.options.layout.container.selector).append(self.$bar);\n\n    if (self.options.theme && self.options.theme.style)\n      self.options.theme.style.apply(self);\n\n    ($.type(self.options.layout.css) === 'function') ? this.options.layout.css.apply(self.$bar) : self.$bar.css(this.options.layout.css || {});\n\n    self.$bar.addClass(self.options.layout.addClass);\n\n    self.options.layout.container.style.apply($(self.options.layout.container.selector), [self.options.within]);\n\n    self.showing = true;\n\n    if (self.options.theme && self.options.theme.style)\n      self.options.theme.callback.onShow.apply(this);\n\n    if ($.inArray('click', self.options.closeWith) > -1)\n      self.$bar.css('cursor', 'pointer').on('click', function (evt) {\n        self.stopPropagation(evt);\n        if (self.options.callback.onCloseClick) {\n          self.options.callback.onCloseClick.apply(self);\n        }\n        self.close();\n      });\n\n    if ($.inArray('hover', self.options.closeWith) > -1)\n      self.$bar.one('mouseenter', function () {\n        self.close();\n      });\n\n    if ($.inArray('button', self.options.closeWith) > -1)\n      self.$closeButton.one('click', function (evt) {\n        self.stopPropagation(evt);\n        self.close();\n      });\n\n    if ($.inArray('button', self.options.closeWith) == -1)\n      self.$closeButton.remove();\n\n    if (self.options.callback.beforeShow)\n      self.options.callback.beforeShow.apply(self);\n\n    if (typeof self.options.animation.open == 'string') {\n      self.animationTypeOpen = 'css';\n      self.$bar.css('min-height', self.$bar.innerHeight());\n      self.$bar.on('click', function (e) {\n        self.wasClicked = true;\n      });\n      self.$bar.show();\n\n      if (self.options.callback.onShow)\n        self.options.callback.onShow.apply(self);\n\n      self.$bar.addClass(self.options.animation.open).one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function () {\n        if (self.options.callback.afterShow) self.options.callback.afterShow.apply(self);\n        self.showing = false;\n        self.shown   = true;\n        self.bindTimeout();\n        if (self.hasOwnProperty('wasClicked')) {\n          self.$bar.off('click', function (e) {\n            self.wasClicked = true;\n          });\n          self.close();\n        }\n      });\n\n    } else if (typeof self.options.animation.open == 'object' && self.options.animation.open == null) {\n      self.animationTypeOpen = 'none';\n      self.showing           = false;\n      self.shown             = true;\n      self.$bar.show();\n      self.bindTimeout();\n\n      if (self.options.callback.onShow)\n        self.options.callback.onShow.apply(self);\n\n      self.$bar.queue(function () {\n        if (self.options.callback.afterShow)\n          self.options.callback.afterShow.apply(self);\n      });\n\n    } else {\n      self.animationTypeOpen = 'anim';\n\n      if (self.options.callback.onShow)\n        self.options.callback.onShow.apply(self);\n\n      self.$bar.animate(\n          self.options.animation.open,\n          self.options.animation.speed,\n          self.options.animation.easing,\n          function () {\n            if (self.options.callback.afterShow) self.options.callback.afterShow.apply(self);\n            self.showing = false;\n            self.shown   = true;\n            self.bindTimeout();\n          });\n    }\n\n    return this;\n\n  }, // end show\n\n  bindTimeout: function () {\n    var self = this;\n\n    // If noty is have a timeout option\n    if (self.options.timeout) {\n\n      if (self.options.progressBar && self.$progressBar) {\n        self.$progressBar.css({\n          transition: 'all ' + self.options.timeout + 'ms linear',\n          width: '0%'\n        });\n      }\n\n      self.queueClose(self.options.timeout);\n      self.$bar.on('mouseenter', self.dequeueClose.bind(self));\n      self.$bar.on('mouseleave', self.queueClose.bind(self, self.options.timeout));\n    }\n\n  },\n\n  dequeueClose: function () {\n    var self = this;\n\n    if (self.options.progressBar) {\n      this.$progressBar.css({\n        transition: 'none',\n        width: '100%'\n      });\n    }\n\n    if (!this.closeTimer) return;\n    clearTimeout(this.closeTimer);\n    this.closeTimer = null;\n  },\n\n  queueClose: function (timeout) {\n    var self = this;\n\n    if (self.options.progressBar) {\n      self.$progressBar.css({\n        transition: 'all ' + self.options.timeout + 'ms linear',\n        width: '0%'\n      });\n    }\n\n    if (this.closeTimer) return;\n    self.closeTimer = window.setTimeout(function () {\n      self.close();\n    }, timeout);\n    return self.closeTimer;\n  },\n\n  close: function () {\n    if (this.$progressBar) {\n      this.$progressBar.remove();\n    }\n\n    if (this.closeTimer) this.dequeueClose();\n\n    if (this.closed) return;\n    if (this.$bar && this.$bar.hasClass('i-am-closing-now')) return;\n\n    var self = this;\n\n    if (this.showing && (this.animationTypeOpen == 'anim' || this.animationTypeOpen == 'none')) {\n      self.$bar.queue(\n          function () {\n            self.close.apply(self);\n          }\n      );\n      return;\n    } else if (this.showing && this.animationTypeOpen == 'css') {\n      self.$bar.on('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function () {\n        self.close();\n      });\n    }\n\n    if (!this.shown && !this.showing) { // If we are still waiting in the queue just delete from queue\n      var queue = [];\n      $.each($.noty.queue, function (i, n) {\n        if (n.options.id != self.options.id) {\n          queue.push(n);\n        }\n      });\n      $.noty.queue = queue;\n      return;\n    }\n\n    self.$bar.addClass('i-am-closing-now');\n\n    if (self.options.callback.onClose) {\n      self.options.callback.onClose.apply(self);\n    }\n\n    if (typeof self.options.animation.close == 'string') {\n      self.$bar.removeClass(self.options.animation.open).addClass(self.options.animation.close).one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function () {\n        if (self.options.callback.afterClose) self.options.callback.afterClose.apply(self);\n        self.closeCleanUp();\n      });\n\n    } else if (typeof self.options.animation.close == 'object' && self.options.animation.close == null) {\n      self.$bar.dequeue().hide(0, function () {\n        if (self.options.callback.afterClose) self.options.callback.afterClose.apply(self);\n        self.closeCleanUp();\n      });\n\n    } else {\n      self.$bar.clearQueue().stop().animate(\n          self.options.animation.close,\n          self.options.animation.speed,\n          self.options.animation.easing,\n          function () {\n            if (self.options.callback.afterClose) self.options.callback.afterClose.apply(self);\n          })\n          .promise().done(function () {\n        self.closeCleanUp();\n      });\n    }\n\n  }, // end close\n\n  closeCleanUp: function () {\n\n    var self = this;\n\n    // Modal Cleaning\n    if (self.options.modal) {\n      $.notyRenderer.setModalCount(-1);\n      if ($.notyRenderer.getModalCount() == 0 && !$.noty.queue.length) $('.noty_modal').fadeOut(self.options.animation.fadeSpeed, function () {\n        $(this).remove();\n      });\n    }\n\n    // Layout Cleaning\n    $.notyRenderer.setLayoutCountFor(self, -1);\n    if ($.notyRenderer.getLayoutCountFor(self) == 0) $(self.options.layout.container.selector).remove();\n\n    // Make sure self.$bar has not been removed before attempting to remove it\n    if (typeof self.$bar !== 'undefined' && self.$bar !== null) {\n\n      if (typeof self.options.animation.close == 'string') {\n        self.$bar.css('transition', 'all 10ms ease').css('border', 0).css('margin', 0).height(0);\n        self.$bar.one('transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd', function () {\n          self.$bar.remove();\n          self.$bar   = null;\n          self.closed = true;\n\n          if (self.options.theme.callback && self.options.theme.callback.onClose) {\n            self.options.theme.callback.onClose.apply(self);\n          }\n\n          self.handleNext();\n        });\n      } else {\n        self.$bar.remove();\n        self.$bar   = null;\n        self.closed = true;\n\n        self.handleNext();\n      }\n    } else {\n      self.handleNext();\n    }\n\n  }, // end close clean up\n\n  handleNext: function () {\n    var self = this;\n\n    delete $.noty.store[self.options.id]; // deleting noty from store\n\n    if (self.options.theme.callback && self.options.theme.callback.onClose) {\n      self.options.theme.callback.onClose.apply(self);\n    }\n\n    if (!self.options.dismissQueue) {\n      // Queue render\n      $.noty.ontap = true;\n\n      $.notyRenderer.render();\n    }\n\n    if (self.options.maxVisible > 0 && self.options.dismissQueue) {\n      $.notyRenderer.render();\n    }\n  },\n\n  setText: function (text) {\n    if (!this.closed) {\n      this.options.text = text;\n      this.$bar.find('.noty_text').html(text);\n    }\n    return this;\n  },\n\n  setType: function (type) {\n    if (!this.closed) {\n      this.options.type = type;\n      this.options.theme.style.apply(this);\n      this.options.theme.callback.onShow.apply(this);\n    }\n    return this;\n  },\n\n  setTimeout: function (time) {\n    if (!this.closed) {\n      var self             = this;\n      this.options.timeout = time;\n      self.$bar.delay(self.options.timeout).promise().done(function () {\n        self.close();\n      });\n    }\n    return this;\n  },\n\n  stopPropagation: function (evt) {\n    evt = evt || window.event;\n    if (typeof evt.stopPropagation !== \"undefined\") {\n      evt.stopPropagation();\n    }\n    else {\n      evt.cancelBubble = true;\n    }\n  },\n\n  closed : false,\n  showing: false,\n  shown  : false\n\n}; // end NotyObject\n\n$.notyRenderer = {};\n\n$.notyRenderer.init = function (options) {\n\n  // Renderer creates a new noty\n  var notification = Object.create(NotyObject).init(options);\n\n  if (notification.options.killer)\n    $.noty.closeAll();\n\n  (notification.options.force) ? $.noty.queue.unshift(notification) : $.noty.queue.push(notification);\n\n  $.notyRenderer.render();\n\n  return ($.noty.returns == 'object') ? notification : notification.options.id;\n};\n\n$.notyRenderer.render = function () {\n\n  var instance = $.noty.queue[0];\n\n  if ($.type(instance) === 'object') {\n    if (instance.options.dismissQueue) {\n      if (instance.options.maxVisible > 0) {\n        if ($(instance.options.layout.container.selector + ' > li').length < instance.options.maxVisible) {\n          $.notyRenderer.show($.noty.queue.shift());\n        }\n        else {\n\n        }\n      }\n      else {\n        $.notyRenderer.show($.noty.queue.shift());\n      }\n    }\n    else {\n      if ($.noty.ontap) {\n        $.notyRenderer.show($.noty.queue.shift());\n        $.noty.ontap = false;\n      }\n    }\n  }\n  else {\n    $.noty.ontap = true; // Queue is over\n  }\n\n};\n\n$.notyRenderer.show = function (notification) {\n\n  if (notification.options.modal) {\n    $.notyRenderer.createModalFor(notification);\n    $.notyRenderer.setModalCount(+1);\n  }\n\n  // Where is the container?\n  if (notification.options.custom) {\n    if (notification.options.custom.find(notification.options.layout.container.selector).length == 0) {\n      notification.options.custom.append($(notification.options.layout.container.object).addClass('i-am-new'));\n    }\n    else {\n      notification.options.custom.find(notification.options.layout.container.selector).removeClass('i-am-new');\n    }\n  }\n  else {\n    if ($(notification.options.layout.container.selector).length == 0) {\n      $('body').append($(notification.options.layout.container.object).addClass('i-am-new'));\n    }\n    else {\n      $(notification.options.layout.container.selector).removeClass('i-am-new');\n    }\n  }\n\n  $.notyRenderer.setLayoutCountFor(notification, +1);\n\n  notification.show();\n};\n\n$.notyRenderer.createModalFor = function (notification) {\n  if ($('.noty_modal').length == 0) {\n    var modal = $('<div/>').addClass('noty_modal').addClass(notification.options.theme).data('noty_modal_count', 0);\n\n    if (notification.options.theme.modal && notification.options.theme.modal.css)\n      modal.css(notification.options.theme.modal.css);\n\n    modal.prependTo($('body')).fadeIn(notification.options.animation.fadeSpeed);\n\n    if ($.inArray('backdrop', notification.options.closeWith) > -1)\n      modal.on('click', function () {\n        $.noty.closeAll();\n      });\n  }\n};\n\n$.notyRenderer.getLayoutCountFor = function (notification) {\n  return $(notification.options.layout.container.selector).data('noty_layout_count') || 0;\n};\n\n$.notyRenderer.setLayoutCountFor = function (notification, arg) {\n  return $(notification.options.layout.container.selector).data('noty_layout_count', $.notyRenderer.getLayoutCountFor(notification) + arg);\n};\n\n$.notyRenderer.getModalCount = function () {\n  return $('.noty_modal').data('noty_modal_count') || 0;\n};\n\n$.notyRenderer.setModalCount = function (arg) {\n  return $('.noty_modal').data('noty_modal_count', $.notyRenderer.getModalCount() + arg);\n};\n\n// This is for custom container\n$.fn.noty = function (options) {\n  options.custom = $(this);\n  return $.notyRenderer.init(options);\n};\n\n$.noty         = {};\n$.noty.queue   = [];\n$.noty.ontap   = true;\n$.noty.layouts = {};\n$.noty.themes  = {};\n$.noty.returns = 'object';\n$.noty.store   = {};\n\n$.noty.get = function (id) {\n  return $.noty.store.hasOwnProperty(id) ? $.noty.store[id] : false;\n};\n\n$.noty.close = function (id) {\n  return $.noty.get(id) ? $.noty.get(id).close() : false;\n};\n\n$.noty.setText = function (id, text) {\n  return $.noty.get(id) ? $.noty.get(id).setText(text) : false;\n};\n\n$.noty.setType = function (id, type) {\n  return $.noty.get(id) ? $.noty.get(id).setType(type) : false;\n};\n\n$.noty.clearQueue = function () {\n  $.noty.queue = [];\n};\n\n$.noty.closeAll = function () {\n  $.noty.clearQueue();\n  $.each($.noty.store, function (id, noty) {\n    noty.close();\n  });\n};\n\nvar windowAlert = window.alert;\n\n$.noty.consumeAlert = function (options) {\n  window.alert = function (text) {\n    if (options)\n      options.text = text;\n    else\n      options = {text: text};\n\n    $.notyRenderer.init(options);\n  };\n};\n\n$.noty.stopConsumeAlert = function () {\n  window.alert = windowAlert;\n};\n\n$.noty.defaults = {\n  layout      : 'topRight',\n  theme       : 'relax',\n  type        : 'alert',\n  text        : '',\n  progressBar : false,\n  dismissQueue: true,\n  template    : '<div class=\"noty_message\"><span class=\"noty_text\"></span><div class=\"noty_close\"></div></div>',\n  animation   : {\n    open     : {height: 'toggle'},\n    close    : {height: 'toggle'},\n    easing   : 'swing',\n    speed    : 500,\n    fadeSpeed: 'fast'\n  },\n  timeout     : false,\n  force       : false,\n  modal       : false,\n  maxVisible  : 5,\n  killer      : false,\n  closeWith   : ['click'],\n  callback    : {\n    beforeShow  : function () {\n    },\n    onShow      : function () {\n    },\n    afterShow   : function () {\n    },\n    onClose     : function () {\n    },\n    afterClose  : function () {\n    },\n    onCloseClick: function () {\n    }\n  },\n  buttons     : false\n};\n\n$(window).on('resize', function () {\n  $.each($.noty.layouts, function (index, layout) {\n    layout.container.style.apply($(layout.container.selector));\n  });\n});\n\n// Helpers\nwindow.noty = function noty(options) {\n  return $.notyRenderer.init(options);\n};\n\n$.noty.layouts.bottom = {\n    name     : 'bottom',\n    options  : {},\n    container: {\n        object  : '<ul id=\"noty_bottom_layout_container\" />',\n        selector: 'ul#noty_bottom_layout_container',\n        style   : function() {\n            $(this).css({\n                bottom       : 0,\n                left         : '5%',\n                position     : 'fixed',\n                width        : '90%',\n                height       : 'auto',\n                margin       : 0,\n                padding      : 0,\n                listStyleType: 'none',\n                zIndex       : 9999999\n            });\n        }\n    },\n    parent   : {\n        object  : '<li />',\n        selector: 'li',\n        css     : {}\n    },\n    css      : {\n        display: 'none'\n    },\n    addClass : ''\n};\n\n$.noty.layouts.bottomCenter = {\n    name     : 'bottomCenter',\n    options  : { // overrides options\n\n    },\n    container: {\n        object  : '<ul id=\"noty_bottomCenter_layout_container\" />',\n        selector: 'ul#noty_bottomCenter_layout_container',\n        style   : function() {\n            $(this).css({\n                bottom       : 20,\n                left         : 0,\n                position     : 'fixed',\n                width        : '310px',\n                height       : 'auto',\n                margin       : 0,\n                padding      : 0,\n                listStyleType: 'none',\n                zIndex       : 10000000\n            });\n\n            $(this).css({\n                left: ($(window).width() - $(this).outerWidth(false)) / 2 + 'px'\n            });\n        }\n    },\n    parent   : {\n        object  : '<li />',\n        selector: 'li',\n        css     : {}\n    },\n    css      : {\n        display: 'none',\n        width  : '310px'\n    },\n    addClass : ''\n};\n\n\n$.noty.layouts.bottomLeft = {\n    name     : 'bottomLeft',\n    options  : { // overrides options\n\n    },\n    container: {\n        object  : '<ul id=\"noty_bottomLeft_layout_container\" />',\n        selector: 'ul#noty_bottomLeft_layout_container',\n        style   : function() {\n            $(this).css({\n                bottom       : 20,\n                left         : 20,\n                position     : 'fixed',\n                width        : '310px',\n                height       : 'auto',\n                margin       : 0,\n                padding      : 0,\n                listStyleType: 'none',\n                zIndex       : 10000000\n            });\n\n            if(window.innerWidth < 600) {\n                $(this).css({\n                    left: 5\n                });\n            }\n        }\n    },\n    parent   : {\n        object  : '<li />',\n        selector: 'li',\n        css     : {}\n    },\n    css      : {\n        display: 'none',\n        width  : '310px'\n    },\n    addClass : ''\n};\n$.noty.layouts.bottomRight = {\n    name     : 'bottomRight',\n    options  : { // overrides options\n\n    },\n    container: {\n        object  : '<ul id=\"noty_bottomRight_layout_container\" />',\n        selector: 'ul#noty_bottomRight_layout_container',\n        style   : function() {\n            $(this).css({\n                bottom       : 20,\n                right        : 20,\n                position     : 'fixed',\n                width        : '310px',\n                height       : 'auto',\n                margin       : 0,\n                padding      : 0,\n                listStyleType: 'none',\n                zIndex       : 10000000\n            });\n\n            if(window.innerWidth < 600) {\n                $(this).css({\n                    right: 5\n                });\n            }\n        }\n    },\n    parent   : {\n        object  : '<li />',\n        selector: 'li',\n        css     : {}\n    },\n    css      : {\n        display: 'none',\n        width  : '310px'\n    },\n    addClass : ''\n};\n$.noty.layouts.center = {\n    name     : 'center',\n    options  : { // overrides options\n\n    },\n    container: {\n        object  : '<ul id=\"noty_center_layout_container\" />',\n        selector: 'ul#noty_center_layout_container',\n        style   : function() {\n            $(this).css({\n                position     : 'fixed',\n                width        : '310px',\n                height       : 'auto',\n                margin       : 0,\n                padding      : 0,\n                listStyleType: 'none',\n                zIndex       : 10000000\n            });\n\n            // getting hidden height\n            var dupe = $(this).clone().css({visibility: \"hidden\", display: \"block\", position: \"absolute\", top: 0, left: 0}).attr('id', 'dupe');\n            $(\"body\").append(dupe);\n            dupe.find('.i-am-closing-now').remove();\n            dupe.find('li').css('display', 'block');\n            var actual_height = dupe.height();\n            dupe.remove();\n\n            if($(this).hasClass('i-am-new')) {\n                $(this).css({\n                    left: ($(window).width() - $(this).outerWidth(false)) / 2 + 'px',\n                    top : ($(window).height() - actual_height) / 2 + 'px'\n                });\n            }\n            else {\n                $(this).animate({\n                    left: ($(window).width() - $(this).outerWidth(false)) / 2 + 'px',\n                    top : ($(window).height() - actual_height) / 2 + 'px'\n                }, 500);\n            }\n\n        }\n    },\n    parent   : {\n        object  : '<li />',\n        selector: 'li',\n        css     : {}\n    },\n    css      : {\n        display: 'none',\n        width  : '310px'\n    },\n    addClass : ''\n};\n$.noty.layouts.centerLeft = {\n    name     : 'centerLeft',\n    options  : { // overrides options\n\n    },\n    container: {\n        object  : '<ul id=\"noty_centerLeft_layout_container\" />',\n        selector: 'ul#noty_centerLeft_layout_container',\n        style   : function() {\n            $(this).css({\n                left         : 20,\n                position     : 'fixed',\n                width        : '310px',\n                height       : 'auto',\n                margin       : 0,\n                padding      : 0,\n                listStyleType: 'none',\n                zIndex       : 10000000\n            });\n\n            // getting hidden height\n            var dupe = $(this).clone().css({visibility: \"hidden\", display: \"block\", position: \"absolute\", top: 0, left: 0}).attr('id', 'dupe');\n            $(\"body\").append(dupe);\n            dupe.find('.i-am-closing-now').remove();\n            dupe.find('li').css('display', 'block');\n            var actual_height = dupe.height();\n            dupe.remove();\n\n            if($(this).hasClass('i-am-new')) {\n                $(this).css({\n                    top: ($(window).height() - actual_height) / 2 + 'px'\n                });\n            }\n            else {\n                $(this).animate({\n                    top: ($(window).height() - actual_height) / 2 + 'px'\n                }, 500);\n            }\n\n            if(window.innerWidth < 600) {\n                $(this).css({\n                    left: 5\n                });\n            }\n\n        }\n    },\n    parent   : {\n        object  : '<li />',\n        selector: 'li',\n        css     : {}\n    },\n    css      : {\n        display: 'none',\n        width  : '310px'\n    },\n    addClass : ''\n};\n\n$.noty.layouts.centerRight = {\n    name     : 'centerRight',\n    options  : { // overrides options\n\n    },\n    container: {\n        object  : '<ul id=\"noty_centerRight_layout_container\" />',\n        selector: 'ul#noty_centerRight_layout_container',\n        style   : function() {\n            $(this).css({\n                right        : 20,\n                position     : 'fixed',\n                width        : '310px',\n                height       : 'auto',\n                margin       : 0,\n                padding      : 0,\n                listStyleType: 'none',\n                zIndex       : 10000000\n            });\n\n            // getting hidden height\n            var dupe = $(this).clone().css({visibility: \"hidden\", display: \"block\", position: \"absolute\", top: 0, left: 0}).attr('id', 'dupe');\n            $(\"body\").append(dupe);\n            dupe.find('.i-am-closing-now').remove();\n            dupe.find('li').css('display', 'block');\n            var actual_height = dupe.height();\n            dupe.remove();\n\n            if($(this).hasClass('i-am-new')) {\n                $(this).css({\n                    top: ($(window).height() - actual_height) / 2 + 'px'\n                });\n            }\n            else {\n                $(this).animate({\n                    top: ($(window).height() - actual_height) / 2 + 'px'\n                }, 500);\n            }\n\n            if(window.innerWidth < 600) {\n                $(this).css({\n                    right: 5\n                });\n            }\n\n        }\n    },\n    parent   : {\n        object  : '<li />',\n        selector: 'li',\n        css     : {}\n    },\n    css      : {\n        display: 'none',\n        width  : '310px'\n    },\n    addClass : ''\n};\n$.noty.layouts.inline = {\n    name     : 'inline',\n    options  : {},\n    container: {\n        object  : '<ul class=\"noty_inline_layout_container\" />',\n        selector: 'ul.noty_inline_layout_container',\n        style   : function() {\n            $(this).css({\n                width        : '100%',\n                height       : 'auto',\n                margin       : 0,\n                padding      : 0,\n                listStyleType: 'none',\n                zIndex       : 9999999\n            });\n        }\n    },\n    parent   : {\n        object  : '<li />',\n        selector: 'li',\n        css     : {}\n    },\n    css      : {\n        display: 'none'\n    },\n    addClass : ''\n};\n$.noty.layouts.top = {\n    name     : 'top',\n    options  : {},\n    container: {\n        object  : '<ul id=\"noty_top_layout_container\" />',\n        selector: 'ul#noty_top_layout_container',\n        style   : function() {\n            $(this).css({\n                top          : 0,\n                left         : '5%',\n                position     : 'fixed',\n                width        : '90%',\n                height       : 'auto',\n                margin       : 0,\n                padding      : 0,\n                listStyleType: 'none',\n                zIndex       : 9999999\n            });\n        }\n    },\n    parent   : {\n        object  : '<li />',\n        selector: 'li',\n        css     : {}\n    },\n    css      : {\n        display: 'none'\n    },\n    addClass : ''\n};\n$.noty.layouts.topCenter = {\n    name     : 'topCenter',\n    options  : { // overrides options\n\n    },\n    container: {\n        object  : '<ul id=\"noty_topCenter_layout_container\" />',\n        selector: 'ul#noty_topCenter_layout_container',\n        style   : function() {\n            $(this).css({\n                top          : 20,\n                left         : 0,\n                position     : 'fixed',\n                width        : '310px',\n                height       : 'auto',\n                margin       : 0,\n                padding      : 0,\n                listStyleType: 'none',\n                zIndex       : 10000000\n            });\n\n            $(this).css({\n                left: ($(window).width() - $(this).outerWidth(false)) / 2 + 'px'\n            });\n        }\n    },\n    parent   : {\n        object  : '<li />',\n        selector: 'li',\n        css     : {}\n    },\n    css      : {\n        display: 'none',\n        width  : '310px'\n    },\n    addClass : ''\n};\n\n$.noty.layouts.topLeft = {\n    name     : 'topLeft',\n    options  : { // overrides options\n\n    },\n    container: {\n        object  : '<ul id=\"noty_topLeft_layout_container\" />',\n        selector: 'ul#noty_topLeft_layout_container',\n        style   : function() {\n            $(this).css({\n                top          : 20,\n                left         : 20,\n                position     : 'fixed',\n                width        : '310px',\n                height       : 'auto',\n                margin       : 0,\n                padding      : 0,\n                listStyleType: 'none',\n                zIndex       : 10000000\n            });\n\n            if(window.innerWidth < 600) {\n                $(this).css({\n                    left: 5\n                });\n            }\n        }\n    },\n    parent   : {\n        object  : '<li />',\n        selector: 'li',\n        css     : {}\n    },\n    css      : {\n        display: 'none',\n        width  : '310px'\n    },\n    addClass : ''\n};\n$.noty.layouts.topRight = {\n    name     : 'topRight',\n    options  : { // overrides options\n\n    },\n    container: {\n        object  : '<ul id=\"noty_topRight_layout_container\" />',\n        selector: 'ul#noty_topRight_layout_container',\n        style   : function() {\n            $(this).css({\n                top          : 20,\n                right        : 20,\n                position     : 'fixed',\n                width        : '310px',\n                height       : 'auto',\n                margin       : 0,\n                padding      : 0,\n                listStyleType: 'none',\n                zIndex       : 10000000\n            });\n\n            if(window.innerWidth < 600) {\n                $(this).css({\n                    right: 5\n                });\n            }\n        }\n    },\n    parent   : {\n        object  : '<li />',\n        selector: 'li',\n        css     : {}\n    },\n    css      : {\n        display: 'none',\n        width  : '310px'\n    },\n    addClass : ''\n};\n$.noty.themes.bootstrapTheme = {\n  name    : 'bootstrapTheme',\n  modal   : {\n    css: {\n      position       : 'fixed',\n      width          : '100%',\n      height         : '100%',\n      backgroundColor: '#000',\n      zIndex         : 10000,\n      opacity        : 0.6,\n      display        : 'none',\n      left           : 0,\n      top            : 0,\n      wordBreak      : 'break-all'\n    }\n  },\n  style   : function () {\n\n    var containerSelector = this.options.layout.container.selector;\n    $(containerSelector).addClass('list-group');\n\n    this.$closeButton.append('<span aria-hidden=\"true\">&times;</span><span class=\"sr-only\">Close</span>');\n    this.$closeButton.addClass('close');\n\n    this.$bar.addClass(\"list-group-item\").css('padding', '0px').css('position', 'relative');\n\n    this.$progressBar.css({\n      position       : 'absolute',\n      left           : 0,\n      bottom         : 0,\n      height         : 4,\n      width          : '100%',\n      backgroundColor: '#000000',\n      opacity        : 0.2,\n      '-ms-filter'   : 'progid:DXImageTransform.Microsoft.Alpha(Opacity=20)',\n      filter         : 'alpha(opacity=20)'\n    });\n\n    switch (this.options.type) {\n      case 'alert':\n      case 'notification':\n        this.$bar.addClass(\"list-group-item-info\");\n        break;\n      case 'warning':\n        this.$bar.addClass(\"list-group-item-warning\");\n        break;\n      case 'error':\n        this.$bar.addClass(\"list-group-item-danger\");\n        break;\n      case 'information':\n        this.$bar.addClass(\"list-group-item-info\");\n        break;\n      case 'success':\n        this.$bar.addClass(\"list-group-item-success\");\n        break;\n    }\n\n    this.$message.css({\n      textAlign: 'center',\n      padding  : '8px 10px 9px',\n      width    : 'auto',\n      position : 'relative'\n    });\n  },\n  callback: {\n    onShow : function () { },\n    onClose: function () { }\n  }\n};\n\n\n$.noty.themes.defaultTheme = {\n  name    : 'defaultTheme',\n  helpers : {\n    borderFix: function () {\n      if (this.options.dismissQueue) {\n        var selector = this.options.layout.container.selector + ' ' + this.options.layout.parent.selector;\n        switch (this.options.layout.name) {\n          case 'top':\n            $(selector).css({borderRadius: '0px 0px 0px 0px'});\n            $(selector).last().css({borderRadius: '0px 0px 5px 5px'});\n            break;\n          case 'topCenter':\n          case 'topLeft':\n          case 'topRight':\n          case 'bottomCenter':\n          case 'bottomLeft':\n          case 'bottomRight':\n          case 'center':\n          case 'centerLeft':\n          case 'centerRight':\n          case 'inline':\n            $(selector).css({borderRadius: '0px 0px 0px 0px'});\n            $(selector).first().css({'border-top-left-radius': '5px', 'border-top-right-radius': '5px'});\n            $(selector).last().css({'border-bottom-left-radius': '5px', 'border-bottom-right-radius': '5px'});\n            break;\n          case 'bottom':\n            $(selector).css({borderRadius: '0px 0px 0px 0px'});\n            $(selector).first().css({borderRadius: '5px 5px 0px 0px'});\n            break;\n          default:\n            break;\n        }\n      }\n    }\n  },\n  modal   : {\n    css: {\n      position       : 'fixed',\n      width          : '100%',\n      height         : '100%',\n      backgroundColor: '#000',\n      zIndex         : 10000,\n      opacity        : 0.6,\n      display        : 'none',\n      left           : 0,\n      top            : 0\n    }\n  },\n  style   : function () {\n\n    this.$bar.css({\n      overflow  : 'hidden',\n      background: \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAoCAQAAAClM0ndAAAAhklEQVR4AdXO0QrCMBBE0bttkk38/w8WRERpdyjzVOc+HxhIHqJGMQcFFkpYRQotLLSw0IJ5aBdovruMYDA/kT8plF9ZKLFQcgF18hDj1SbQOMlCA4kao0iiXmah7qBWPdxpohsgVZyj7e5I9KcID+EhiDI5gxBYKLBQYKHAQoGFAoEks/YEGHYKB7hFxf0AAAAASUVORK5CYII=') repeat-x scroll left top #fff\",\n      position  : 'relative'\n    });\n\n    this.$progressBar.css({\n      position       : 'absolute',\n      left           : 0,\n      bottom         : 0,\n      height         : 4,\n      width          : '100%',\n      backgroundColor: '#000000',\n      opacity        : 0.2,\n      '-ms-filter'   : 'progid:DXImageTransform.Microsoft.Alpha(Opacity=20)',\n      filter         : 'alpha(opacity=20)'\n    });\n\n    this.$message.css({\n      textAlign: 'center',\n      padding  : '8px 10px 9px',\n      width    : 'auto',\n      position : 'relative'\n    });\n\n    this.$closeButton.css({\n      position  : 'absolute',\n      top       : 4, right: 4,\n      width     : 10, height: 10,\n      background: \"url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAQAAAAnOwc2AAAAxUlEQVR4AR3MPUoDURSA0e++uSkkOxC3IAOWNtaCIDaChfgXBMEZbQRByxCwk+BasgQRZLSYoLgDQbARxry8nyumPcVRKDfd0Aa8AsgDv1zp6pYd5jWOwhvebRTbzNNEw5BSsIpsj/kurQBnmk7sIFcCF5yyZPDRG6trQhujXYosaFoc+2f1MJ89uc76IND6F9BvlXUdpb6xwD2+4q3me3bysiHvtLYrUJto7PD/ve7LNHxSg/woN2kSz4txasBdhyiz3ugPGetTjm3XRokAAAAASUVORK5CYII=)\",\n      display   : 'none',\n      cursor    : 'pointer'\n    });\n\n    this.$buttons.css({\n      padding        : 5,\n      textAlign      : 'right',\n      borderTop      : '1px solid #ccc',\n      backgroundColor: '#fff'\n    });\n\n    this.$buttons.find('button').css({\n      marginLeft: 5\n    });\n\n    this.$buttons.find('button:first').css({\n      marginLeft: 0\n    });\n\n    this.$bar.on({\n      mouseenter: function () {\n        $(this).find('.noty_close').stop().fadeTo('normal', 1);\n      },\n      mouseleave: function () {\n        $(this).find('.noty_close').stop().fadeTo('normal', 0);\n      }\n    });\n\n    switch (this.options.layout.name) {\n      case 'top':\n        this.$bar.css({\n          borderRadius: '0px 0px 5px 5px',\n          borderBottom: '2px solid #eee',\n          borderLeft  : '2px solid #eee',\n          borderRight : '2px solid #eee',\n          boxShadow   : \"0 2px 4px rgba(0, 0, 0, 0.1)\"\n        });\n        break;\n      case 'topCenter':\n      case 'center':\n      case 'bottomCenter':\n      case 'inline':\n        this.$bar.css({\n          borderRadius: '5px',\n          border      : '1px solid #eee',\n          boxShadow   : \"0 2px 4px rgba(0, 0, 0, 0.1)\"\n        });\n        this.$message.css({textAlign: 'center'});\n        break;\n      case 'topLeft':\n      case 'topRight':\n      case 'bottomLeft':\n      case 'bottomRight':\n      case 'centerLeft':\n      case 'centerRight':\n        this.$bar.css({\n          borderRadius: '5px',\n          border      : '1px solid #eee',\n          boxShadow   : \"0 2px 4px rgba(0, 0, 0, 0.1)\"\n        });\n        this.$message.css({textAlign: 'left'});\n        break;\n      case 'bottom':\n        this.$bar.css({\n          borderRadius: '5px 5px 0px 0px',\n          borderTop   : '2px solid #eee',\n          borderLeft  : '2px solid #eee',\n          borderRight : '2px solid #eee',\n          boxShadow   : \"0 -2px 4px rgba(0, 0, 0, 0.1)\"\n        });\n        break;\n      default:\n        this.$bar.css({\n          border   : '2px solid #eee',\n          boxShadow: \"0 2px 4px rgba(0, 0, 0, 0.1)\"\n        });\n        break;\n    }\n\n    switch (this.options.type) {\n      case 'alert':\n      case 'notification':\n        this.$bar.css({backgroundColor: '#FFF', borderColor: '#CCC', color: '#444'});\n        break;\n      case 'warning':\n        this.$bar.css({backgroundColor: '#FFEAA8', borderColor: '#FFC237', color: '#826200'});\n        this.$buttons.css({borderTop: '1px solid #FFC237'});\n        break;\n      case 'error':\n        this.$bar.css({backgroundColor: 'red', borderColor: 'darkred', color: '#FFF'});\n        this.$message.css({fontWeight: 'bold'});\n        this.$buttons.css({borderTop: '1px solid darkred'});\n        break;\n      case 'information':\n        this.$bar.css({backgroundColor: '#57B7E2', borderColor: '#0B90C4', color: '#FFF'});\n        this.$buttons.css({borderTop: '1px solid #0B90C4'});\n        break;\n      case 'success':\n        this.$bar.css({backgroundColor: 'lightgreen', borderColor: '#50C24E', color: 'darkgreen'});\n        this.$buttons.css({borderTop: '1px solid #50C24E'});\n        break;\n      default:\n        this.$bar.css({backgroundColor: '#FFF', borderColor: '#CCC', color: '#444'});\n        break;\n    }\n  },\n  callback: {\n    onShow : function () {\n      $.noty.themes.defaultTheme.helpers.borderFix.apply(this);\n    },\n    onClose: function () {\n      $.noty.themes.defaultTheme.helpers.borderFix.apply(this);\n    }\n  }\n};\n\n$.noty.themes.metroui = {\n  name    : 'metroui',\n  helpers : {},\n  modal   : {\n    css: {\n      position       : 'fixed',\n      width          : '100%',\n      height         : '100%',\n      backgroundColor: '#000',\n      zIndex         : 10000,\n      opacity        : 0.6,\n      display        : 'none',\n      left           : 0,\n      top            : 0\n    }\n  },\n  style   : function () {\n\n    this.$bar.css({\n      overflow    : 'hidden',\n      margin      : '4px 0',\n      borderRadius: '0',\n      position    : 'relative'\n    });\n\n    this.$progressBar.css({\n      position       : 'absolute',\n      left           : 0,\n      bottom         : 0,\n      height         : 4,\n      width          : '100%',\n      backgroundColor: '#000000',\n      opacity        : 0.2,\n      '-ms-filter'   : 'progid:DXImageTransform.Microsoft.Alpha(Opacity=20)',\n      filter         : 'alpha(opacity=20)'\n    });\n\n    this.$message.css({\n      textAlign: 'center',\n      padding  : '1.25rem',\n      width    : 'auto',\n      position : 'relative'\n    });\n\n    this.$closeButton.css({\n      position  : 'absolute',\n      top       : '.25rem', right: '.25rem',\n      width     : 10, height: 10,\n      background: \"url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAQAAAAnOwc2AAAAxUlEQVR4AR3MPUoDURSA0e++uSkkOxC3IAOWNtaCIDaChfgXBMEZbQRByxCwk+BasgQRZLSYoLgDQbARxry8nyumPcVRKDfd0Aa8AsgDv1zp6pYd5jWOwhvebRTbzNNEw5BSsIpsj/kurQBnmk7sIFcCF5yyZPDRG6trQhujXYosaFoc+2f1MJ89uc76IND6F9BvlXUdpb6xwD2+4q3me3bysiHvtLYrUJto7PD/ve7LNHxSg/woN2kSz4txasBdhyiz3ugPGetTjm3XRokAAAAASUVORK5CYII=)\",\n      display   : 'none',\n      cursor    : 'pointer'\n    });\n\n    this.$buttons.css({\n      padding        : 5,\n      textAlign      : 'right',\n      borderTop      : '1px solid #ccc',\n      backgroundColor: '#fff'\n    });\n\n    this.$buttons.find('button').css({\n      marginLeft: 5\n    });\n\n    this.$buttons.find('button:first').css({\n      marginLeft: 0\n    });\n\n    this.$bar.on({\n      mouseenter: function () {\n        $(this).find('.noty_close').stop().fadeTo('normal', 1);\n      },\n      mouseleave: function () {\n        $(this).find('.noty_close').stop().fadeTo('normal', 0);\n      }\n    });\n\n    switch (this.options.layout.name) {\n      case 'top':\n        this.$bar.css({\n          border   : 'none',\n          boxShadow: \"0 0 5px 0 rgba(0, 0, 0, 0.3)\"\n        });\n        break;\n      case 'topCenter':\n      case 'center':\n      case 'bottomCenter':\n      case 'inline':\n        this.$bar.css({\n          border   : 'none',\n          boxShadow: \"0 0 5px 0 rgba(0, 0, 0, 0.3)\"\n        });\n        this.$message.css({textAlign: 'center'});\n        break;\n      case 'topLeft':\n      case 'topRight':\n      case 'bottomLeft':\n      case 'bottomRight':\n      case 'centerLeft':\n      case 'centerRight':\n        this.$bar.css({\n          border   : 'none',\n          boxShadow: \"0 0 5px 0 rgba(0, 0, 0, 0.3)\"\n        });\n        this.$message.css({textAlign: 'left'});\n        break;\n      case 'bottom':\n        this.$bar.css({\n          border   : 'none',\n          boxShadow: \"0 0 5px 0 rgba(0, 0, 0, 0.3)\"\n        });\n        break;\n      default:\n        this.$bar.css({\n          border   : 'none',\n          boxShadow: \"0 0 5px 0 rgba(0, 0, 0, 0.3)\"\n        });\n        break;\n    }\n\n    switch (this.options.type) {\n      case 'alert':\n      case 'notification':\n        this.$bar.css({backgroundColor: '#fff', border: 'none', color: '#1d1d1d'});\n        break;\n      case 'warning':\n        this.$bar.css({backgroundColor: '#FA6800', border: 'none', color: '#fff'});\n        this.$buttons.css({borderTop: '1px solid #FA6800'});\n        break;\n      case 'error':\n        this.$bar.css({backgroundColor: '#CE352C', border: 'none', color: '#fff'});\n        this.$message.css({fontWeight: 'bold'});\n        this.$buttons.css({borderTop: '1px solid #CE352C'});\n        break;\n      case 'information':\n        this.$bar.css({backgroundColor: '#1BA1E2', border: 'none', color: '#fff'});\n        this.$buttons.css({borderTop: '1px solid #1BA1E2'});\n        break;\n      case 'success':\n        this.$bar.css({backgroundColor: '#60A917', border: 'none', color: '#fff'});\n        this.$buttons.css({borderTop: '1px solid #50C24E'});\n        break;\n      default:\n        this.$bar.css({backgroundColor: '#fff', border: 'none', color: '#1d1d1d'});\n        break;\n    }\n  },\n  callback: {\n    onShow : function () {\n\n    },\n    onClose: function () {\n\n    }\n  }\n};\n$.noty.themes.relax = {\n  name    : 'relax',\n  helpers : {},\n  modal   : {\n    css: {\n      position       : 'fixed',\n      width          : '100%',\n      height         : '100%',\n      backgroundColor: '#000',\n      zIndex         : 10000,\n      opacity        : 0.6,\n      display        : 'none',\n      left           : 0,\n      top            : 0\n    }\n  },\n  style   : function () {\n\n    this.$bar.css({\n      overflow    : 'hidden',\n      margin      : '4px 0',\n      borderRadius: '2px',\n      position    : 'relative'\n    });\n\n    this.$progressBar.css({\n      position       : 'absolute',\n      left           : 0,\n      bottom         : 0,\n      height         : 4,\n      width          : '100%',\n      backgroundColor: '#000000',\n      opacity        : 0.2,\n      '-ms-filter'   : 'progid:DXImageTransform.Microsoft.Alpha(Opacity=20)',\n      filter         : 'alpha(opacity=20)'\n    });\n\n    this.$message.css({\n      textAlign: 'center',\n      padding  : '10px',\n      width    : 'auto',\n      position : 'relative'\n    });\n\n    this.$closeButton.css({\n      position  : 'absolute',\n      top       : 4, right: 4,\n      width     : 10, height: 10,\n      background: \"url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAQAAAAnOwc2AAAAxUlEQVR4AR3MPUoDURSA0e++uSkkOxC3IAOWNtaCIDaChfgXBMEZbQRByxCwk+BasgQRZLSYoLgDQbARxry8nyumPcVRKDfd0Aa8AsgDv1zp6pYd5jWOwhvebRTbzNNEw5BSsIpsj/kurQBnmk7sIFcCF5yyZPDRG6trQhujXYosaFoc+2f1MJ89uc76IND6F9BvlXUdpb6xwD2+4q3me3bysiHvtLYrUJto7PD/ve7LNHxSg/woN2kSz4txasBdhyiz3ugPGetTjm3XRokAAAAASUVORK5CYII=)\",\n      display   : 'none',\n      cursor    : 'pointer'\n    });\n\n    this.$buttons.css({\n      padding        : 5,\n      textAlign      : 'right',\n      borderTop      : '1px solid #ccc',\n      backgroundColor: '#fff'\n    });\n\n    this.$buttons.find('button').css({\n      marginLeft: 5\n    });\n\n    this.$buttons.find('button:first').css({\n      marginLeft: 0\n    });\n\n    this.$bar.on({\n      mouseenter: function () {\n        $(this).find('.noty_close').stop().fadeTo('normal', 1);\n      },\n      mouseleave: function () {\n        $(this).find('.noty_close').stop().fadeTo('normal', 0);\n      }\n    });\n\n    switch (this.options.layout.name) {\n      case 'top':\n        this.$bar.css({\n          borderBottom: '2px solid #eee',\n          borderLeft  : '2px solid #eee',\n          borderRight : '2px solid #eee',\n          borderTop   : '2px solid #eee',\n          boxShadow   : \"0 2px 4px rgba(0, 0, 0, 0.1)\"\n        });\n        break;\n      case 'topCenter':\n      case 'center':\n      case 'bottomCenter':\n      case 'inline':\n        this.$bar.css({\n          border   : '1px solid #eee',\n          boxShadow: \"0 2px 4px rgba(0, 0, 0, 0.1)\"\n        });\n        this.$message.css({textAlign: 'center'});\n        break;\n      case 'topLeft':\n      case 'topRight':\n      case 'bottomLeft':\n      case 'bottomRight':\n      case 'centerLeft':\n      case 'centerRight':\n        this.$bar.css({\n          border   : '1px solid #eee',\n          boxShadow: \"0 2px 4px rgba(0, 0, 0, 0.1)\"\n        });\n        this.$message.css({textAlign: 'left'});\n        break;\n      case 'bottom':\n        this.$bar.css({\n          borderTop   : '2px solid #eee',\n          borderLeft  : '2px solid #eee',\n          borderRight : '2px solid #eee',\n          borderBottom: '2px solid #eee',\n          boxShadow   : \"0 -2px 4px rgba(0, 0, 0, 0.1)\"\n        });\n        break;\n      default:\n        this.$bar.css({\n          border   : '2px solid #eee',\n          boxShadow: \"0 2px 4px rgba(0, 0, 0, 0.1)\"\n        });\n        break;\n    }\n\n    switch (this.options.type) {\n      case 'alert':\n      case 'notification':\n        this.$bar.css({backgroundColor: '#FFF', borderColor: '#dedede', color: '#444'});\n        break;\n      case 'warning':\n        this.$bar.css({backgroundColor: '#FFEAA8', borderColor: '#FFC237', color: '#826200'});\n        this.$buttons.css({borderTop: '1px solid #FFC237'});\n        break;\n      case 'error':\n        this.$bar.css({backgroundColor: '#FF8181', borderColor: '#e25353', color: '#FFF'});\n        this.$message.css({fontWeight: 'bold'});\n        this.$buttons.css({borderTop: '1px solid darkred'});\n        break;\n      case 'information':\n        this.$bar.css({backgroundColor: '#78C5E7', borderColor: '#3badd6', color: '#FFF'});\n        this.$buttons.css({borderTop: '1px solid #0B90C4'});\n        break;\n      case 'success':\n        this.$bar.css({backgroundColor: '#BCF5BC', borderColor: '#7cdd77', color: 'darkgreen'});\n        this.$buttons.css({borderTop: '1px solid #50C24E'});\n        break;\n      default:\n        this.$bar.css({backgroundColor: '#FFF', borderColor: '#CCC', color: '#444'});\n        break;\n    }\n  },\n  callback: {\n    onShow : function () {\n\n    },\n    onClose: function () {\n\n    }\n  }\n};\n\n$.noty.themes.semanticUI = {\n  name: 'semanticUI',\n\n  template: '<div class=\"ui message\"><div class=\"content\"><div class=\"header\"></div></div></div>',\n\n  animation: {\n    open : {\n      animation: 'fade',\n      duration : '800ms'\n    },\n    close: {\n      animation: 'fade left',\n      duration : '800ms'\n    }\n  },\n\n  modal   : {\n    css: {\n      position       : 'fixed',\n      width          : '100%',\n      height         : '100%',\n      backgroundColor: '#000',\n      zIndex         : 10000,\n      opacity        : 0.6,\n      display        : 'none',\n      left           : 0,\n      top            : 0\n    }\n  },\n  style   : function () {\n    this.$message = this.$bar.find('.ui.message');\n\n    this.$message.find('.header').html(this.options.header);\n    this.$message.find('.content').append(this.options.text);\n\n    this.$bar.css({\n      margin  : '0.5em',\n      position: 'relative'\n    });\n\n    if (this.options.icon) {\n      this.$message.addClass('icon').prepend($('<i/>').addClass(this.options.icon));\n    }\n\n    this.$progressBar.css({\n      position       : 'absolute',\n      left           : 0,\n      bottom         : 0,\n      height         : 4,\n      width          : '100%',\n      backgroundColor: '#000000',\n      opacity        : 0.2,\n      '-ms-filter'   : 'progid:DXImageTransform.Microsoft.Alpha(Opacity=20)',\n      filter         : 'alpha(opacity=20)'\n    });\n\n    switch (this.options.size) {\n      case 'mini':\n        this.$message.addClass('mini');\n        break;\n      case 'tiny':\n        this.$message.addClass('tiny');\n        break;\n      case 'small':\n        this.$message.addClass('small');\n        break;\n      case 'large':\n        this.$message.addClass('large');\n        break;\n      case 'big':\n        this.$message.addClass('big');\n        break;\n      case 'huge':\n        this.$message.addClass('huge');\n        break;\n      case 'massive':\n        this.$message.addClass('massive');\n        break;\n    }\n\n    switch (this.options.type) {\n      case 'info':\n        this.$message.addClass('info');\n        break;\n      case 'warning':\n        this.$message.addClass('warning');\n        break;\n      case 'error':\n        this.$message.addClass('error');\n        break;\n      case 'negative':\n        this.$message.addClass('negative');\n        break;\n      case 'success':\n        this.$message.addClass('success');\n        break;\n      case 'positive':\n        this.$message.addClass('positive');\n        break;\n      case 'floating':\n        this.$message.addClass('floating');\n        break;\n    }\n  },\n  callback: {\n    onShow : function () {\n      // Enable transition\n      this.$bar.addClass('transition');\n      // Actual transition\n      this.$bar.transition(this.options.animation.open);\n    },\n    onClose: function () {\n      this.$bar.transition(this.options.animation.close);\n    }\n  }\n};\n\n\nreturn window.noty;\n\n});"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/js/noty/promise.js",
    "content": "/*!\n * Noty Helpers Javascript From JQuery Javascript Library\n *\n * Ported by Maksim Pecherskiy.  Original Licensing:\n *\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\n\n(function(){\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\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,undefined,true) || 0) + 1, true );\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, undefined, true) || 1 ) - 1 );\n      if ( count ) {\n        jQuery.data( elem, key, count, true );\n      } else {\n        jQuery.removeData( elem, key, true );\n        handleQueueMarkDefer( elem, type, \"mark\" );\n      }\n    }\n  },\n\n  queue: function( elem, type, data ) {\n    if ( elem ) {\n      type = (type || \"fx\") + \"queue\";\n      var q = jQuery.data( elem, type, undefined, true );\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), true );\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      defer;\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      fn.call(elem, function() {\n        jQuery.dequeue(elem, type);\n      });\n    }\n\n    if ( !queue.length ) {\n      jQuery.removeData( elem, type + \"queue\", 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() {\n      var elem = this;\n      setTimeout(function() {\n        jQuery.dequeue( elem, type );\n      }, time );\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._Deferred(), true ) )) {\n        count++;\n        tmp.done( resolve );\n      }\n    }\n    resolve();\n    return defer.promise();\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\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\njQuery.fn.extend({\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})();"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/js/noty/themes/bootstrap.js",
    "content": "$.noty.themes.bootstrapTheme = {\n  name    : 'bootstrapTheme',\n  modal   : {\n    css: {\n      position       : 'fixed',\n      width          : '100%',\n      height         : '100%',\n      backgroundColor: '#000',\n      zIndex         : 10000,\n      opacity        : 0.6,\n      display        : 'none',\n      left           : 0,\n      top            : 0,\n      wordBreak      : 'break-all'\n    }\n  },\n  style   : function () {\n\n    var containerSelector = this.options.layout.container.selector;\n    $(containerSelector).addClass('list-group');\n\n    this.$closeButton.append('<span aria-hidden=\"true\">&times;</span><span class=\"sr-only\">Close</span>');\n    this.$closeButton.addClass('close');\n\n    this.$bar.addClass(\"list-group-item\").css('padding', '0px').css('position', 'relative');\n\n    this.$progressBar.css({\n      position       : 'absolute',\n      left           : 0,\n      bottom         : 0,\n      height         : 4,\n      width          : '100%',\n      backgroundColor: '#000000',\n      opacity        : 0.2,\n      '-ms-filter'   : 'progid:DXImageTransform.Microsoft.Alpha(Opacity=20)',\n      filter         : 'alpha(opacity=20)'\n    });\n\n    switch (this.options.type) {\n      case 'alert':\n      case 'notification':\n        this.$bar.addClass(\"list-group-item-info\");\n        break;\n      case 'warning':\n        this.$bar.addClass(\"list-group-item-warning\");\n        break;\n      case 'error':\n        this.$bar.addClass(\"list-group-item-danger\");\n        break;\n      case 'information':\n        this.$bar.addClass(\"list-group-item-info\");\n        break;\n      case 'success':\n        this.$bar.addClass(\"list-group-item-success\");\n        break;\n    }\n\n    this.$message.css({\n      textAlign: 'center',\n      padding  : '8px 10px 9px',\n      width    : 'auto',\n      position : 'relative'\n    });\n  },\n  callback: {\n    onShow : function () { },\n    onClose: function () { }\n  }\n};\n\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/js/noty/themes/default.js",
    "content": "$.noty.themes.defaultTheme = {\n  name    : 'defaultTheme',\n  helpers : {\n    borderFix: function () {\n      if (this.options.dismissQueue) {\n        var selector = this.options.layout.container.selector + ' ' + this.options.layout.parent.selector;\n        switch (this.options.layout.name) {\n          case 'top':\n            $(selector).css({borderRadius: '0px 0px 0px 0px'});\n            $(selector).last().css({borderRadius: '0px 0px 5px 5px'});\n            break;\n          case 'topCenter':\n          case 'topLeft':\n          case 'topRight':\n          case 'bottomCenter':\n          case 'bottomLeft':\n          case 'bottomRight':\n          case 'center':\n          case 'centerLeft':\n          case 'centerRight':\n          case 'inline':\n            $(selector).css({borderRadius: '0px 0px 0px 0px'});\n            $(selector).first().css({'border-top-left-radius': '5px', 'border-top-right-radius': '5px'});\n            $(selector).last().css({'border-bottom-left-radius': '5px', 'border-bottom-right-radius': '5px'});\n            break;\n          case 'bottom':\n            $(selector).css({borderRadius: '0px 0px 0px 0px'});\n            $(selector).first().css({borderRadius: '5px 5px 0px 0px'});\n            break;\n          default:\n            break;\n        }\n      }\n    }\n  },\n  modal   : {\n    css: {\n      position       : 'fixed',\n      width          : '100%',\n      height         : '100%',\n      backgroundColor: '#000',\n      zIndex         : 10000,\n      opacity        : 0.6,\n      display        : 'none',\n      left           : 0,\n      top            : 0\n    }\n  },\n  style   : function () {\n\n    this.$bar.css({\n      overflow  : 'hidden',\n      background: \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAoCAQAAAClM0ndAAAAhklEQVR4AdXO0QrCMBBE0bttkk38/w8WRERpdyjzVOc+HxhIHqJGMQcFFkpYRQotLLSw0IJ5aBdovruMYDA/kT8plF9ZKLFQcgF18hDj1SbQOMlCA4kao0iiXmah7qBWPdxpohsgVZyj7e5I9KcID+EhiDI5gxBYKLBQYKHAQoGFAoEks/YEGHYKB7hFxf0AAAAASUVORK5CYII=') repeat-x scroll left top #fff\",\n      position  : 'relative'\n    });\n\n    this.$progressBar.css({\n      position       : 'absolute',\n      left           : 0,\n      bottom         : 0,\n      height         : 4,\n      width          : '100%',\n      backgroundColor: '#000000',\n      opacity        : 0.2,\n      '-ms-filter'   : 'progid:DXImageTransform.Microsoft.Alpha(Opacity=20)',\n      filter         : 'alpha(opacity=20)'\n    });\n\n    this.$message.css({\n      textAlign: 'center',\n      padding  : '8px 10px 9px',\n      width    : 'auto',\n      position : 'relative'\n    });\n\n    this.$closeButton.css({\n      position  : 'absolute',\n      top       : 4, right: 4,\n      width     : 10, height: 10,\n      background: \"url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAQAAAAnOwc2AAAAxUlEQVR4AR3MPUoDURSA0e++uSkkOxC3IAOWNtaCIDaChfgXBMEZbQRByxCwk+BasgQRZLSYoLgDQbARxry8nyumPcVRKDfd0Aa8AsgDv1zp6pYd5jWOwhvebRTbzNNEw5BSsIpsj/kurQBnmk7sIFcCF5yyZPDRG6trQhujXYosaFoc+2f1MJ89uc76IND6F9BvlXUdpb6xwD2+4q3me3bysiHvtLYrUJto7PD/ve7LNHxSg/woN2kSz4txasBdhyiz3ugPGetTjm3XRokAAAAASUVORK5CYII=)\",\n      display   : 'none',\n      cursor    : 'pointer'\n    });\n\n    this.$buttons.css({\n      padding        : 5,\n      textAlign      : 'right',\n      borderTop      : '1px solid #ccc',\n      backgroundColor: '#fff'\n    });\n\n    this.$buttons.find('button').css({\n      marginLeft: 5\n    });\n\n    this.$buttons.find('button:first').css({\n      marginLeft: 0\n    });\n\n    this.$bar.on({\n      mouseenter: function () {\n        $(this).find('.noty_close').stop().fadeTo('normal', 1);\n      },\n      mouseleave: function () {\n        $(this).find('.noty_close').stop().fadeTo('normal', 0);\n      }\n    });\n\n    switch (this.options.layout.name) {\n      case 'top':\n        this.$bar.css({\n          borderRadius: '0px 0px 5px 5px',\n          borderBottom: '2px solid #eee',\n          borderLeft  : '2px solid #eee',\n          borderRight : '2px solid #eee',\n          boxShadow   : \"0 2px 4px rgba(0, 0, 0, 0.1)\"\n        });\n        break;\n      case 'topCenter':\n      case 'center':\n      case 'bottomCenter':\n      case 'inline':\n        this.$bar.css({\n          borderRadius: '5px',\n          border      : '1px solid #eee',\n          boxShadow   : \"0 2px 4px rgba(0, 0, 0, 0.1)\"\n        });\n        this.$message.css({textAlign: 'center'});\n        break;\n      case 'topLeft':\n      case 'topRight':\n      case 'bottomLeft':\n      case 'bottomRight':\n      case 'centerLeft':\n      case 'centerRight':\n        this.$bar.css({\n          borderRadius: '5px',\n          border      : '1px solid #eee',\n          boxShadow   : \"0 2px 4px rgba(0, 0, 0, 0.1)\"\n        });\n        this.$message.css({textAlign: 'left'});\n        break;\n      case 'bottom':\n        this.$bar.css({\n          borderRadius: '5px 5px 0px 0px',\n          borderTop   : '2px solid #eee',\n          borderLeft  : '2px solid #eee',\n          borderRight : '2px solid #eee',\n          boxShadow   : \"0 -2px 4px rgba(0, 0, 0, 0.1)\"\n        });\n        break;\n      default:\n        this.$bar.css({\n          border   : '2px solid #eee',\n          boxShadow: \"0 2px 4px rgba(0, 0, 0, 0.1)\"\n        });\n        break;\n    }\n\n    switch (this.options.type) {\n      case 'alert':\n      case 'notification':\n        this.$bar.css({backgroundColor: '#FFF', borderColor: '#CCC', color: '#444'});\n        break;\n      case 'warning':\n        this.$bar.css({backgroundColor: '#FFEAA8', borderColor: '#FFC237', color: '#826200'});\n        this.$buttons.css({borderTop: '1px solid #FFC237'});\n        break;\n      case 'error':\n        this.$bar.css({backgroundColor: 'red', borderColor: 'darkred', color: '#FFF'});\n        this.$message.css({fontWeight: 'bold'});\n        this.$buttons.css({borderTop: '1px solid darkred'});\n        break;\n      case 'information':\n        this.$bar.css({backgroundColor: '#57B7E2', borderColor: '#0B90C4', color: '#FFF'});\n        this.$buttons.css({borderTop: '1px solid #0B90C4'});\n        break;\n      case 'success':\n        this.$bar.css({backgroundColor: 'lightgreen', borderColor: '#50C24E', color: 'darkgreen'});\n        this.$buttons.css({borderTop: '1px solid #50C24E'});\n        break;\n      default:\n        this.$bar.css({backgroundColor: '#FFF', borderColor: '#CCC', color: '#444'});\n        break;\n    }\n  },\n  callback: {\n    onShow : function () {\n      $.noty.themes.defaultTheme.helpers.borderFix.apply(this);\n    },\n    onClose: function () {\n      $.noty.themes.defaultTheme.helpers.borderFix.apply(this);\n    }\n  }\n};\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/js/noty/themes/metroui.js",
    "content": "$.noty.themes.metroui = {\n  name    : 'metroui',\n  helpers : {},\n  modal   : {\n    css: {\n      position       : 'fixed',\n      width          : '100%',\n      height         : '100%',\n      backgroundColor: '#000',\n      zIndex         : 10000,\n      opacity        : 0.6,\n      display        : 'none',\n      left           : 0,\n      top            : 0\n    }\n  },\n  style   : function () {\n\n    this.$bar.css({\n      overflow    : 'hidden',\n      margin      : '4px 0',\n      borderRadius: '0',\n      position    : 'relative'\n    });\n\n    this.$progressBar.css({\n      position       : 'absolute',\n      left           : 0,\n      bottom         : 0,\n      height         : 4,\n      width          : '100%',\n      backgroundColor: '#000000',\n      opacity        : 0.2,\n      '-ms-filter'   : 'progid:DXImageTransform.Microsoft.Alpha(Opacity=20)',\n      filter         : 'alpha(opacity=20)'\n    });\n\n    this.$message.css({\n      textAlign: 'center',\n      padding  : '1.25rem',\n      width    : 'auto',\n      position : 'relative'\n    });\n\n    this.$closeButton.css({\n      position  : 'absolute',\n      top       : '.25rem', right: '.25rem',\n      width     : 10, height: 10,\n      background: \"url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAQAAAAnOwc2AAAAxUlEQVR4AR3MPUoDURSA0e++uSkkOxC3IAOWNtaCIDaChfgXBMEZbQRByxCwk+BasgQRZLSYoLgDQbARxry8nyumPcVRKDfd0Aa8AsgDv1zp6pYd5jWOwhvebRTbzNNEw5BSsIpsj/kurQBnmk7sIFcCF5yyZPDRG6trQhujXYosaFoc+2f1MJ89uc76IND6F9BvlXUdpb6xwD2+4q3me3bysiHvtLYrUJto7PD/ve7LNHxSg/woN2kSz4txasBdhyiz3ugPGetTjm3XRokAAAAASUVORK5CYII=)\",\n      display   : 'none',\n      cursor    : 'pointer'\n    });\n\n    this.$buttons.css({\n      padding        : 5,\n      textAlign      : 'right',\n      borderTop      : '1px solid #ccc',\n      backgroundColor: '#fff'\n    });\n\n    this.$buttons.find('button').css({\n      marginLeft: 5\n    });\n\n    this.$buttons.find('button:first').css({\n      marginLeft: 0\n    });\n\n    this.$bar.on({\n      mouseenter: function () {\n        $(this).find('.noty_close').stop().fadeTo('normal', 1);\n      },\n      mouseleave: function () {\n        $(this).find('.noty_close').stop().fadeTo('normal', 0);\n      }\n    });\n\n    switch (this.options.layout.name) {\n      case 'top':\n        this.$bar.css({\n          border   : 'none',\n          boxShadow: \"0 0 5px 0 rgba(0, 0, 0, 0.3)\"\n        });\n        break;\n      case 'topCenter':\n      case 'center':\n      case 'bottomCenter':\n      case 'inline':\n        this.$bar.css({\n          border   : 'none',\n          boxShadow: \"0 0 5px 0 rgba(0, 0, 0, 0.3)\"\n        });\n        this.$message.css({textAlign: 'center'});\n        break;\n      case 'topLeft':\n      case 'topRight':\n      case 'bottomLeft':\n      case 'bottomRight':\n      case 'centerLeft':\n      case 'centerRight':\n        this.$bar.css({\n          border   : 'none',\n          boxShadow: \"0 0 5px 0 rgba(0, 0, 0, 0.3)\"\n        });\n        this.$message.css({textAlign: 'left'});\n        break;\n      case 'bottom':\n        this.$bar.css({\n          border   : 'none',\n          boxShadow: \"0 0 5px 0 rgba(0, 0, 0, 0.3)\"\n        });\n        break;\n      default:\n        this.$bar.css({\n          border   : 'none',\n          boxShadow: \"0 0 5px 0 rgba(0, 0, 0, 0.3)\"\n        });\n        break;\n    }\n\n    switch (this.options.type) {\n      case 'alert':\n      case 'notification':\n        this.$bar.css({backgroundColor: '#fff', border: 'none', color: '#1d1d1d'});\n        break;\n      case 'warning':\n        this.$bar.css({backgroundColor: '#FA6800', border: 'none', color: '#fff'});\n        this.$buttons.css({borderTop: '1px solid #FA6800'});\n        break;\n      case 'error':\n        this.$bar.css({backgroundColor: '#CE352C', border: 'none', color: '#fff'});\n        this.$message.css({fontWeight: 'bold'});\n        this.$buttons.css({borderTop: '1px solid #CE352C'});\n        break;\n      case 'information':\n        this.$bar.css({backgroundColor: '#1BA1E2', border: 'none', color: '#fff'});\n        this.$buttons.css({borderTop: '1px solid #1BA1E2'});\n        break;\n      case 'success':\n        this.$bar.css({backgroundColor: '#60A917', border: 'none', color: '#fff'});\n        this.$buttons.css({borderTop: '1px solid #50C24E'});\n        break;\n      default:\n        this.$bar.css({backgroundColor: '#fff', border: 'none', color: '#1d1d1d'});\n        break;\n    }\n  },\n  callback: {\n    onShow : function () {\n\n    },\n    onClose: function () {\n\n    }\n  }\n};"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/js/noty/themes/relax.js",
    "content": "$.noty.themes.relax = {\n  name    : 'relax',\n  helpers : {},\n  modal   : {\n    css: {\n      position       : 'fixed',\n      width          : '100%',\n      height         : '100%',\n      backgroundColor: '#000',\n      zIndex         : 10000,\n      opacity        : 0.6,\n      display        : 'none',\n      left           : 0,\n      top            : 0\n    }\n  },\n  style   : function () {\n\n    this.$bar.css({\n      overflow    : 'hidden',\n      margin      : '4px 0',\n      borderRadius: '2px',\n      position    : 'relative'\n    });\n\n    this.$progressBar.css({\n      position       : 'absolute',\n      left           : 0,\n      bottom         : 0,\n      height         : 4,\n      width          : '100%',\n      backgroundColor: '#000000',\n      opacity        : 0.2,\n      '-ms-filter'   : 'progid:DXImageTransform.Microsoft.Alpha(Opacity=20)',\n      filter         : 'alpha(opacity=20)'\n    });\n\n    this.$message.css({\n      textAlign: 'center',\n      padding  : '10px',\n      width    : 'auto',\n      position : 'relative'\n    });\n\n    this.$closeButton.css({\n      position  : 'absolute',\n      top       : 4, right: 4,\n      width     : 10, height: 10,\n      background: \"url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAQAAAAnOwc2AAAAxUlEQVR4AR3MPUoDURSA0e++uSkkOxC3IAOWNtaCIDaChfgXBMEZbQRByxCwk+BasgQRZLSYoLgDQbARxry8nyumPcVRKDfd0Aa8AsgDv1zp6pYd5jWOwhvebRTbzNNEw5BSsIpsj/kurQBnmk7sIFcCF5yyZPDRG6trQhujXYosaFoc+2f1MJ89uc76IND6F9BvlXUdpb6xwD2+4q3me3bysiHvtLYrUJto7PD/ve7LNHxSg/woN2kSz4txasBdhyiz3ugPGetTjm3XRokAAAAASUVORK5CYII=)\",\n      display   : 'none',\n      cursor    : 'pointer'\n    });\n\n    this.$buttons.css({\n      padding        : 5,\n      textAlign      : 'right',\n      borderTop      : '1px solid #ccc',\n      backgroundColor: '#fff'\n    });\n\n    this.$buttons.find('button').css({\n      marginLeft: 5\n    });\n\n    this.$buttons.find('button:first').css({\n      marginLeft: 0\n    });\n\n    this.$bar.on({\n      mouseenter: function () {\n        $(this).find('.noty_close').stop().fadeTo('normal', 1);\n      },\n      mouseleave: function () {\n        $(this).find('.noty_close').stop().fadeTo('normal', 0);\n      }\n    });\n\n    switch (this.options.layout.name) {\n      case 'top':\n        this.$bar.css({\n          borderBottom: '2px solid #eee',\n          borderLeft  : '2px solid #eee',\n          borderRight : '2px solid #eee',\n          borderTop   : '2px solid #eee',\n          boxShadow   : \"0 2px 4px rgba(0, 0, 0, 0.1)\"\n        });\n        break;\n      case 'topCenter':\n      case 'center':\n      case 'bottomCenter':\n      case 'inline':\n        this.$bar.css({\n          border   : '1px solid #eee',\n          boxShadow: \"0 2px 4px rgba(0, 0, 0, 0.1)\"\n        });\n        this.$message.css({textAlign: 'center'});\n        break;\n      case 'topLeft':\n      case 'topRight':\n      case 'bottomLeft':\n      case 'bottomRight':\n      case 'centerLeft':\n      case 'centerRight':\n        this.$bar.css({\n          border   : '1px solid #eee',\n          boxShadow: \"0 2px 4px rgba(0, 0, 0, 0.1)\"\n        });\n        this.$message.css({textAlign: 'left'});\n        break;\n      case 'bottom':\n        this.$bar.css({\n          borderTop   : '2px solid #eee',\n          borderLeft  : '2px solid #eee',\n          borderRight : '2px solid #eee',\n          borderBottom: '2px solid #eee',\n          boxShadow   : \"0 -2px 4px rgba(0, 0, 0, 0.1)\"\n        });\n        break;\n      default:\n        this.$bar.css({\n          border   : '2px solid #eee',\n          boxShadow: \"0 2px 4px rgba(0, 0, 0, 0.1)\"\n        });\n        break;\n    }\n\n    switch (this.options.type) {\n      case 'alert':\n      case 'notification':\n        this.$bar.css({backgroundColor: '#FFF', borderColor: '#dedede', color: '#444'});\n        break;\n      case 'warning':\n        this.$bar.css({backgroundColor: '#FFEAA8', borderColor: '#FFC237', color: '#826200'});\n        this.$buttons.css({borderTop: '1px solid #FFC237'});\n        break;\n      case 'error':\n        this.$bar.css({backgroundColor: '#FF8181', borderColor: '#e25353', color: '#FFF'});\n        this.$message.css({fontWeight: 'bold'});\n        this.$buttons.css({borderTop: '1px solid darkred'});\n        break;\n      case 'information':\n        this.$bar.css({backgroundColor: '#78C5E7', borderColor: '#3badd6', color: '#FFF'});\n        this.$buttons.css({borderTop: '1px solid #0B90C4'});\n        break;\n      case 'success':\n        this.$bar.css({backgroundColor: '#BCF5BC', borderColor: '#7cdd77', color: 'darkgreen'});\n        this.$buttons.css({borderTop: '1px solid #50C24E'});\n        break;\n      default:\n        this.$bar.css({backgroundColor: '#FFF', borderColor: '#CCC', color: '#444'});\n        break;\n    }\n  },\n  callback: {\n    onShow : function () {\n\n    },\n    onClose: function () {\n\n    }\n  }\n};\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/js/noty/themes/semanticUI.js",
    "content": "$.noty.themes.semanticUI = {\n  name: 'semanticUI',\n\n  template: '<div class=\"ui message\"><div class=\"content\"><div class=\"header\"></div></div></div>',\n\n  animation: {\n    open : {\n      animation: 'fade',\n      duration : '800ms'\n    },\n    close: {\n      animation: 'fade left',\n      duration : '800ms'\n    }\n  },\n\n  modal   : {\n    css: {\n      position       : 'fixed',\n      width          : '100%',\n      height         : '100%',\n      backgroundColor: '#000',\n      zIndex         : 10000,\n      opacity        : 0.6,\n      display        : 'none',\n      left           : 0,\n      top            : 0\n    }\n  },\n  style   : function () {\n    this.$message = this.$bar.find('.ui.message');\n\n    this.$message.find('.header').html(this.options.header);\n    this.$message.find('.content').append(this.options.text);\n\n    this.$bar.css({\n      margin  : '0.5em',\n      position: 'relative'\n    });\n\n    if (this.options.icon) {\n      this.$message.addClass('icon').prepend($('<i/>').addClass(this.options.icon));\n    }\n\n    this.$progressBar.css({\n      position       : 'absolute',\n      left           : 0,\n      bottom         : 0,\n      height         : 4,\n      width          : '100%',\n      backgroundColor: '#000000',\n      opacity        : 0.2,\n      '-ms-filter'   : 'progid:DXImageTransform.Microsoft.Alpha(Opacity=20)',\n      filter         : 'alpha(opacity=20)'\n    });\n\n    switch (this.options.size) {\n      case 'mini':\n        this.$message.addClass('mini');\n        break;\n      case 'tiny':\n        this.$message.addClass('tiny');\n        break;\n      case 'small':\n        this.$message.addClass('small');\n        break;\n      case 'large':\n        this.$message.addClass('large');\n        break;\n      case 'big':\n        this.$message.addClass('big');\n        break;\n      case 'huge':\n        this.$message.addClass('huge');\n        break;\n      case 'massive':\n        this.$message.addClass('massive');\n        break;\n    }\n\n    switch (this.options.type) {\n      case 'info':\n        this.$message.addClass('info');\n        break;\n      case 'warning':\n        this.$message.addClass('warning');\n        break;\n      case 'error':\n        this.$message.addClass('error');\n        break;\n      case 'negative':\n        this.$message.addClass('negative');\n        break;\n      case 'success':\n        this.$message.addClass('success');\n        break;\n      case 'positive':\n        this.$message.addClass('positive');\n        break;\n      case 'floating':\n        this.$message.addClass('floating');\n        break;\n    }\n  },\n  callback: {\n    onShow : function () {\n      // Enable transition\n      this.$bar.addClass('transition');\n      // Actual transition\n      this.$bar.transition(this.options.animation.open);\n    },\n    onClose: function () {\n      this.$bar.transition(this.options.animation.close);\n    }\n  }\n};\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/noty.jquery.json",
    "content": "{\n    \"name\"        : \"noty\",\n    \"version\"     : \"2.4.1\",\n    \"title\"       : \"noty - a jquery notification plugin\",\n    \"description\" : \"noty is a jQuery plugin that makes it easy to create alert - success - error - warning - information - confirmation messages as an alternative the standard alert dialog. Each notification is added to a queue. (Optional)\",\n    \"keywords\"    : [\"noty\", \"notification\", \"plugin\", \"jquery\", \"javascript\", \"alert\", \"error\", \"warning\", \"information\", \"confirmation\"],\n    \"homepage\"    : \"http://needim.github.com/noty\",\n    \"docs\"        : \"http://needim.github.com/noty\",\n    \"demo\"        : \"http://needim.github.com/noty\",\n    \"bugs\"        : \"https://github.com/needim/noty/v2/issues\",\n    \"download\"    : \"https://github.com/needim/noty/v2/archive/v2.2.0.zip\",\n    \"author\"      : {\n        \"name\": \"Nedim Arabacı\",\n        \"url\" : \"http://github.com/needim/\"\n    },\n    \"licenses\"    : [\n        {\n            \"type\": \"MIT\",\n            \"url\" : \"http://noty.mit-license.org/\"\n        }\n    ],\n    \"dependencies\": {\n        \"jquery\": \">=1.8\"\n    }\n}\n"
  },
  {
    "path": "docs/v2/vendor/noty-2.4.1/package.json",
    "content": "{\n\t\"name\": \"noty\",\n\t\"version\": \"2.4.1\",\n\t\"title\": \"noty - a jquery notification plugin\",\n\t\"description\": \"noty is a jQuery plugin that makes it easy to create alert - success - error - warning - information - confirmation messages as an alternative the standard alert dialog. Each notification is added to a queue. (Optional)\",\n\t\"homepage\": \"http://needim.github.com/noty\",\n\t\"author\": {\n\t\t\"name\": \"Nedim Arabacı\",\n\t\t\"url\": \"http://github.com/needim/\"\n\t},\n\t\"licenses\": [\n\t\t{\n\t\t\t\"type\": \"MIT\",\n\t\t\t\"url\": \"http://noty.mit-license.org/\"\n\t\t}\n\t],\n\t\"scripts\": {\n\t\t\"build\": \"grunt build\"\n\t},\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"git://github.com/needim/noty.git\"\n\t},\n\t\"main\": \"js/noty/packaged/jquery.noty.packaged.js\",\n\t\"dependencies\": {\n\t},\n\t\"devDependencies\": {\n\t\t\"grunt\": \"~1.0.0\",\n\t\t\"grunt-contrib-uglify\": \"~1.0.1\",\n\t\t\"grunt-contrib-concat\": \"~1.0.1\",\n\t\t\"grunt-bump\": \"0.8.0\",\n\t\t\"grunt-wrap\": \"^0.3.0\"\n\t}\n}\n"
  },
  {
    "path": "docs/v2/vendor/ps-icon-pack.css",
    "content": "@charset \"UTF-8\";\n\n@font-face {\n  font-family: \"prestashop-official-pack\";\n  src:url(\"../fonts/prestashop-official-pack.eot\");\n  src:url(\"../fonts/prestashop-official-pack.eot?#iefix\") format(\"embedded-opentype\"),\n    url(\"../fonts/prestashop-official-pack.woff\") format(\"woff\"),\n    url(\"../fonts/prestashop-official-pack.ttf\") format(\"truetype\"),\n    url(\"../fonts/prestashop-official-pack.svg#prestashop-official-pack\") format(\"svg\");\n  font-weight: normal;\n  font-style: normal;\n\n}\n\n[data-psicon]:before {\n  font-family: \"prestashop-official-pack\" !important;\n  content: attr(data-icon);\n  font-style: normal !important;\n  font-weight: normal !important;\n  font-variant: normal !important;\n  text-transform: none !important;\n  speak: none;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n[class^=\"ps-icon-\"]:before,\n[class*=\" ps-icon-\"]:before {\n  font-family: \"prestashop-official-pack\" !important;\n  font-style: normal !important;\n  font-weight: normal !important;\n  font-variant: normal !important;\n  text-transform: none !important;\n  speak: none;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n.ps-icon-aim:before {\n  content: \"a\";\n}\n.ps-icon-arto:before {\n  content: \"b\";\n}\n.ps-icon-aws:before {\n  content: \"c\";\n}\n.ps-icon-baidu:before {\n  content: \"d\";\n}\n.ps-icon-basecamp:before {\n  content: \"e\";\n}\n.ps-icon-bebo:before {\n  content: \"f\";\n}\n.ps-icon-behance:before {\n  content: \"g\";\n}\n.ps-icon-bing:before {\n  content: \"h\";\n}\n.ps-icon-blip:before {\n  content: \"i\";\n}\n.ps-icon-blogger:before {\n  content: \"j\";\n}\n.ps-icon-bnter:before {\n  content: \"k\";\n}\n.ps-icon-brightkite:before {\n  content: \"l\";\n}\n.ps-icon-cinch:before {\n  content: \"m\";\n}\n.ps-icon-cloudapp:before {\n  content: \"n\";\n}\n.ps-icon-coroflot:before {\n  content: \"o\";\n}\n.ps-icon-creative-commons:before {\n  content: \"p\";\n}\n.ps-icon-dailybooth:before {\n  content: \"q\";\n}\n.ps-icon-delicious:before {\n  content: \"r\";\n}\n.ps-icon-designbump:before {\n  content: \"s\";\n}\n.ps-icon-designfloat:before {\n  content: \"t\";\n}\n.ps-icon-designmoo:before {\n  content: \"u\";\n}\n.ps-icon-deviantart:before {\n  content: \"v\";\n}\n.ps-icon-digg:before {\n  content: \"w\";\n}\n.ps-icon-digg-alt:before {\n  content: \"x\";\n}\n.ps-icon-diigo:before {\n  content: \"y\";\n}\n.ps-icon-dribbble:before {\n  content: \"z\";\n}\n.ps-icon-dropbox:before {\n  content: \"A\";\n}\n.ps-icon-drupal:before {\n  content: \"B\";\n}\n.ps-icon-dzone:before {\n  content: \"C\";\n}\n.ps-icon-ebay:before {\n  content: \"D\";\n}\n.ps-icon-ember:before {\n  content: \"E\";\n}\n.ps-icon-etsy:before {\n  content: \"F\";\n}\n.ps-icon-evernote:before {\n  content: \"G\";\n}\n.ps-icon-facebook:before {\n  content: \"H\";\n}\n.ps-icon-facebook-alt:before {\n  content: \"I\";\n}\n.ps-icon-facebook-places:before {\n  content: \"J\";\n}\n.ps-icon-facto:before {\n  content: \"K\";\n}\n.ps-icon-feedburner:before {\n  content: \"L\";\n}\n.ps-icon-flickr:before {\n  content: \"M\";\n}\n.ps-icon-folkd:before {\n  content: \"N\";\n}\n.ps-icon-formspring:before {\n  content: \"O\";\n}\n.ps-icon-forrst:before {\n  content: \"P\";\n}\n.ps-icon-foursquare:before {\n  content: \"Q\";\n}\n.ps-icon-friendfeed:before {\n  content: \"R\";\n}\n.ps-icon-friendster:before {\n  content: \"S\";\n}\n.ps-icon-gdgt:before {\n  content: \"T\";\n}\n.ps-icon-github:before {\n  content: \"U\";\n}\n.ps-icon-github-alt:before {\n  content: \"V\";\n}\n.ps-icon-goodreads:before {\n  content: \"W\";\n}\n.ps-icon-google:before {\n  content: \"X\";\n}\n.ps-icon-google-buzz:before {\n  content: \"Y\";\n}\n.ps-icon-google-talk:before {\n  content: \"Z\";\n}\n.ps-icon-gowalla:before {\n  content: \"0\";\n}\n.ps-icon-gowalla-alt:before {\n  content: \"1\";\n}\n.ps-icon-grooveshark:before {\n  content: \"2\";\n}\n.ps-icon-hacker-news:before {\n  content: \"3\";\n}\n.ps-icon-hi5:before {\n  content: \"4\";\n}\n.ps-icon-hype-machine:before {\n  content: \"5\";\n}\n.ps-icon-hyves:before {\n  content: \"6\";\n}\n.ps-icon-icq:before {\n  content: \"7\";\n}\n.ps-icon-identi:before {\n  content: \"8\";\n}\n.ps-icon-instapaper:before {\n  content: \"9\";\n}\n.ps-icon-itunes:before {\n  content: \"!\";\n}\n.ps-icon-kik:before {\n  content: \"\\\"\";\n}\n.ps-icon-krop:before {\n  content: \"#\";\n}\n.ps-icon-last:before {\n  content: \"$\";\n}\n.ps-icon-linkedin:before {\n  content: \"%\";\n}\n.ps-icon-linkedin-alt:before {\n  content: \"&\";\n}\n.ps-icon-livejournal:before {\n  content: \"'\";\n}\n.ps-icon-lovedsgn:before {\n  content: \"(\";\n}\n.ps-icon-meetup:before {\n  content: \")\";\n}\n.ps-icon-metacafe:before {\n  content: \"*\";\n}\n.ps-icon-ming:before {\n  content: \"+\";\n}\n.ps-icon-mister-wong:before {\n  content: \",\";\n}\n.ps-icon-mixx:before {\n  content: \"-\";\n}\n.ps-icon-mixx-alt:before {\n  content: \".\";\n}\n.ps-icon-mobileme:before {\n  content: \"/\";\n}\n.ps-icon-msn-messenger:before {\n  content: \":\";\n}\n.ps-icon-myspace:before {\n  content: \";\";\n}\n.ps-icon-myspace-alt:before {\n  content: \"<\";\n}\n.ps-icon-newsvine:before {\n  content: \"=\";\n}\n.ps-icon-official:before {\n  content: \">\";\n}\n.ps-icon-openid:before {\n  content: \"?\";\n}\n.ps-icon-orkut:before {\n  content: \"@\";\n}\n.ps-icon-pandora:before {\n  content: \"[\";\n}\n.ps-icon-path:before {\n  content: \"]\";\n}\n.ps-icon-paypal:before {\n  content: \"^\";\n}\n.ps-icon-photobucket:before {\n  content: \"_\";\n}\n.ps-icon-picasa:before {\n  content: \"`\";\n}\n.ps-icon-picassa:before {\n  content: \"{\";\n}\n.ps-icon-pinboard:before {\n  content: \"|\";\n}\n.ps-icon-ping:before {\n  content: \"}\";\n}\n.ps-icon-pingchat:before {\n  content: \"~\";\n}\n.ps-icon-playstation:before {\n  content: \"\\\\\";\n}\n.ps-icon-plixi:before {\n  content: \"\\e000\";\n}\n.ps-icon-plurk:before {\n  content: \"\\e001\";\n}\n.ps-icon-podcast:before {\n  content: \"\\e002\";\n}\n.ps-icon-posterous:before {\n  content: \"\\e003\";\n}\n.ps-icon-qik:before {\n  content: \"\\e004\";\n}\n.ps-icon-quik:before {\n  content: \"\\e005\";\n}\n.ps-icon-quora:before {\n  content: \"\\e006\";\n}\n.ps-icon-rdio:before {\n  content: \"\\e007\";\n}\n.ps-icon-readernaut:before {\n  content: \"\\e008\";\n}\n.ps-icon-reddit:before {\n  content: \"\\e009\";\n}\n.ps-icon-retweet:before {\n  content: \"\\e00a\";\n}\n.ps-icon-robo:before {\n  content: \"\\e00b\";\n}\n.ps-icon-rss:before {\n  content: \"\\e00c\";\n}\n.ps-icon-scribd:before {\n  content: \"\\e00d\";\n}\n.ps-icon-sharethis:before {\n  content: \"\\e00e\";\n}\n.ps-icon-simplenote:before {\n  content: \"\\e00f\";\n}\n.ps-icon-skype:before {\n  content: \"\\e010\";\n}\n.ps-icon-slashdot:before {\n  content: \"\\e011\";\n}\n.ps-icon-slideshare:before {\n  content: \"\\e012\";\n}\n.ps-icon-smugmug:before {\n  content: \"\\e013\";\n}\n.ps-icon-soundcloud:before {\n  content: \"\\e014\";\n}\n.ps-icon-spotify:before {\n  content: \"\\e015\";\n}\n.ps-icon-squarespace:before {\n  content: \"\\e016\";\n}\n.ps-icon-squidoo:before {\n  content: \"\\e017\";\n}\n.ps-icon-steam:before {\n  content: \"\\e018\";\n}\n.ps-icon-stumbleupon:before {\n  content: \"\\e019\";\n}\n.ps-icon-technorati:before {\n  content: \"\\e01a\";\n}\n.ps-icon-threewords:before {\n  content: \"\\e01b\";\n}\n.ps-icon-tribe:before {\n  content: \"\\e01c\";\n}\n.ps-icon-tripit:before {\n  content: \"\\e01d\";\n}\n.ps-icon-tumblr:before {\n  content: \"\\e01e\";\n}\n.ps-icon-twitter:before {\n  content: \"\\e01f\";\n}\n.ps-icon-twitter-alt:before {\n  content: \"\\e020\";\n}\n.ps-icon-vcard:before {\n  content: \"\\e021\";\n}\n.ps-icon-viddler:before {\n  content: \"\\e022\";\n}\n.ps-icon-vimeo:before {\n  content: \"\\e023\";\n}\n.ps-icon-virb:before {\n  content: \"\\e024\";\n}\n.ps-icon-w3:before {\n  content: \"\\e025\";\n}\n.ps-icon-whatsapp:before {\n  content: \"\\e026\";\n}\n.ps-icon-wikipedia:before {\n  content: \"\\e027\";\n}\n.ps-icon-windows:before {\n  content: \"\\e028\";\n}\n.ps-icon-wists:before {\n  content: \"\\e029\";\n}\n.ps-icon-wordpress:before {\n  content: \"\\e02a\";\n}\n.ps-icon-wordpress-alt:before {\n  content: \"\\e02b\";\n}\n.ps-icon-xing:before {\n  content: \"\\e02c\";\n}\n.ps-icon-yahoo:before {\n  content: \"\\e02d\";\n}\n.ps-icon-yahoo-buzz:before {\n  content: \"\\e02e\";\n}\n.ps-icon-yahoo-messenger:before {\n  content: \"\\e02f\";\n}\n.ps-icon-yelp:before {\n  content: \"\\e030\";\n}\n.ps-icon-youtube:before {\n  content: \"\\e031\";\n}\n.ps-icon-youtube-alt:before {\n  content: \"\\e032\";\n}\n.ps-icon-zerply:before {\n  content: \"\\e033\";\n}\n.ps-icon-zootool:before {\n  content: \"\\e034\";\n}\n.ps-icon-zynga:before {\n  content: \"\\e035\";\n}\n.ps-icon-aim-alt:before {\n  content: \"\\e036\";\n}\n.ps-icon-amazon:before {\n  content: \"\\e037\";\n}\n.ps-icon-app-store:before {\n  content: \"\\e038\";\n}\n.ps-icon-apple:before {\n  content: \"\\e039\";\n}\n.ps-icon-girl:before {\n  content: \"\\e03a\";\n}\n.ps-icon-girl-sad:before {\n  content: \"\\e03b\";\n}\n.ps-icon-girl-confused:before {\n  content: \"\\e03c\";\n}\n.ps-icon-bank-safe:before {\n  content: \"\\e03d\";\n}\n.ps-icon-shopping-cart:before {\n  content: \"\\e03e\";\n}\n.ps-icon-blaster:before {\n  content: \"\\e03f\";\n}\n.ps-icon-helm:before {\n  content: \"\\e040\";\n}\n.ps-icon-boiled-egg:before {\n  content: \"\\e041\";\n}\n.ps-icon-boiled-egg-finger:before {\n  content: \"\\e042\";\n}\n.ps-icon-cart:before {\n  content: \"\\e043\";\n}\n.ps-icon-coin:before {\n  content: \"\\e044\";\n}\n.ps-icon-coins:before {\n  content: \"\\e045\";\n}\n.ps-icon-couple:before {\n  content: \"\\e046\";\n}\n.ps-icon-credit-card:before {\n  content: \"\\e047\";\n}\n.ps-icon-crown:before {\n  content: \"\\e048\";\n}\n.ps-icon-daft-punk:before {\n  content: \"\\e049\";\n}\n.ps-icon-dollar-bill:before {\n  content: \"\\e04a\";\n}\n.ps-icon-dollars:before {\n  content: \"\\e04b\";\n}\n.ps-icon-music:before {\n  content: \"\\e04c\";\n}\n.ps-icon-headphones:before {\n  content: \"\\e04d\";\n}\n.ps-icon-headset:before {\n  content: \"\\e04e\";\n}\n.ps-icon-egg:before {\n  content: \"\\e04f\";\n}\n.ps-icon-fried-egg:before {\n  content: \"\\e050\";\n}\n.ps-icon-euro-bill:before {\n  content: \"\\e051\";\n}\n.ps-icon-extinguisher:before {\n  content: \"\\e052\";\n}\n.ps-icon-fuck:before {\n  content: \"\\e053\";\n}\n.ps-icon-full-screen:before {\n  content: \"\\e054\";\n}\n.ps-icon-gamepad:before {\n  content: \"\\e055\";\n}\n.ps-icon-girl-2:before {\n  content: \"\\e056\";\n}\n.ps-icon-girl-angel:before {\n  content: \"\\e057\";\n}\n.ps-icon-girl-angry:before {\n  content: \"\\e058\";\n}\n.ps-icon-girl-big-smile:before {\n  content: \"\\e059\";\n}\n.ps-icon-girl-cry:before {\n  content: \"\\e05a\";\n}\n.ps-icon-girl-flushed:before {\n  content: \"\\e05b\";\n}\n.ps-icon-girl-open-mouth:before {\n  content: \"\\e05c\";\n}\n.ps-icon-girl-sleep:before {\n  content: \"\\e05d\";\n}\n.ps-icon-girl-smile:before {\n  content: \"\\e05e\";\n}\n.ps-icon-girl-user:before {\n  content: \"\\e05f\";\n}\n.ps-icon-guy:before {\n  content: \"\\e060\";\n}\n.ps-icon-guy-angel:before {\n  content: \"\\e061\";\n}\n.ps-icon-guy-angry:before {\n  content: \"\\e062\";\n}\n.ps-icon-guy-big-smile:before {\n  content: \"\\e063\";\n}\n.ps-icon-guy-confused:before {\n  content: \"\\e064\";\n}\n.ps-icon-guy-cry:before {\n  content: \"\\e065\";\n}\n.ps-icon-guy-flushed:before {\n  content: \"\\e066\";\n}\n.ps-icon-guy-happy:before {\n  content: \"\\e067\";\n}\n.ps-icon-guy-o-mouth:before {\n  content: \"\\e068\";\n}\n.ps-icon-girl-o-mouth:before {\n  content: \"\\e069\";\n}\n.ps-icon-guy-open-mouth:before {\n  content: \"\\e06a\";\n}\n.ps-icon-guy-sad:before {\n  content: \"\\e06b\";\n}\n.ps-icon-guy-sleep:before {\n  content: \"\\e06c\";\n}\n.ps-icon-guy-smile:before {\n  content: \"\\e06d\";\n}\n.ps-icon-guy-user:before {\n  content: \"\\e06e\";\n}\n.ps-icon-guy-wrong:before {\n  content: \"\\e06f\";\n}\n.ps-icon-hand:before {\n  content: \"\\e070\";\n}\n.ps-icon-hand-pointer-left:before {\n  content: \"\\e071\";\n}\n.ps-icon-hand-pointer-right:before {\n  content: \"\\e072\";\n}\n.ps-icon-hand-pointer-top:before {\n  content: \"\\e073\";\n}\n.ps-icon-mayo-hotdog:before {\n  content: \"\\e074\";\n}\n.ps-icon-hotdog:before {\n  content: \"\\e075\";\n}\n.ps-icon-hungry:before {\n  content: \"\\e076\";\n}\n.ps-icon-enlarge:before {\n  content: \"\\e077\";\n}\n.ps-icon-laptop:before {\n  content: \"\\e078\";\n}\n.ps-icon-mail:before {\n  content: \"\\e079\";\n}\n.ps-icon-mail-back:before {\n  content: \"\\e07a\";\n}\n.ps-icon-mail-bill:before {\n  content: \"\\e07b\";\n}\n.ps-icon-mail-stamp:before {\n  content: \"\\e07c\";\n}\n.ps-icon-moon:before {\n  content: \"\\e07d\";\n}\n.ps-icon-music-score:before {\n  content: \"\\e07e\";\n}\n.ps-icon-open-padlock:before {\n  content: \"\\e07f\";\n}\n.ps-icon-organisation:before {\n  content: \"\\e080\";\n}\n.ps-icon-padlock:before {\n  content: \"\\e081\";\n}\n.ps-icon-paper-tablet:before {\n  content: \"\\e082\";\n}\n.ps-icon-pdiddy:before {\n  content: \"\\e083\";\n}\n.ps-icon-people-team:before {\n  content: \"\\e084\";\n}\n.ps-icon-piggy-bank:before {\n  content: \"\\e085\";\n}\n.ps-icon-piggy-bank-coins:before {\n  content: \"\\e086\";\n}\n.ps-icon-power:before {\n  content: \"\\e087\";\n}\n.ps-icon-printer:before {\n  content: \"\\e088\";\n}\n.ps-icon-promo:before {\n  content: \"\\e089\";\n}\n.ps-icon-puzzle:before {\n  content: \"\\e08a\";\n}\n.ps-icon-resize:before {\n  content: \"\\e08b\";\n}\n.ps-icon-road:before {\n  content: \"\\e08c\";\n}\n.ps-icon-rss-icon:before {\n  content: \"\\e08d\";\n}\n.ps-icon-safe:before {\n  content: \"\\e08e\";\n}\n.ps-icon-sale-tag:before {\n  content: \"\\e08f\";\n}\n.ps-icon-save:before {\n  content: \"\\e090\";\n}\n.ps-icon-shield:before {\n  content: \"\\e091\";\n}\n.ps-icon-store:before {\n  content: \"\\e092\";\n}\n.ps-icon-sign:before {\n  content: \"\\e093\";\n}\n.ps-icon-sreenshot:before {\n  content: \"\\e094\";\n}\n.ps-icon-sun:before {\n  content: \"\\e095\";\n}\n.ps-icon-cart-supermarket:before {\n  content: \"\\e096\";\n}\n.ps-icon-tag:before {\n  content: \"\\e097\";\n}\n.ps-icon-token:before {\n  content: \"\\e098\";\n}\n.ps-icon-delete:before {\n  content: \"\\e099\";\n}\n.ps-icon-user:before {\n  content: \"\\e09a\";\n}\n.ps-icon-wallet:before {\n  content: \"\\e09b\";\n}\n.ps-icon-watch:before {\n  content: \"\\e09c\";\n}\n.ps-icon-30-80:before {\n  content: \"\\e09d\";\n}\n.ps-icon-40-105:before {\n  content: \"\\e09e\";\n}\n.ps-icon-50-120:before {\n  content: \"\\e09f\";\n}\n.ps-icon-60-140:before {\n  content: \"\\e0a0\";\n}\n.ps-icon-70-160:before {\n  content: \"\\e0a1\";\n}\n.ps-icon-95-200:before {\n  content: \"\\e0a2\";\n}\n.ps-icon-airplane:before {\n  content: \"\\e0a3\";\n}\n.ps-icon-any-solvent:before {\n  content: \"\\e0a4\";\n}\n.ps-icon-any-solvent-without-tetrachlorethylene:before {\n  content: \"\\e0a5\";\n}\n.ps-icon-attachment:before {\n  content: \"\\e0a6\";\n}\n.ps-icon-warning:before {\n  content: \"\\e0a7\";\n}\n.ps-icon-barrel:before {\n  content: \"\\e0a8\";\n}\n.ps-icon-bike:before {\n  content: \"\\e0a9\";\n}\n.ps-icon-triangle:before {\n  content: \"\\e0aa\";\n}\n.ps-icon-broken-link:before {\n  content: \"\\e0ab\";\n}\n.ps-icon-bubble:before {\n  content: \"\\e0ac\";\n}\n.ps-icon-prison-school-bus:before {\n  content: \"\\e0ad\";\n}\n.ps-icon-car:before {\n  content: \"\\e0ae\";\n}\n.ps-icon-cocktail:before {\n  content: \"\\e0af\";\n}\n.ps-icon-do-not-bleach:before {\n  content: \"\\e0b0\";\n}\n.ps-icon-do-not-dry:before {\n  content: \"\\e0b1\";\n}\n.ps-icon-do-not-iron:before {\n  content: \"\\e0b2\";\n}\n.ps-icon-do-not-wash:before {\n  content: \"\\e0b3\";\n}\n.ps-icon-do-not-wring:before {\n  content: \"\\e0b4\";\n}\n.ps-icon-double-arrow:before {\n  content: \"\\e0b5\";\n}\n.ps-icon-drip-dry:before {\n  content: \"\\e0b6\";\n}\n.ps-icon-drop:before {\n  content: \"\\e0b7\";\n}\n.ps-icon-dry:before {\n  content: \"\\e0b8\";\n}\n.ps-icon-dry-flat:before {\n  content: \"\\e0b9\";\n}\n.ps-icon-dry-in-the-shade:before {\n  content: \"\\e0ba\";\n}\n.ps-icon-dry-normal-hight-heat:before {\n  content: \"\\e0bb\";\n}\n.ps-icon-dry-normal-low-heat:before {\n  content: \"\\e0bc\";\n}\n.ps-icon-heat:before {\n  content: \"\\e0bd\";\n}\n.ps-icon-dry-normal-no-heat:before {\n  content: \"\\e0be\";\n}\n.ps-icon-eject:before {\n  content: \"\\e0bf\";\n}\n.ps-icon-switch:before {\n  content: \"\\e0c0\";\n}\n.ps-icon-film:before {\n  content: \"\\e0c1\";\n}\n.ps-icon-apps:before {\n  content: \"\\e0c2\";\n}\n.ps-icon-gun:before {\n  content: \"\\e0c3\";\n}\n.ps-icon-hand-wash:before {\n  content: \"\\e0c4\";\n}\n.ps-icon-disabled:before {\n  content: \"\\e0c5\";\n}\n.ps-icon-hang-to-dry:before {\n  content: \"\\e0c6\";\n}\n.ps-icon-hard-drive:before {\n  content: \"\\e0c7\";\n}\n.ps-icon-hourglass:before {\n  content: \"\\e0c8\";\n}\n.ps-icon-important:before {\n  content: \"\\e0c9\";\n}\n.ps-icon-iron-any-temp:before {\n  content: \"\\e0ca\";\n}\n.ps-icon-justice:before {\n  content: \"\\e0cb\";\n}\n.ps-icon-keyboard:before {\n  content: \"\\e0cc\";\n}\n.ps-icon-link:before {\n  content: \"\\e0cd\";\n}\n.ps-icon-branch:before {\n  content: \"\\e0ce\";\n}\n.ps-icon-liquor:before {\n  content: \"\\e0cf\";\n}\n.ps-icon-bus-london:before {\n  content: \"\\e0d0\";\n}\n.ps-icon-machine-wash:before {\n  content: \"\\e0d1\";\n}\n.ps-icon-machine-wash-gentle-or-delicate:before {\n  content: \"\\e0d2\";\n}\n.ps-icon-machine-wash-permanent-press:before {\n  content: \"\\e0d3\";\n}\n.ps-icon-wand:before {\n  content: \"\\e0d4\";\n}\n.ps-icon-magnifying-glass:before {\n  content: \"\\e0d5\";\n}\n.ps-icon-maximum-temp-110-230:before {\n  content: \"\\e0d6\";\n}\n.ps-icon-maximum-temp-150-300:before {\n  content: \"\\e0d7\";\n}\n.ps-icon-maximum-temp-200-390:before {\n  content: \"\\e0d8\";\n}\n.ps-icon-megaphone:before {\n  content: \"\\e0d9\";\n}\n.ps-icon-man:before {\n  content: \"\\e0da\";\n}\n.ps-icon-mic:before {\n  content: \"\\e0db\";\n}\n.ps-icon-mic-off:before {\n  content: \"\\e0dc\";\n}\n.ps-icon-next:before {\n  content: \"\\e0dd\";\n}\n.ps-icon-non-chlorine-bleach-if-needed:before {\n  content: \"\\e0de\";\n}\n.ps-icon-penknife:before {\n  content: \"\\e0df\";\n}\n.ps-icon-petroleum-solvent-steam:before {\n  content: \"\\e0e0\";\n}\n.ps-icon-phone:before {\n  content: \"\\e0e1\";\n}\n.ps-icon-piano:before {\n  content: \"\\e0e2\";\n}\n.ps-icon-pin:before {\n  content: \"\\e0e3\";\n}\n.ps-icon-filter:before {\n  content: \"\\e0e4\";\n}\n.ps-icon-plane:before {\n  content: \"\\e0e5\";\n}\n.ps-icon-previous:before {\n  content: \"\\e0e6\";\n}\n.ps-icon-quote:before {\n  content: \"\\e0e7\";\n}\n.ps-icon-retweet-1:before {\n  content: \"\\e0e8\";\n}\n.ps-icon-sound:before {\n  content: \"\\e0e9\";\n}\n.ps-icon-sound-down:before {\n  content: \"\\e0ea\";\n}\n.ps-icon-sound-level-one:before {\n  content: \"\\e0eb\";\n}\n.ps-icon-sound-level-two:before {\n  content: \"\\e0ec\";\n}\n.ps-icon-sound-plus:before {\n  content: \"\\e0ed\";\n}\n.ps-icon-stethoscope:before {\n  content: \"\\e0ee\";\n}\n.ps-icon-suitcase:before {\n  content: \"\\e0ef\";\n}\n.ps-icon-target:before {\n  content: \"\\e0f0\";\n}\n.ps-icon-ticket:before {\n  content: \"\\e0f1\";\n}\n.ps-icon-trophy:before {\n  content: \"\\e0f2\";\n}\n.ps-icon-tumble-dry:before {\n  content: \"\\e0f3\";\n}\n.ps-icon-ufo:before {\n  content: \"\\e0f4\";\n}\n.ps-icon-video-camera:before {\n  content: \"\\e0f5\";\n}\n.ps-icon-truck-1:before {\n  content: \"\\e0f6\";\n}\n.ps-icon-water-temperature-30:before {\n  content: \"\\e0f7\";\n}\n.ps-icon-water-temperature-40:before {\n  content: \"\\e0f8\";\n}\n.ps-icon-water-temperature-50:before {\n  content: \"\\e0f9\";\n}\n.ps-icon-water-temperature-60:before {\n  content: \"\\e0fa\";\n}\n.ps-icon-water-temperature-70:before {\n  content: \"\\e0fb\";\n}\n.ps-icon-water-temperature-95:before {\n  content: \"\\e0fc\";\n}\n.ps-icon-clothes-water:before {\n  content: \"\\e0fd\";\n}\n.ps-icon-woman:before {\n  content: \"\\e0fe\";\n}\n.ps-icon-zoom-in:before {\n  content: \"\\e0ff\";\n}\n.ps-icon-zoom-out:before {\n  content: \"\\e100\";\n}\n.ps-icon-anchor:before {\n  content: \"\\e101\";\n}\n.ps-icon-left:before {\n  content: \"\\e102\";\n}\n.ps-icon-right:before {\n  content: \"\\e103\";\n}\n.ps-icon-up:before {\n  content: \"\\e104\";\n}\n.ps-icon-down:before {\n  content: \"\\e105\";\n}\n.ps-icon-play:before {\n  content: \"\\e106\";\n}\n.ps-icon-forward:before {\n  content: \"\\e107\";\n}\n.ps-icon-rewind:before {\n  content: \"\\e108\";\n}\n.ps-icon-forbidden:before {\n  content: \"\\e109\";\n}\n.ps-icon-stats:before {\n  content: \"\\e10a\";\n}\n.ps-icon-bar-code:before {\n  content: \"\\e10b\";\n}\n.ps-icon-lab:before {\n  content: \"\\e10c\";\n}\n.ps-icon-beer:before {\n  content: \"\\e10d\";\n}\n.ps-icon-bell:before {\n  content: \"\\e10e\";\n}\n.ps-icon-book-tag:before {\n  content: \"\\e10f\";\n}\n.ps-icon-minus-circle-1:before {\n  content: \"\\e110\";\n}\n.ps-icon-plus-box:before {\n  content: \"\\e111\";\n}\n.ps-icon-minus-box:before {\n  content: \"\\e112\";\n}\n.ps-icon-plus:before {\n  content: \"\\e113\";\n}\n.ps-icon-minus:before {\n  content: \"\\e114\";\n}\n.ps-icon-arrow-right:before {\n  content: \"\\e115\";\n}\n.ps-icon-down-arrow-circle:before {\n  content: \"\\e116\";\n}\n.ps-icon-up-arrow-circle:before {\n  content: \"\\e117\";\n}\n.ps-icon-right-arrow-circle:before {\n  content: \"\\e118\";\n}\n.ps-icon-left-arrow-circle:before {\n  content: \"\\e119\";\n}\n.ps-icon-contrast:before {\n  content: \"\\e11a\";\n}\n.ps-icon-align-justified:before {\n  content: \"\\e11b\";\n}\n.ps-icon-align-right:before {\n  content: \"\\e11c\";\n}\n.ps-icon-align-left:before {\n  content: \"\\e11d\";\n}\n.ps-icon-minus-circle:before {\n  content: \"\\e11e\";\n}\n.ps-icon-book:before {\n  content: \"\\e11f\";\n}\n.ps-icon-label-hogwarts:before {\n  content: \"\\e120\";\n}\n.ps-icon-label:before {\n  content: \"\\e121\";\n}\n.ps-icon-leaf:before {\n  content: \"\\e122\";\n}\n.ps-icon-work-case:before {\n  content: \"\\e123\";\n}\n.ps-icon-bug:before {\n  content: \"\\e124\";\n}\n.ps-icon-building:before {\n  content: \"\\e125\";\n}\n.ps-icon-calendar:before {\n  content: \"\\e126\";\n}\n.ps-icon-calendar-grid:before {\n  content: \"\\e127\";\n}\n.ps-icon-align-centered:before {\n  content: \"\\e128\";\n}\n.ps-icon-camera:before {\n  content: \"\\e129\";\n}\n.ps-icon-check-box-empty:before {\n  content: \"\\e12a\";\n}\n.ps-icon-check-box:before {\n  content: \"\\e12b\";\n}\n.ps-icon-radio-empty:before {\n  content: \"\\e12c\";\n}\n.ps-icon-radio:before {\n  content: \"\\e12d\";\n}\n.ps-icon-coffee:before {\n  content: \"\\e12e\";\n}\n.ps-icon-coffee-hot:before {\n  content: \"\\e12f\";\n}\n.ps-icon-compass:before {\n  content: \"\\e130\";\n}\n.ps-icon-bull-right:before {\n  content: \"\\e131\";\n}\n.ps-icon-bull-left:before {\n  content: \"\\e132\";\n}\n.ps-icon-chat-alt:before {\n  content: \"\\e133\";\n}\n.ps-icon-chat:before {\n  content: \"\\e134\";\n}\n.ps-icon-code:before {\n  content: \"\\e135\";\n}\n.ps-icon-flag-corner:before {\n  content: \"\\e136\";\n}\n.ps-icon-flag-scout:before {\n  content: \"\\e137\";\n}\n.ps-icon-flag:before {\n  content: \"\\e138\";\n}\n.ps-icon-row-setting:before {\n  content: \"\\e139\";\n}\n.ps-icon-copy:before {\n  content: \"\\e13a\";\n}\n.ps-icon-file:before {\n  content: \"\\e13b\";\n}\n.ps-icon-crop:before {\n  content: \"\\e13c\";\n}\n.ps-icon-iphone:before {\n  content: \"\\e13d\";\n}\n.ps-icon-ipad:before {\n  content: \"\\e13e\";\n}\n.ps-icon-mac:before {\n  content: \"\\e13f\";\n}\n.ps-icon-random:before {\n  content: \"\\e140\";\n}\n.ps-icon-arrow-box:before {\n  content: \"\\e141\";\n}\n.ps-icon-scissors:before {\n  content: \"\\e142\";\n}\n.ps-icon-dashboard:before {\n  content: \"\\e143\";\n}\n.ps-icon-world:before {\n  content: \"\\e144\";\n}\n.ps-icon-download:before {\n  content: \"\\e145\";\n}\n.ps-icon-upload:before {\n  content: \"\\e146\";\n}\n.ps-icon-fire:before {\n  content: \"\\e147\";\n}\n.ps-icon-eye:before {\n  content: \"\\e148\";\n}\n.ps-icon-no-eye:before {\n  content: \"\\e149\";\n}\n.ps-icon-folder:before {\n  content: \"\\e14a\";\n}\n.ps-icon-clock:before {\n  content: \"\\e14b\";\n}\n.ps-icon-mouse:before {\n  content: \"\\e14c\";\n}\n.ps-icon-backpack:before {\n  content: \"\\e14d\";\n}\n.ps-icon-ipod:before {\n  content: \"\\e14e\";\n}\n.ps-icon-iwatch:before {\n  content: \"\\e14f\";\n}\n.ps-icon-battery:before {\n  content: \"\\e150\";\n}\n.ps-icon-battery-charge:before {\n  content: \"\\e151\";\n}\n.ps-icon-lightning:before {\n  content: \"\\e152\";\n}\n.ps-icon-image:before {\n  content: \"\\e153\";\n}\n.ps-icon-gift:before {\n  content: \"\\e154\";\n}\n.ps-icon-cutlery:before {\n  content: \"\\e155\";\n}\n.ps-icon-pen:before {\n  content: \"\\e156\";\n}\n.ps-icon-archive:before {\n  content: \"\\e157\";\n}\n.ps-icon-arrow-down:before {\n  content: \"\\e158\";\n}\n.ps-icon-arrow-left:before {\n  content: \"\\e159\";\n}\n.ps-icon-arrow-up:before {\n  content: \"\\e15a\";\n}\n.ps-icon-asterisk:before {\n  content: \"\\e15b\";\n}\n.ps-icon-browser:before {\n  content: \"\\e15c\";\n}\n.ps-icon-check:before {\n  content: \"\\e15d\";\n}\n.ps-icon-cloud:before {\n  content: \"\\e15e\";\n}\n.ps-icon-download-from-cloud:before {\n  content: \"\\e15f\";\n}\n.ps-icon-upload-to-cloud:before {\n  content: \"\\e160\";\n}\n.ps-icon-checked:before {\n  content: \"\\e161\";\n}\n.ps-icon-ambulance:before {\n  content: \"\\e162\";\n}\n.ps-icon-mailbox:before {\n  content: \"\\e163\";\n}\n.ps-icon-plus-circle:before {\n  content: \"\\e164\";\n}\n.ps-icon-truck:before {\n  content: \"\\e165\";\n}\n.ps-icon-girl-sad-hunappy:before {\n  content: \"\\e166\";\n}\n.ps-icon-spades-card:before {\n  content: \"\\e167\";\n}\n.ps-icon-diamonds-card:before {\n  content: \"\\e168\";\n}\n.ps-icon-clubs-card:before {\n  content: \"\\e169\";\n}\n.ps-icon-hearts-card:before {\n  content: \"\\e16a\";\n}\n.ps-icon-pull:before {\n  content: \"\\e16b\";\n}\n.ps-icon-pant:before {\n  content: \"\\e16c\";\n}\n.ps-icon-data-board:before {\n  content: \"\\e16d\";\n}\n.ps-icon-board:before {\n  content: \"\\e16e\";\n}\n.ps-icon-shoe:before {\n  content: \"\\e16f\";\n}\n.ps-icon-globe:before {\n  content: \"\\e170\";\n}\n.ps-icon-pin-map:before {\n  content: \"\\e171\";\n}\n.ps-icon-bonnet:before {\n  content: \"\\e172\";\n}\n.ps-icon-contact:before {\n  content: \"\\e173\";\n}\n.ps-icon-fish:before {\n  content: \"\\e174\";\n}\n.ps-icon-cookie:before {\n  content: \"\\e175\";\n}\n.ps-icon-pizza:before {\n  content: \"\\e176\";\n}\n.ps-icon-birthday:before {\n  content: \"\\e177\";\n}\n.ps-icon-pc:before {\n  content: \"\\e178\";\n}\n.ps-icon-ram:before {\n  content: \"\\e179\";\n}\n.ps-icon-cpu:before {\n  content: \"\\e17a\";\n}\n.ps-icon-milkshake:before {\n  content: \"\\e17b\";\n}\n.ps-icon-tacos:before {\n  content: \"\\e17c\";\n}\n.ps-icon-burger:before {\n  content: \"\\e17d\";\n}\n.ps-icon-home:before {\n  content: \"\\e17e\";\n}\n.ps-icon-lego:before {\n  content: \"\\e17f\";\n}\n.ps-icon-preston:before {\n  content: \"\\e180\";\n}\n"
  },
  {
    "path": "docs/v2/vendor/showdown/showdown.js",
    "content": ";/*! showdown 21-12-2016 */\r\n(function(){\r\n/**\n * Created by Tivie on 13-07-2015.\n */\n\nfunction getDefaultOpts(simple) {\n  'use strict';\n\n  var defaultOptions = {\n    omitExtraWLInCodeBlocks: {\n      defaultValue: false,\n      describe: 'Omit the default extra whiteline added to code blocks',\n      type: 'boolean'\n    },\n    noHeaderId: {\n      defaultValue: false,\n      describe: 'Turn on/off generated header id',\n      type: 'boolean'\n    },\n    prefixHeaderId: {\n      defaultValue: false,\n      describe: 'Specify a prefix to generated header ids',\n      type: 'string'\n    },\n    headerLevelStart: {\n      defaultValue: false,\n      describe: 'The header blocks level start',\n      type: 'integer'\n    },\n    parseImgDimensions: {\n      defaultValue: false,\n      describe: 'Turn on/off image dimension parsing',\n      type: 'boolean'\n    },\n    simplifiedAutoLink: {\n      defaultValue: false,\n      describe: 'Turn on/off GFM autolink style',\n      type: 'boolean'\n    },\n    excludeTrailingPunctuationFromURLs: {\n      defaultValue: false,\n      describe: 'Excludes trailing punctuation from links generated with autoLinking',\n      type: 'boolean'\n    },\n    literalMidWordUnderscores: {\n      defaultValue: false,\n      describe: 'Parse midword underscores as literal underscores',\n      type: 'boolean'\n    },\n    strikethrough: {\n      defaultValue: false,\n      describe: 'Turn on/off strikethrough support',\n      type: 'boolean'\n    },\n    tables: {\n      defaultValue: false,\n      describe: 'Turn on/off tables support',\n      type: 'boolean'\n    },\n    tablesHeaderId: {\n      defaultValue: false,\n      describe: 'Add an id to table headers',\n      type: 'boolean'\n    },\n    ghCodeBlocks: {\n      defaultValue: true,\n      describe: 'Turn on/off GFM fenced code blocks support',\n      type: 'boolean'\n    },\n    tasklists: {\n      defaultValue: false,\n      describe: 'Turn on/off GFM tasklist support',\n      type: 'boolean'\n    },\n    smoothLivePreview: {\n      defaultValue: false,\n      describe: 'Prevents weird effects in live previews due to incomplete input',\n      type: 'boolean'\n    },\n    smartIndentationFix: {\n      defaultValue: false,\n      description: 'Tries to smartly fix indentation in es6 strings',\n      type: 'boolean'\n    },\n    disableForced4SpacesIndentedSublists: {\n      defaultValue: false,\n      description: 'Disables the requirement of indenting nested sublists by 4 spaces',\n      type: 'boolean'\n    },\n    simpleLineBreaks: {\n      defaultValue: false,\n      description: 'Parses simple line breaks as <br> (GFM Style)',\n      type: 'boolean'\n    },\n    requireSpaceBeforeHeadingText: {\n      defaultValue: false,\n      description: 'Makes adding a space between `#` and the header text mandatory (GFM Style)',\n      type: 'boolean'\n    }\n  };\n  if (simple === false) {\n    return JSON.parse(JSON.stringify(defaultOptions));\n  }\n  var ret = {};\n  for (var opt in defaultOptions) {\n    if (defaultOptions.hasOwnProperty(opt)) {\n      ret[opt] = defaultOptions[opt].defaultValue;\n    }\n  }\n  return ret;\n}\n\r\n/**\n * Created by Tivie on 06-01-2015.\n */\n\n// Private properties\nvar showdown = {},\n    parsers = {},\n    extensions = {},\n    globalOptions = getDefaultOpts(true),\n    flavor = {\n      github: {\n        omitExtraWLInCodeBlocks:              true,\n        prefixHeaderId:                       'user-content-',\n        simplifiedAutoLink:                   true,\n        excludeTrailingPunctuationFromURLs:   true,\n        literalMidWordUnderscores:            true,\n        strikethrough:                        true,\n        tables:                               true,\n        tablesHeaderId:                       true,\n        ghCodeBlocks:                         true,\n        tasklists:                            true,\n        disableForced4SpacesIndentedSublists: true,\n        simpleLineBreaks:                     true,\n        requireSpaceBeforeHeadingText:        true\n      },\n      vanilla: getDefaultOpts(true)\n    };\n\n/**\n * helper namespace\n * @type {{}}\n */\nshowdown.helper = {};\n\n/**\n * TODO LEGACY SUPPORT CODE\n * @type {{}}\n */\nshowdown.extensions = {};\n\n/**\n * Set a global option\n * @static\n * @param {string} key\n * @param {*} value\n * @returns {showdown}\n */\nshowdown.setOption = function (key, value) {\n  'use strict';\n  globalOptions[key] = value;\n  return this;\n};\n\n/**\n * Get a global option\n * @static\n * @param {string} key\n * @returns {*}\n */\nshowdown.getOption = function (key) {\n  'use strict';\n  return globalOptions[key];\n};\n\n/**\n * Get the global options\n * @static\n * @returns {{}}\n */\nshowdown.getOptions = function () {\n  'use strict';\n  return globalOptions;\n};\n\n/**\n * Reset global options to the default values\n * @static\n */\nshowdown.resetOptions = function () {\n  'use strict';\n  globalOptions = getDefaultOpts(true);\n};\n\n/**\n * Set the flavor showdown should use as default\n * @param {string} name\n */\nshowdown.setFlavor = function (name) {\n  'use strict';\n  if (flavor.hasOwnProperty(name)) {\n    var preset = flavor[name];\n    for (var option in preset) {\n      if (preset.hasOwnProperty(option)) {\n        globalOptions[option] = preset[option];\n      }\n    }\n  }\n};\n\n/**\n * Get the default options\n * @static\n * @param {boolean} [simple=true]\n * @returns {{}}\n */\nshowdown.getDefaultOptions = function (simple) {\n  'use strict';\n  return getDefaultOpts(simple);\n};\n\n/**\n * Get or set a subParser\n *\n * subParser(name)       - Get a registered subParser\n * subParser(name, func) - Register a subParser\n * @static\n * @param {string} name\n * @param {function} [func]\n * @returns {*}\n */\nshowdown.subParser = function (name, func) {\n  'use strict';\n  if (showdown.helper.isString(name)) {\n    if (typeof func !== 'undefined') {\n      parsers[name] = func;\n    } else {\n      if (parsers.hasOwnProperty(name)) {\n        return parsers[name];\n      } else {\n        throw Error('SubParser named ' + name + ' not registered!');\n      }\n    }\n  }\n};\n\n/**\n * Gets or registers an extension\n * @static\n * @param {string} name\n * @param {object|function=} ext\n * @returns {*}\n */\nshowdown.extension = function (name, ext) {\n  'use strict';\n\n  if (!showdown.helper.isString(name)) {\n    throw Error('Extension \\'name\\' must be a string');\n  }\n\n  name = showdown.helper.stdExtName(name);\n\n  // Getter\n  if (showdown.helper.isUndefined(ext)) {\n    if (!extensions.hasOwnProperty(name)) {\n      throw Error('Extension named ' + name + ' is not registered!');\n    }\n    return extensions[name];\n\n    // Setter\n  } else {\n    // Expand extension if it's wrapped in a function\n    if (typeof ext === 'function') {\n      ext = ext();\n    }\n\n    // Ensure extension is an array\n    if (!showdown.helper.isArray(ext)) {\n      ext = [ext];\n    }\n\n    var validExtension = validate(ext, name);\n\n    if (validExtension.valid) {\n      extensions[name] = ext;\n    } else {\n      throw Error(validExtension.error);\n    }\n  }\n};\n\n/**\n * Gets all extensions registered\n * @returns {{}}\n */\nshowdown.getAllExtensions = function () {\n  'use strict';\n  return extensions;\n};\n\n/**\n * Remove an extension\n * @param {string} name\n */\nshowdown.removeExtension = function (name) {\n  'use strict';\n  delete extensions[name];\n};\n\n/**\n * Removes all extensions\n */\nshowdown.resetExtensions = function () {\n  'use strict';\n  extensions = {};\n};\n\n/**\n * Validate extension\n * @param {array} extension\n * @param {string} name\n * @returns {{valid: boolean, error: string}}\n */\nfunction validate(extension, name) {\n  'use strict';\n\n  var errMsg = (name) ? 'Error in ' + name + ' extension->' : 'Error in unnamed extension',\n    ret = {\n      valid: true,\n      error: ''\n    };\n\n  if (!showdown.helper.isArray(extension)) {\n    extension = [extension];\n  }\n\n  for (var i = 0; i < extension.length; ++i) {\n    var baseMsg = errMsg + ' sub-extension ' + i + ': ',\n        ext = extension[i];\n    if (typeof ext !== 'object') {\n      ret.valid = false;\n      ret.error = baseMsg + 'must be an object, but ' + typeof ext + ' given';\n      return ret;\n    }\n\n    if (!showdown.helper.isString(ext.type)) {\n      ret.valid = false;\n      ret.error = baseMsg + 'property \"type\" must be a string, but ' + typeof ext.type + ' given';\n      return ret;\n    }\n\n    var type = ext.type = ext.type.toLowerCase();\n\n    // normalize extension type\n    if (type === 'language') {\n      type = ext.type = 'lang';\n    }\n\n    if (type === 'html') {\n      type = ext.type = 'output';\n    }\n\n    if (type !== 'lang' && type !== 'output' && type !== 'listener') {\n      ret.valid = false;\n      ret.error = baseMsg + 'type ' + type + ' is not recognized. Valid values: \"lang/language\", \"output/html\" or \"listener\"';\n      return ret;\n    }\n\n    if (type === 'listener') {\n      if (showdown.helper.isUndefined(ext.listeners)) {\n        ret.valid = false;\n        ret.error = baseMsg + '. Extensions of type \"listener\" must have a property called \"listeners\"';\n        return ret;\n      }\n    } else {\n      if (showdown.helper.isUndefined(ext.filter) && showdown.helper.isUndefined(ext.regex)) {\n        ret.valid = false;\n        ret.error = baseMsg + type + ' extensions must define either a \"regex\" property or a \"filter\" method';\n        return ret;\n      }\n    }\n\n    if (ext.listeners) {\n      if (typeof ext.listeners !== 'object') {\n        ret.valid = false;\n        ret.error = baseMsg + '\"listeners\" property must be an object but ' + typeof ext.listeners + ' given';\n        return ret;\n      }\n      for (var ln in ext.listeners) {\n        if (ext.listeners.hasOwnProperty(ln)) {\n          if (typeof ext.listeners[ln] !== 'function') {\n            ret.valid = false;\n            ret.error = baseMsg + '\"listeners\" property must be an hash of [event name]: [callback]. listeners.' + ln +\n              ' must be a function but ' + typeof ext.listeners[ln] + ' given';\n            return ret;\n          }\n        }\n      }\n    }\n\n    if (ext.filter) {\n      if (typeof ext.filter !== 'function') {\n        ret.valid = false;\n        ret.error = baseMsg + '\"filter\" must be a function, but ' + typeof ext.filter + ' given';\n        return ret;\n      }\n    } else if (ext.regex) {\n      if (showdown.helper.isString(ext.regex)) {\n        ext.regex = new RegExp(ext.regex, 'g');\n      }\n      if (!ext.regex instanceof RegExp) {\n        ret.valid = false;\n        ret.error = baseMsg + '\"regex\" property must either be a string or a RegExp object, but ' + typeof ext.regex + ' given';\n        return ret;\n      }\n      if (showdown.helper.isUndefined(ext.replace)) {\n        ret.valid = false;\n        ret.error = baseMsg + '\"regex\" extensions must implement a replace string or function';\n        return ret;\n      }\n    }\n  }\n  return ret;\n}\n\n/**\n * Validate extension\n * @param {object} ext\n * @returns {boolean}\n */\nshowdown.validateExtension = function (ext) {\n  'use strict';\n\n  var validateExtension = validate(ext, null);\n  if (!validateExtension.valid) {\n    console.warn(validateExtension.error);\n    return false;\n  }\n  return true;\n};\n\r\n/**\n * showdownjs helper functions\n */\n\nif (!showdown.hasOwnProperty('helper')) {\n  showdown.helper = {};\n}\n\n/**\n * Check if var is string\n * @static\n * @param {string} a\n * @returns {boolean}\n */\nshowdown.helper.isString = function isString(a) {\n  'use strict';\n  return (typeof a === 'string' || a instanceof String);\n};\n\n/**\n * Check if var is a function\n * @static\n * @param {string} a\n * @returns {boolean}\n */\nshowdown.helper.isFunction = function isFunction(a) {\n  'use strict';\n  var getType = {};\n  return a && getType.toString.call(a) === '[object Function]';\n};\n\n/**\n * ForEach helper function\n * @static\n * @param {*} obj\n * @param {function} callback\n */\nshowdown.helper.forEach = function forEach(obj, callback) {\n  'use strict';\n  if (typeof obj.forEach === 'function') {\n    obj.forEach(callback);\n  } else {\n    for (var i = 0; i < obj.length; i++) {\n      callback(obj[i], i, obj);\n    }\n  }\n};\n\n/**\n * isArray helper function\n * @static\n * @param {*} a\n * @returns {boolean}\n */\nshowdown.helper.isArray = function isArray(a) {\n  'use strict';\n  return a.constructor === Array;\n};\n\n/**\n * Check if value is undefined\n * @static\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n */\nshowdown.helper.isUndefined = function isUndefined(value) {\n  'use strict';\n  return typeof value === 'undefined';\n};\n\n/**\n * Standardidize extension name\n * @static\n * @param {string} s extension name\n * @returns {string}\n */\nshowdown.helper.stdExtName = function (s) {\n  'use strict';\n  return s.replace(/[_-]||\\s/g, '').toLowerCase();\n};\n\nfunction escapeCharactersCallback(wholeMatch, m1) {\n  'use strict';\n  var charCodeToEscape = m1.charCodeAt(0);\n  return '~E' + charCodeToEscape + 'E';\n}\n\n/**\n * Callback used to escape characters when passing through String.replace\n * @static\n * @param {string} wholeMatch\n * @param {string} m1\n * @returns {string}\n */\nshowdown.helper.escapeCharactersCallback = escapeCharactersCallback;\n\n/**\n * Escape characters in a string\n * @static\n * @param {string} text\n * @param {string} charsToEscape\n * @param {boolean} afterBackslash\n * @returns {XML|string|void|*}\n */\nshowdown.helper.escapeCharacters = function escapeCharacters(text, charsToEscape, afterBackslash) {\n  'use strict';\n  // First we have to escape the escape characters so that\n  // we can build a character class out of them\n  var regexString = '([' + charsToEscape.replace(/([\\[\\]\\\\])/g, '\\\\$1') + '])';\n\n  if (afterBackslash) {\n    regexString = '\\\\\\\\' + regexString;\n  }\n\n  var regex = new RegExp(regexString, 'g');\n  text = text.replace(regex, escapeCharactersCallback);\n\n  return text;\n};\n\nvar rgxFindMatchPos = function (str, left, right, flags) {\n  'use strict';\n  var f = flags || '',\n    g = f.indexOf('g') > -1,\n    x = new RegExp(left + '|' + right, 'g' + f.replace(/g/g, '')),\n    l = new RegExp(left, f.replace(/g/g, '')),\n    pos = [],\n    t, s, m, start, end;\n\n  do {\n    t = 0;\n    while ((m = x.exec(str))) {\n      if (l.test(m[0])) {\n        if (!(t++)) {\n          s = x.lastIndex;\n          start = s - m[0].length;\n        }\n      } else if (t) {\n        if (!--t) {\n          end = m.index + m[0].length;\n          var obj = {\n            left: {start: start, end: s},\n            match: {start: s, end: m.index},\n            right: {start: m.index, end: end},\n            wholeMatch: {start: start, end: end}\n          };\n          pos.push(obj);\n          if (!g) {\n            return pos;\n          }\n        }\n      }\n    }\n  } while (t && (x.lastIndex = s));\n\n  return pos;\n};\n\n/**\n * matchRecursiveRegExp\n *\n * (c) 2007 Steven Levithan <stevenlevithan.com>\n * MIT License\n *\n * Accepts a string to search, a left and right format delimiter\n * as regex patterns, and optional regex flags. Returns an array\n * of matches, allowing nested instances of left/right delimiters.\n * Use the \"g\" flag to return all matches, otherwise only the\n * first is returned. Be careful to ensure that the left and\n * right format delimiters produce mutually exclusive matches.\n * Backreferences are not supported within the right delimiter\n * due to how it is internally combined with the left delimiter.\n * When matching strings whose format delimiters are unbalanced\n * to the left or right, the output is intentionally as a\n * conventional regex library with recursion support would\n * produce, e.g. \"<<x>\" and \"<x>>\" both produce [\"x\"] when using\n * \"<\" and \">\" as the delimiters (both strings contain a single,\n * balanced instance of \"<x>\").\n *\n * examples:\n * matchRecursiveRegExp(\"test\", \"\\\\(\", \"\\\\)\")\n * returns: []\n * matchRecursiveRegExp(\"<t<<e>><s>>t<>\", \"<\", \">\", \"g\")\n * returns: [\"t<<e>><s>\", \"\"]\n * matchRecursiveRegExp(\"<div id=\\\"x\\\">test</div>\", \"<div\\\\b[^>]*>\", \"</div>\", \"gi\")\n * returns: [\"test\"]\n */\nshowdown.helper.matchRecursiveRegExp = function (str, left, right, flags) {\n  'use strict';\n\n  var matchPos = rgxFindMatchPos (str, left, right, flags),\n    results = [];\n\n  for (var i = 0; i < matchPos.length; ++i) {\n    results.push([\n      str.slice(matchPos[i].wholeMatch.start, matchPos[i].wholeMatch.end),\n      str.slice(matchPos[i].match.start, matchPos[i].match.end),\n      str.slice(matchPos[i].left.start, matchPos[i].left.end),\n      str.slice(matchPos[i].right.start, matchPos[i].right.end)\n    ]);\n  }\n  return results;\n};\n\n/**\n *\n * @param {string} str\n * @param {string|function} replacement\n * @param {string} left\n * @param {string} right\n * @param {string} flags\n * @returns {string}\n */\nshowdown.helper.replaceRecursiveRegExp = function (str, replacement, left, right, flags) {\n  'use strict';\n\n  if (!showdown.helper.isFunction(replacement)) {\n    var repStr = replacement;\n    replacement = function () {\n      return repStr;\n    };\n  }\n\n  var matchPos = rgxFindMatchPos(str, left, right, flags),\n      finalStr = str,\n      lng = matchPos.length;\n\n  if (lng > 0) {\n    var bits = [];\n    if (matchPos[0].wholeMatch.start !== 0) {\n      bits.push(str.slice(0, matchPos[0].wholeMatch.start));\n    }\n    for (var i = 0; i < lng; ++i) {\n      bits.push(\n        replacement(\n          str.slice(matchPos[i].wholeMatch.start, matchPos[i].wholeMatch.end),\n          str.slice(matchPos[i].match.start, matchPos[i].match.end),\n          str.slice(matchPos[i].left.start, matchPos[i].left.end),\n          str.slice(matchPos[i].right.start, matchPos[i].right.end)\n        )\n      );\n      if (i < lng - 1) {\n        bits.push(str.slice(matchPos[i].wholeMatch.end, matchPos[i + 1].wholeMatch.start));\n      }\n    }\n    if (matchPos[lng - 1].wholeMatch.end < str.length) {\n      bits.push(str.slice(matchPos[lng - 1].wholeMatch.end));\n    }\n    finalStr = bits.join('');\n  }\n  return finalStr;\n};\n\n/**\n * POLYFILLS\n */\nif (showdown.helper.isUndefined(console)) {\n  console = {\n    warn: function (msg) {\n      'use strict';\n      alert(msg);\n    },\n    log: function (msg) {\n      'use strict';\n      alert(msg);\n    },\n    error: function (msg) {\n      'use strict';\n      throw msg;\n    }\n  };\n}\n\r\n/**\n * Created by Estevao on 31-05-2015.\n */\n\n/**\n * Showdown Converter class\n * @class\n * @param {object} [converterOptions]\n * @returns {Converter}\n */\nshowdown.Converter = function (converterOptions) {\n  'use strict';\n\n  var\n      /**\n       * Options used by this converter\n       * @private\n       * @type {{}}\n       */\n      options = {},\n\n      /**\n       * Language extensions used by this converter\n       * @private\n       * @type {Array}\n       */\n      langExtensions = [],\n\n      /**\n       * Output modifiers extensions used by this converter\n       * @private\n       * @type {Array}\n       */\n      outputModifiers = [],\n\n      /**\n       * Event listeners\n       * @private\n       * @type {{}}\n       */\n      listeners = {};\n\n  _constructor();\n\n  /**\n   * Converter constructor\n   * @private\n   */\n  function _constructor() {\n    converterOptions = converterOptions || {};\n\n    for (var gOpt in globalOptions) {\n      if (globalOptions.hasOwnProperty(gOpt)) {\n        options[gOpt] = globalOptions[gOpt];\n      }\n    }\n\n    // Merge options\n    if (typeof converterOptions === 'object') {\n      for (var opt in converterOptions) {\n        if (converterOptions.hasOwnProperty(opt)) {\n          options[opt] = converterOptions[opt];\n        }\n      }\n    } else {\n      throw Error('Converter expects the passed parameter to be an object, but ' + typeof converterOptions +\n      ' was passed instead.');\n    }\n\n    if (options.extensions) {\n      showdown.helper.forEach(options.extensions, _parseExtension);\n    }\n  }\n\n  /**\n   * Parse extension\n   * @param {*} ext\n   * @param {string} [name='']\n   * @private\n   */\n  function _parseExtension(ext, name) {\n\n    name = name || null;\n    // If it's a string, the extension was previously loaded\n    if (showdown.helper.isString(ext)) {\n      ext = showdown.helper.stdExtName(ext);\n      name = ext;\n\n      // LEGACY_SUPPORT CODE\n      if (showdown.extensions[ext]) {\n        console.warn('DEPRECATION WARNING: ' + ext + ' is an old extension that uses a deprecated loading method.' +\n          'Please inform the developer that the extension should be updated!');\n        legacyExtensionLoading(showdown.extensions[ext], ext);\n        return;\n      // END LEGACY SUPPORT CODE\n\n      } else if (!showdown.helper.isUndefined(extensions[ext])) {\n        ext = extensions[ext];\n\n      } else {\n        throw Error('Extension \"' + ext + '\" could not be loaded. It was either not found or is not a valid extension.');\n      }\n    }\n\n    if (typeof ext === 'function') {\n      ext = ext();\n    }\n\n    if (!showdown.helper.isArray(ext)) {\n      ext = [ext];\n    }\n\n    var validExt = validate(ext, name);\n    if (!validExt.valid) {\n      throw Error(validExt.error);\n    }\n\n    for (var i = 0; i < ext.length; ++i) {\n      switch (ext[i].type) {\n\n        case 'lang':\n          langExtensions.push(ext[i]);\n          break;\n\n        case 'output':\n          outputModifiers.push(ext[i]);\n          break;\n      }\n      if (ext[i].hasOwnProperty('listeners')) {\n        for (var ln in ext[i].listeners) {\n          if (ext[i].listeners.hasOwnProperty(ln)) {\n            listen(ln, ext[i].listeners[ln]);\n          }\n        }\n      }\n    }\n\n  }\n\n  /**\n   * LEGACY_SUPPORT\n   * @param {*} ext\n   * @param {string} name\n   */\n  function legacyExtensionLoading(ext, name) {\n    if (typeof ext === 'function') {\n      ext = ext(new showdown.Converter());\n    }\n    if (!showdown.helper.isArray(ext)) {\n      ext = [ext];\n    }\n    var valid = validate(ext, name);\n\n    if (!valid.valid) {\n      throw Error(valid.error);\n    }\n\n    for (var i = 0; i < ext.length; ++i) {\n      switch (ext[i].type) {\n        case 'lang':\n          langExtensions.push(ext[i]);\n          break;\n        case 'output':\n          outputModifiers.push(ext[i]);\n          break;\n        default:// should never reach here\n          throw Error('Extension loader error: Type unrecognized!!!');\n      }\n    }\n  }\n\n  /**\n   * Listen to an event\n   * @param {string} name\n   * @param {function} callback\n   */\n  function listen(name, callback) {\n    if (!showdown.helper.isString(name)) {\n      throw Error('Invalid argument in converter.listen() method: name must be a string, but ' + typeof name + ' given');\n    }\n\n    if (typeof callback !== 'function') {\n      throw Error('Invalid argument in converter.listen() method: callback must be a function, but ' + typeof callback + ' given');\n    }\n\n    if (!listeners.hasOwnProperty(name)) {\n      listeners[name] = [];\n    }\n    listeners[name].push(callback);\n  }\n\n  function rTrimInputText(text) {\n    var rsp = text.match(/^\\s*/)[0].length,\n        rgx = new RegExp('^\\\\s{0,' + rsp + '}', 'gm');\n    return text.replace(rgx, '');\n  }\n\n  /**\n   * Dispatch an event\n   * @private\n   * @param {string} evtName Event name\n   * @param {string} text Text\n   * @param {{}} options Converter Options\n   * @param {{}} globals\n   * @returns {string}\n   */\n  this._dispatch = function dispatch (evtName, text, options, globals) {\n    if (listeners.hasOwnProperty(evtName)) {\n      for (var ei = 0; ei < listeners[evtName].length; ++ei) {\n        var nText = listeners[evtName][ei](evtName, text, this, options, globals);\n        if (nText && typeof nText !== 'undefined') {\n          text = nText;\n        }\n      }\n    }\n    return text;\n  };\n\n  /**\n   * Listen to an event\n   * @param {string} name\n   * @param {function} callback\n   * @returns {showdown.Converter}\n   */\n  this.listen = function (name, callback) {\n    listen(name, callback);\n    return this;\n  };\n\n  /**\n   * Converts a markdown string into HTML\n   * @param {string} text\n   * @returns {*}\n   */\n  this.makeHtml = function (text) {\n    //check if text is not falsy\n    if (!text) {\n      return text;\n    }\n\n    var globals = {\n      gHtmlBlocks:     [],\n      gHtmlMdBlocks:   [],\n      gHtmlSpans:      [],\n      gUrls:           {},\n      gTitles:         {},\n      gDimensions:     {},\n      gListLevel:      0,\n      hashLinkCounts:  {},\n      langExtensions:  langExtensions,\n      outputModifiers: outputModifiers,\n      converter:       this,\n      ghCodeBlocks:    []\n    };\n\n    // attacklab: Replace ~ with ~T\n    // This lets us use tilde as an escape char to avoid md5 hashes\n    // The choice of character is arbitrary; anything that isn't\n    // magic in Markdown will work.\n    text = text.replace(/~/g, '~T');\n\n    // attacklab: Replace $ with ~D\n    // RegExp interprets $ as a special character\n    // when it's in a replacement string\n    text = text.replace(/\\$/g, '~D');\n\n    // Standardize line endings\n    text = text.replace(/\\r\\n/g, '\\n'); // DOS to Unix\n    text = text.replace(/\\r/g, '\\n'); // Mac to Unix\n\n    // Stardardize line spaces (nbsp causes trouble in older browsers and some regex flavors)\n    text = text.replace(/\\u00A0/g, ' ');\n\n    if (options.smartIndentationFix) {\n      text = rTrimInputText(text);\n    }\n\n    // Make sure text begins and ends with a couple of newlines:\n    text = '\\n\\n' + text + '\\n\\n';\n\n    // detab\n    text = showdown.subParser('detab')(text, options, globals);\n\n    // stripBlankLines\n    text = showdown.subParser('stripBlankLines')(text, options, globals);\n\n    //run languageExtensions\n    showdown.helper.forEach(langExtensions, function (ext) {\n      text = showdown.subParser('runExtension')(ext, text, options, globals);\n    });\n\n    // run the sub parsers\n    text = showdown.subParser('hashPreCodeTags')(text, options, globals);\n    text = showdown.subParser('githubCodeBlocks')(text, options, globals);\n    text = showdown.subParser('hashHTMLBlocks')(text, options, globals);\n    text = showdown.subParser('hashHTMLSpans')(text, options, globals);\n    text = showdown.subParser('stripLinkDefinitions')(text, options, globals);\n    text = showdown.subParser('blockGamut')(text, options, globals);\n    text = showdown.subParser('unhashHTMLSpans')(text, options, globals);\n    text = showdown.subParser('unescapeSpecialChars')(text, options, globals);\n\n    // attacklab: Restore dollar signs\n    text = text.replace(/~D/g, '$$');\n\n    // attacklab: Restore tildes\n    text = text.replace(/~T/g, '~');\n\n    // Run output modifiers\n    showdown.helper.forEach(outputModifiers, function (ext) {\n      text = showdown.subParser('runExtension')(ext, text, options, globals);\n    });\n\n    return text;\n  };\n\n  /**\n   * Set an option of this Converter instance\n   * @param {string} key\n   * @param {*} value\n   */\n  this.setOption = function (key, value) {\n    options[key] = value;\n  };\n\n  /**\n   * Get the option of this Converter instance\n   * @param {string} key\n   * @returns {*}\n   */\n  this.getOption = function (key) {\n    return options[key];\n  };\n\n  /**\n   * Get the options of this Converter instance\n   * @returns {{}}\n   */\n  this.getOptions = function () {\n    return options;\n  };\n\n  /**\n   * Add extension to THIS converter\n   * @param {{}} extension\n   * @param {string} [name=null]\n   */\n  this.addExtension = function (extension, name) {\n    name = name || null;\n    _parseExtension(extension, name);\n  };\n\n  /**\n   * Use a global registered extension with THIS converter\n   * @param {string} extensionName Name of the previously registered extension\n   */\n  this.useExtension = function (extensionName) {\n    _parseExtension(extensionName);\n  };\n\n  /**\n   * Set the flavor THIS converter should use\n   * @param {string} name\n   */\n  this.setFlavor = function (name) {\n    if (flavor.hasOwnProperty(name)) {\n      var preset = flavor[name];\n      for (var option in preset) {\n        if (preset.hasOwnProperty(option)) {\n          options[option] = preset[option];\n        }\n      }\n    }\n  };\n\n  /**\n   * Remove an extension from THIS converter.\n   * Note: This is a costly operation. It's better to initialize a new converter\n   * and specify the extensions you wish to use\n   * @param {Array} extension\n   */\n  this.removeExtension = function (extension) {\n    if (!showdown.helper.isArray(extension)) {\n      extension = [extension];\n    }\n    for (var a = 0; a < extension.length; ++a) {\n      var ext = extension[a];\n      for (var i = 0; i < langExtensions.length; ++i) {\n        if (langExtensions[i] === ext) {\n          langExtensions[i].splice(i, 1);\n        }\n      }\n      for (var ii = 0; ii < outputModifiers.length; ++i) {\n        if (outputModifiers[ii] === ext) {\n          outputModifiers[ii].splice(i, 1);\n        }\n      }\n    }\n  };\n\n  /**\n   * Get all extension of THIS converter\n   * @returns {{language: Array, output: Array}}\n   */\n  this.getAllExtensions = function () {\n    return {\n      language: langExtensions,\n      output: outputModifiers\n    };\n  };\n};\n\r\n/**\n * Turn Markdown link shortcuts into XHTML <a> tags.\n */\nshowdown.subParser('anchors', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('anchors.before', text, options, globals);\n\n  var writeAnchorTag = function (wholeMatch, m1, m2, m3, m4, m5, m6, m7) {\n    if (showdown.helper.isUndefined(m7)) {\n      m7 = '';\n    }\n    wholeMatch = m1;\n    var linkText = m2,\n        linkId = m3.toLowerCase(),\n        url = m4,\n        title = m7;\n\n    if (!url) {\n      if (!linkId) {\n        // lower-case and turn embedded newlines into spaces\n        linkId = linkText.toLowerCase().replace(/ ?\\n/g, ' ');\n      }\n      url = '#' + linkId;\n\n      if (!showdown.helper.isUndefined(globals.gUrls[linkId])) {\n        url = globals.gUrls[linkId];\n        if (!showdown.helper.isUndefined(globals.gTitles[linkId])) {\n          title = globals.gTitles[linkId];\n        }\n      } else {\n        if (wholeMatch.search(/\\(\\s*\\)$/m) > -1) {\n          // Special case for explicit empty url\n          url = '';\n        } else {\n          return wholeMatch;\n        }\n      }\n    }\n\n    url = showdown.helper.escapeCharacters(url, '*_', false);\n    var result = '<a href=\"' + url + '\"';\n\n    if (title !== '' && title !== null) {\n      title = title.replace(/\"/g, '&quot;');\n      title = showdown.helper.escapeCharacters(title, '*_', false);\n      result += ' title=\"' + title + '\"';\n    }\n\n    result += '>' + linkText + '</a>';\n\n    return result;\n  };\n\n  // First, handle reference-style links: [link text] [id]\n  text = text.replace(/(\\[((?:\\[[^\\]]*]|[^\\[\\]])*)][ ]?(?:\\n[ ]*)?\\[(.*?)])()()()()/g, writeAnchorTag);\n\n  // Next, inline-style links: [link text](url \"optional title\")\n  text = text.replace(/(\\[((?:\\[[^\\]]*]|[^\\[\\]])*)]\\([ \\t]*()<?(.*?(?:\\(.*?\\).*?)?)>?[ \\t]*((['\"])(.*?)\\6[ \\t]*)?\\))/g,\n                      writeAnchorTag);\n\n  // Last, handle reference-style shortcuts: [link text]\n  // These must come last in case you've also got [link test][1]\n  // or [link test](/foo)\n  text = text.replace(/(\\[([^\\[\\]]+)])()()()()()/g, writeAnchorTag);\n\n  text = globals.converter._dispatch('anchors.after', text, options, globals);\n  return text;\n});\n\r\nshowdown.subParser('autoLinks', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('autoLinks.before', text, options, globals);\n\n  var simpleURLRegex  = /\\b(((https?|ftp|dict):\\/\\/|www\\.)[^'\">\\s]+\\.[^'\">\\s]+)()(?=\\s|$)(?![\"<>])/gi,\n      simpleURLRegex2 = /\\b(((https?|ftp|dict):\\/\\/|www\\.)[^'\">\\s]+\\.[^'\">\\s]+?)([.!?()]?)(?=\\s|$)(?![\"<>])/gi,\n      delimUrlRegex   = /<(((https?|ftp|dict):\\/\\/|www\\.)[^'\">\\s]+)>/gi,\n      simpleMailRegex = /(?:^|\\s)([A-Za-z0-9!#$%&'*+-/=?^_`{|}~.]+@[-a-z0-9]+(\\.[-a-z0-9]+)*\\.[a-z]+)(?:$|\\s)/gi,\n      delimMailRegex  = /<(?:mailto:)?([-.\\w]+@[-a-z0-9]+(\\.[-a-z0-9]+)*\\.[a-z]+)>/gi;\n\n  text = text.replace(delimUrlRegex, replaceLink);\n  text = text.replace(delimMailRegex, replaceMail);\n  // simpleURLRegex  = /\\b(((https?|ftp|dict):\\/\\/|www\\.)[-.+~:?#@!$&'()*,;=[\\]\\w]+)\\b/gi,\n  // Email addresses: <address@domain.foo>\n\n  if (options.simplifiedAutoLink) {\n    if (options.excludeTrailingPunctuationFromURLs) {\n      text = text.replace(simpleURLRegex2, replaceLink);\n    } else {\n      text = text.replace(simpleURLRegex, replaceLink);\n    }\n    text = text.replace(simpleMailRegex, replaceMail);\n  }\n\n  function replaceLink(wm, link, m2, m3, trailingPunctuation) {\n    var lnkTxt = link,\n        append = '';\n    if (/^www\\./i.test(link)) {\n      link = link.replace(/^www\\./i, 'http://www.');\n    }\n    if (options.excludeTrailingPunctuationFromURLs && trailingPunctuation) {\n      append = trailingPunctuation;\n    }\n    return '<a href=\"' + link + '\">' + lnkTxt + '</a>' + append;\n  }\n\n  function replaceMail(wholeMatch, mail) {\n    var unescapedStr = showdown.subParser('unescapeSpecialChars')(mail);\n    return showdown.subParser('encodeEmailAddress')(unescapedStr);\n  }\n\n  text = globals.converter._dispatch('autoLinks.after', text, options, globals);\n\n  return text;\n});\n\r\n/**\n * These are all the transformations that form block-level\n * tags like paragraphs, headers, and list items.\n */\nshowdown.subParser('blockGamut', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('blockGamut.before', text, options, globals);\n\n  // we parse blockquotes first so that we can have headings and hrs\n  // inside blockquotes\n  text = showdown.subParser('blockQuotes')(text, options, globals);\n  text = showdown.subParser('headers')(text, options, globals);\n\n  // Do Horizontal Rules:\n  var key = showdown.subParser('hashBlock')('<hr />', options, globals);\n  text = text.replace(/^ {0,2}( ?-){3,}[ \\t]*$/gm, key);\n  text = text.replace(/^ {0,2}( ?\\*){3,}[ \\t]*$/gm, key);\n  text = text.replace(/^ {0,2}( ?_){3,}[ \\t]*$/gm, key);\n\n  text = showdown.subParser('lists')(text, options, globals);\n  text = showdown.subParser('codeBlocks')(text, options, globals);\n  text = showdown.subParser('tables')(text, options, globals);\n\n  // We already ran _HashHTMLBlocks() before, in Markdown(), but that\n  // was to escape raw HTML in the original Markdown source. This time,\n  // we're escaping the markup we've just created, so that we don't wrap\n  // <p> tags around block-level tags.\n  text = showdown.subParser('hashHTMLBlocks')(text, options, globals);\n  text = showdown.subParser('paragraphs')(text, options, globals);\n\n  text = globals.converter._dispatch('blockGamut.after', text, options, globals);\n\n  return text;\n});\n\r\nshowdown.subParser('blockQuotes', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('blockQuotes.before', text, options, globals);\n\n  text = text.replace(/((^ {0,3}>[ \\t]?.+\\n(.+\\n)*\\n*)+)/gm, function (wholeMatch, m1) {\n    var bq = m1;\n\n    // attacklab: hack around Konqueror 3.5.4 bug:\n    // \"----------bug\".replace(/^-/g,\"\") == \"bug\"\n    bq = bq.replace(/^[ \\t]*>[ \\t]?/gm, '~0'); // trim one level of quoting\n\n    // attacklab: clean up hack\n    bq = bq.replace(/~0/g, '');\n\n    bq = bq.replace(/^[ \\t]+$/gm, ''); // trim whitespace-only lines\n    bq = showdown.subParser('githubCodeBlocks')(bq, options, globals);\n    bq = showdown.subParser('blockGamut')(bq, options, globals); // recurse\n\n    bq = bq.replace(/(^|\\n)/g, '$1  ');\n    // These leading spaces screw with <pre> content, so we need to fix that:\n    bq = bq.replace(/(\\s*<pre>[^\\r]+?<\\/pre>)/gm, function (wholeMatch, m1) {\n      var pre = m1;\n      // attacklab: hack around Konqueror 3.5.4 bug:\n      pre = pre.replace(/^  /mg, '~0');\n      pre = pre.replace(/~0/g, '');\n      return pre;\n    });\n\n    return showdown.subParser('hashBlock')('<blockquote>\\n' + bq + '\\n</blockquote>', options, globals);\n  });\n\n  text = globals.converter._dispatch('blockQuotes.after', text, options, globals);\n  return text;\n});\n\r\n/**\n * Process Markdown `<pre><code>` blocks.\n */\nshowdown.subParser('codeBlocks', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('codeBlocks.before', text, options, globals);\n\n  // sentinel workarounds for lack of \\A and \\Z, safari\\khtml bug\n  text += '~0';\n\n  var pattern = /(?:\\n\\n|^)((?:(?:[ ]{4}|\\t).*\\n+)+)(\\n*[ ]{0,3}[^ \\t\\n]|(?=~0))/g;\n  text = text.replace(pattern, function (wholeMatch, m1, m2) {\n    var codeblock = m1,\n        nextChar = m2,\n        end = '\\n';\n\n    codeblock = showdown.subParser('outdent')(codeblock);\n    codeblock = showdown.subParser('encodeCode')(codeblock);\n    codeblock = showdown.subParser('detab')(codeblock);\n    codeblock = codeblock.replace(/^\\n+/g, ''); // trim leading newlines\n    codeblock = codeblock.replace(/\\n+$/g, ''); // trim trailing newlines\n\n    if (options.omitExtraWLInCodeBlocks) {\n      end = '';\n    }\n\n    codeblock = '<pre><code>' + codeblock + end + '</code></pre>';\n\n    return showdown.subParser('hashBlock')(codeblock, options, globals) + nextChar;\n  });\n\n  // strip sentinel\n  text = text.replace(/~0/, '');\n\n  text = globals.converter._dispatch('codeBlocks.after', text, options, globals);\n  return text;\n});\n\r\n/**\n *\n *   *  Backtick quotes are used for <code></code> spans.\n *\n *   *  You can use multiple backticks as the delimiters if you want to\n *     include literal backticks in the code span. So, this input:\n *\n *         Just type ``foo `bar` baz`` at the prompt.\n *\n *       Will translate to:\n *\n *         <p>Just type <code>foo `bar` baz</code> at the prompt.</p>\n *\n *    There's no arbitrary limit to the number of backticks you\n *    can use as delimters. If you need three consecutive backticks\n *    in your code, use four for delimiters, etc.\n *\n *  *  You can use spaces to get literal backticks at the edges:\n *\n *         ... type `` `bar` `` ...\n *\n *       Turns to:\n *\n *         ... type <code>`bar`</code> ...\n */\nshowdown.subParser('codeSpans', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('codeSpans.before', text, options, globals);\n\n  /*\n   text = text.replace(/\n   (^|[^\\\\])\t\t\t\t\t// Character before opening ` can't be a backslash\n   (`+)\t\t\t\t\t\t// $2 = Opening run of `\n   (\t\t\t\t\t\t\t// $3 = The code block\n   [^\\r]*?\n   [^`]\t\t\t\t\t// attacklab: work around lack of lookbehind\n   )\n   \\2\t\t\t\t\t\t\t// Matching closer\n   (?!`)\n   /gm, function(){...});\n   */\n\n  if (typeof(text) === 'undefined') {\n    text = '';\n  }\n  text = text.replace(/(^|[^\\\\])(`+)([^\\r]*?[^`])\\2(?!`)/gm,\n    function (wholeMatch, m1, m2, m3) {\n      var c = m3;\n      c = c.replace(/^([ \\t]*)/g, '');\t// leading whitespace\n      c = c.replace(/[ \\t]*$/g, '');\t// trailing whitespace\n      c = showdown.subParser('encodeCode')(c);\n      return m1 + '<code>' + c + '</code>';\n    }\n  );\n\n  text = globals.converter._dispatch('codeSpans.after', text, options, globals);\n  return text;\n});\n\r\n/**\n * Convert all tabs to spaces\n */\nshowdown.subParser('detab', function (text) {\n  'use strict';\n\n  // expand first n-1 tabs\n  text = text.replace(/\\t(?=\\t)/g, '    '); // g_tab_width\n\n  // replace the nth with two sentinels\n  text = text.replace(/\\t/g, '~A~B');\n\n  // use the sentinel to anchor our regex so it doesn't explode\n  text = text.replace(/~B(.+?)~A/g, function (wholeMatch, m1) {\n    var leadingText = m1,\n        numSpaces = 4 - leadingText.length % 4;  // g_tab_width\n\n    // there *must* be a better way to do this:\n    for (var i = 0; i < numSpaces; i++) {\n      leadingText += ' ';\n    }\n\n    return leadingText;\n  });\n\n  // clean up sentinels\n  text = text.replace(/~A/g, '    ');  // g_tab_width\n  text = text.replace(/~B/g, '');\n\n  return text;\n\n});\n\r\n/**\n * Smart processing for ampersands and angle brackets that need to be encoded.\n */\nshowdown.subParser('encodeAmpsAndAngles', function (text) {\n  'use strict';\n  // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin:\n  // http://bumppo.net/projects/amputator/\n  text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\\w+);)/g, '&amp;');\n\n  // Encode naked <'s\n  text = text.replace(/<(?![a-z\\/?\\$!])/gi, '&lt;');\n\n  return text;\n});\n\r\n/**\n * Returns the string, with after processing the following backslash escape sequences.\n *\n * attacklab: The polite way to do this is with the new escapeCharacters() function:\n *\n *    text = escapeCharacters(text,\"\\\\\",true);\n *    text = escapeCharacters(text,\"`*_{}[]()>#+-.!\",true);\n *\n * ...but we're sidestepping its use of the (slow) RegExp constructor\n * as an optimization for Firefox.  This function gets called a LOT.\n */\nshowdown.subParser('encodeBackslashEscapes', function (text) {\n  'use strict';\n  text = text.replace(/\\\\(\\\\)/g, showdown.helper.escapeCharactersCallback);\n  text = text.replace(/\\\\([`*_{}\\[\\]()>#+-.!])/g, showdown.helper.escapeCharactersCallback);\n  return text;\n});\n\r\n/**\n * Encode/escape certain characters inside Markdown code runs.\n * The point is that in code, these characters are literals,\n * and lose their special Markdown meanings.\n */\nshowdown.subParser('encodeCode', function (text) {\n  'use strict';\n\n  // Encode all ampersands; HTML entities are not\n  // entities within a Markdown code span.\n  text = text.replace(/&/g, '&amp;');\n\n  // Do the angle bracket song and dance:\n  text = text.replace(/</g, '&lt;');\n  text = text.replace(/>/g, '&gt;');\n\n  // Now, escape characters that are magic in Markdown:\n  text = showdown.helper.escapeCharacters(text, '*_{}[]\\\\', false);\n\n  // jj the line above breaks this:\n  //---\n  //* Item\n  //   1. Subitem\n  //            special char: *\n  // ---\n\n  return text;\n});\n\r\n/**\n *  Input: an email address, e.g. \"foo@example.com\"\n *\n *  Output: the email address as a mailto link, with each character\n *    of the address encoded as either a decimal or hex entity, in\n *    the hopes of foiling most address harvesting spam bots. E.g.:\n *\n *    <a href=\"&#x6D;&#97;&#105;&#108;&#x74;&#111;:&#102;&#111;&#111;&#64;&#101;\n *       x&#x61;&#109;&#x70;&#108;&#x65;&#x2E;&#99;&#111;&#109;\">&#102;&#111;&#111;\n *       &#64;&#101;x&#x61;&#109;&#x70;&#108;&#x65;&#x2E;&#99;&#111;&#109;</a>\n *\n *  Based on a filter by Matthew Wickline, posted to the BBEdit-Talk\n *  mailing list: <http://tinyurl.com/yu7ue>\n *\n */\nshowdown.subParser('encodeEmailAddress', function (addr) {\n  'use strict';\n\n  var encode = [\n    function (ch) {\n      return '&#' + ch.charCodeAt(0) + ';';\n    },\n    function (ch) {\n      return '&#x' + ch.charCodeAt(0).toString(16) + ';';\n    },\n    function (ch) {\n      return ch;\n    }\n  ];\n\n  addr = 'mailto:' + addr;\n\n  addr = addr.replace(/./g, function (ch) {\n    if (ch === '@') {\n      // this *must* be encoded. I insist.\n      ch = encode[Math.floor(Math.random() * 2)](ch);\n    } else if (ch !== ':') {\n      // leave ':' alone (to spot mailto: later)\n      var r = Math.random();\n      // roughly 10% raw, 45% hex, 45% dec\n      ch = (\n        r > 0.9 ? encode[2](ch) : r > 0.45 ? encode[1](ch) : encode[0](ch)\n      );\n    }\n    return ch;\n  });\n\n  addr = '<a href=\"' + addr + '\">' + addr + '</a>';\n  addr = addr.replace(/\">.+:/g, '\">'); // strip the mailto: from the visible part\n\n  return addr;\n});\n\r\n/**\n * Within tags -- meaning between < and > -- encode [\\ ` * _] so they\n * don't conflict with their use in Markdown for code, italics and strong.\n */\nshowdown.subParser('escapeSpecialCharsWithinTagAttributes', function (text) {\n  'use strict';\n\n  // Build a regex to find HTML tags and comments.  See Friedl's\n  // \"Mastering Regular Expressions\", 2nd Ed., pp. 200-201.\n  var regex = /(<[a-z\\/!$](\"[^\"]*\"|'[^']*'|[^'\">])*>|<!(--.*?--\\s*)+>)/gi;\n\n  text = text.replace(regex, function (wholeMatch) {\n    var tag = wholeMatch.replace(/(.)<\\/?code>(?=.)/g, '$1`');\n    tag = showdown.helper.escapeCharacters(tag, '\\\\`*_', false);\n    return tag;\n  });\n\n  return text;\n});\n\r\n/**\n * Handle github codeblocks prior to running HashHTML so that\n * HTML contained within the codeblock gets escaped properly\n * Example:\n * ```ruby\n *     def hello_world(x)\n *       puts \"Hello, #{x}\"\n *     end\n * ```\n */\nshowdown.subParser('githubCodeBlocks', function (text, options, globals) {\n  'use strict';\n\n  // early exit if option is not enabled\n  if (!options.ghCodeBlocks) {\n    return text;\n  }\n\n  text = globals.converter._dispatch('githubCodeBlocks.before', text, options, globals);\n\n  text += '~0';\n\n  text = text.replace(/(?:^|\\n)```(.*)\\n([\\s\\S]*?)\\n```/g, function (wholeMatch, language, codeblock) {\n    var end = (options.omitExtraWLInCodeBlocks) ? '' : '\\n';\n\n    // First parse the github code block\n    codeblock = showdown.subParser('encodeCode')(codeblock);\n    codeblock = showdown.subParser('detab')(codeblock);\n    codeblock = codeblock.replace(/^\\n+/g, ''); // trim leading newlines\n    codeblock = codeblock.replace(/\\n+$/g, ''); // trim trailing whitespace\n\n    codeblock = '<pre><code' + (language ? ' class=\"' + language + ' language-' + language + '\"' : '') + '>' + codeblock + end + '</code></pre>';\n\n    codeblock = showdown.subParser('hashBlock')(codeblock, options, globals);\n\n    // Since GHCodeblocks can be false positives, we need to\n    // store the primitive text and the parsed text in a global var,\n    // and then return a token\n    return '\\n\\n~G' + (globals.ghCodeBlocks.push({text: wholeMatch, codeblock: codeblock}) - 1) + 'G\\n\\n';\n  });\n\n  // attacklab: strip sentinel\n  text = text.replace(/~0/, '');\n\n  return globals.converter._dispatch('githubCodeBlocks.after', text, options, globals);\n});\n\r\nshowdown.subParser('hashBlock', function (text, options, globals) {\n  'use strict';\n  text = text.replace(/(^\\n+|\\n+$)/g, '');\n  return '\\n\\n~K' + (globals.gHtmlBlocks.push(text) - 1) + 'K\\n\\n';\n});\n\r\nshowdown.subParser('hashElement', function (text, options, globals) {\n  'use strict';\n\n  return function (wholeMatch, m1) {\n    var blockText = m1;\n\n    // Undo double lines\n    blockText = blockText.replace(/\\n\\n/g, '\\n');\n    blockText = blockText.replace(/^\\n/, '');\n\n    // strip trailing blank lines\n    blockText = blockText.replace(/\\n+$/g, '');\n\n    // Replace the element text with a marker (\"~KxK\" where x is its key)\n    blockText = '\\n\\n~K' + (globals.gHtmlBlocks.push(blockText) - 1) + 'K\\n\\n';\n\n    return blockText;\n  };\n});\n\r\nshowdown.subParser('hashHTMLBlocks', function (text, options, globals) {\n  'use strict';\n\n  var blockTags = [\n      'pre',\n      'div',\n      'h1',\n      'h2',\n      'h3',\n      'h4',\n      'h5',\n      'h6',\n      'blockquote',\n      'table',\n      'dl',\n      'ol',\n      'ul',\n      'script',\n      'noscript',\n      'form',\n      'fieldset',\n      'iframe',\n      'math',\n      'style',\n      'section',\n      'header',\n      'footer',\n      'nav',\n      'article',\n      'aside',\n      'address',\n      'audio',\n      'canvas',\n      'figure',\n      'hgroup',\n      'output',\n      'video',\n      'p'\n    ],\n    repFunc = function (wholeMatch, match, left, right) {\n      var txt = wholeMatch;\n      // check if this html element is marked as markdown\n      // if so, it's contents should be parsed as markdown\n      if (left.search(/\\bmarkdown\\b/) !== -1) {\n        txt = left + globals.converter.makeHtml(match) + right;\n      }\n      return '\\n\\n~K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\\n\\n';\n    };\n\n  for (var i = 0; i < blockTags.length; ++i) {\n    text = showdown.helper.replaceRecursiveRegExp(text, repFunc, '^ {0,3}<' + blockTags[i] + '\\\\b[^>]*>', '</' + blockTags[i] + '>', 'gim');\n  }\n\n  // HR SPECIAL CASE\n  text = text.replace(/(\\n {0,3}(<(hr)\\b([^<>])*?\\/?>)[ \\t]*(?=\\n{2,}))/g,\n    showdown.subParser('hashElement')(text, options, globals));\n\n  // Special case for standalone HTML comments\n  text = showdown.helper.replaceRecursiveRegExp(text, function (txt) {\n    return '\\n\\n~K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\\n\\n';\n  }, '^ {0,3}<!--', '-->', 'gm');\n\n  // PHP and ASP-style processor instructions (<?...?> and <%...%>)\n  text = text.replace(/(?:\\n\\n)( {0,3}(?:<([?%])[^\\r]*?\\2>)[ \\t]*(?=\\n{2,}))/g,\n    showdown.subParser('hashElement')(text, options, globals));\n\n  return text;\n});\n\r\n/**\n * Hash span elements that should not be parsed as markdown\n */\nshowdown.subParser('hashHTMLSpans', function (text, config, globals) {\n  'use strict';\n\n  var matches = showdown.helper.matchRecursiveRegExp(text, '<code\\\\b[^>]*>', '</code>', 'gi');\n\n  for (var i = 0; i < matches.length; ++i) {\n    text = text.replace(matches[i][0], '~C' + (globals.gHtmlSpans.push(matches[i][0]) - 1) + 'C');\n  }\n  return text;\n});\n\n/**\n * Unhash HTML spans\n */\nshowdown.subParser('unhashHTMLSpans', function (text, config, globals) {\n  'use strict';\n\n  for (var i = 0; i < globals.gHtmlSpans.length; ++i) {\n    text = text.replace('~C' + i + 'C', globals.gHtmlSpans[i]);\n  }\n\n  return text;\n});\n\r\n/**\n * Hash span elements that should not be parsed as markdown\n */\nshowdown.subParser('hashPreCodeTags', function (text, config, globals) {\n  'use strict';\n\n  var repFunc = function (wholeMatch, match, left, right) {\n    // encode html entities\n    var codeblock = left + showdown.subParser('encodeCode')(match) + right;\n    return '\\n\\n~G' + (globals.ghCodeBlocks.push({text: wholeMatch, codeblock: codeblock}) - 1) + 'G\\n\\n';\n  };\n\n  text = showdown.helper.replaceRecursiveRegExp(text, repFunc, '^ {0,3}<pre\\\\b[^>]*>\\\\s*<code\\\\b[^>]*>', '^ {0,3}</code>\\\\s*</pre>', 'gim');\n  return text;\n});\n\r\nshowdown.subParser('headers', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('headers.before', text, options, globals);\n\n  var prefixHeader = options.prefixHeaderId,\n      headerLevelStart = (isNaN(parseInt(options.headerLevelStart))) ? 1 : parseInt(options.headerLevelStart),\n\n  // Set text-style headers:\n  //\tHeader 1\n  //\t========\n  //\n  //\tHeader 2\n  //\t--------\n  //\n      setextRegexH1 = (options.smoothLivePreview) ? /^(.+)[ \\t]*\\n={2,}[ \\t]*\\n+/gm : /^(.+)[ \\t]*\\n=+[ \\t]*\\n+/gm,\n      setextRegexH2 = (options.smoothLivePreview) ? /^(.+)[ \\t]*\\n-{2,}[ \\t]*\\n+/gm : /^(.+)[ \\t]*\\n-+[ \\t]*\\n+/gm;\n\n  text = text.replace(setextRegexH1, function (wholeMatch, m1) {\n\n    var spanGamut = showdown.subParser('spanGamut')(m1, options, globals),\n        hID = (options.noHeaderId) ? '' : ' id=\"' + headerId(m1) + '\"',\n        hLevel = headerLevelStart,\n        hashBlock = '<h' + hLevel + hID + '>' + spanGamut + '</h' + hLevel + '>';\n    return showdown.subParser('hashBlock')(hashBlock, options, globals);\n  });\n\n  text = text.replace(setextRegexH2, function (matchFound, m1) {\n    var spanGamut = showdown.subParser('spanGamut')(m1, options, globals),\n        hID = (options.noHeaderId) ? '' : ' id=\"' + headerId(m1) + '\"',\n        hLevel = headerLevelStart + 1,\n      hashBlock = '<h' + hLevel + hID + '>' + spanGamut + '</h' + hLevel + '>';\n    return showdown.subParser('hashBlock')(hashBlock, options, globals);\n  });\n\n  // atx-style headers:\n  //  # Header 1\n  //  ## Header 2\n  //  ## Header 2 with closing hashes ##\n  //  ...\n  //  ###### Header 6\n  //\n  var atxStyle = (options.requireSpaceBeforeHeadingText) ? /^(#{1,6})[ \\t]+(.+?)[ \\t]*#*\\n+/gm : /^(#{1,6})[ \\t]*(.+?)[ \\t]*#*\\n+/gm;\n\n  text = text.replace(atxStyle, function (wholeMatch, m1, m2) {\n    var span = showdown.subParser('spanGamut')(m2, options, globals),\n        hID = (options.noHeaderId) ? '' : ' id=\"' + headerId(m2) + '\"',\n        hLevel = headerLevelStart - 1 + m1.length,\n        header = '<h' + hLevel + hID + '>' + span + '</h' + hLevel + '>';\n\n    return showdown.subParser('hashBlock')(header, options, globals);\n  });\n\n  function headerId(m) {\n    var title, escapedId = m.replace(/[^\\w]/g, '').toLowerCase();\n\n    if (globals.hashLinkCounts[escapedId]) {\n      title = escapedId + '-' + (globals.hashLinkCounts[escapedId]++);\n    } else {\n      title = escapedId;\n      globals.hashLinkCounts[escapedId] = 1;\n    }\n\n    // Prefix id to prevent causing inadvertent pre-existing style matches.\n    if (prefixHeader === true) {\n      prefixHeader = 'section';\n    }\n\n    if (showdown.helper.isString(prefixHeader)) {\n      return prefixHeader + title;\n    }\n    return title;\n  }\n\n  text = globals.converter._dispatch('headers.after', text, options, globals);\n  return text;\n});\n\r\n/**\n * Turn Markdown image shortcuts into <img> tags.\n */\nshowdown.subParser('images', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('images.before', text, options, globals);\n\n  var inlineRegExp    = /!\\[(.*?)]\\s?\\([ \\t]*()<?(\\S+?)>?(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*(?:(['\"])(.*?)\\6[ \\t]*)?\\)/g,\n      referenceRegExp = /!\\[([^\\]]*?)] ?(?:\\n *)?\\[(.*?)]()()()()()/g;\n\n  function writeImageTag (wholeMatch, altText, linkId, url, width, height, m5, title) {\n\n    var gUrls   = globals.gUrls,\n        gTitles = globals.gTitles,\n        gDims   = globals.gDimensions;\n\n    linkId = linkId.toLowerCase();\n\n    if (!title) {\n      title = '';\n    }\n\n    if (url === '' || url === null) {\n      if (linkId === '' || linkId === null) {\n        // lower-case and turn embedded newlines into spaces\n        linkId = altText.toLowerCase().replace(/ ?\\n/g, ' ');\n      }\n      url = '#' + linkId;\n\n      if (!showdown.helper.isUndefined(gUrls[linkId])) {\n        url = gUrls[linkId];\n        if (!showdown.helper.isUndefined(gTitles[linkId])) {\n          title = gTitles[linkId];\n        }\n        if (!showdown.helper.isUndefined(gDims[linkId])) {\n          width = gDims[linkId].width;\n          height = gDims[linkId].height;\n        }\n      } else {\n        return wholeMatch;\n      }\n    }\n\n    altText = altText.replace(/\"/g, '&quot;');\n    altText = showdown.helper.escapeCharacters(altText, '*_', false);\n    url = showdown.helper.escapeCharacters(url, '*_', false);\n    var result = '<img src=\"' + url + '\" alt=\"' + altText + '\"';\n\n    if (title) {\n      title = title.replace(/\"/g, '&quot;');\n      title = showdown.helper.escapeCharacters(title, '*_', false);\n      result += ' title=\"' + title + '\"';\n    }\n\n    if (width && height) {\n      width  = (width === '*') ? 'auto' : width;\n      height = (height === '*') ? 'auto' : height;\n\n      result += ' width=\"' + width + '\"';\n      result += ' height=\"' + height + '\"';\n    }\n\n    result += ' />';\n\n    return result;\n  }\n\n  // First, handle reference-style labeled images: ![alt text][id]\n  text = text.replace(referenceRegExp, writeImageTag);\n\n  // Next, handle inline images:  ![alt text](url =<width>x<height> \"optional title\")\n  text = text.replace(inlineRegExp, writeImageTag);\n\n  text = globals.converter._dispatch('images.after', text, options, globals);\n  return text;\n});\n\r\nshowdown.subParser('italicsAndBold', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('italicsAndBold.before', text, options, globals);\n\n  if (options.literalMidWordUnderscores) {\n    //underscores\n    // Since we are consuming a \\s character, we need to add it\n    text = text.replace(/(^|\\s|>|\\b)__(?=\\S)([\\s\\S]+?)__(?=\\b|<|\\s|$)/gm, '$1<strong>$2</strong>');\n    text = text.replace(/(^|\\s|>|\\b)_(?=\\S)([\\s\\S]+?)_(?=\\b|<|\\s|$)/gm, '$1<em>$2</em>');\n    //asterisks\n    text = text.replace(/(\\*\\*)(?=\\S)([^\\r]*?\\S[*]*)\\1/g, '<strong>$2</strong>');\n    text = text.replace(/(\\*)(?=\\S)([^\\r]*?\\S)\\1/g, '<em>$2</em>');\n\n  } else {\n    // <strong> must go first:\n    text = text.replace(/(\\*\\*|__)(?=\\S)([^\\r]*?\\S[*_]*)\\1/g, '<strong>$2</strong>');\n    text = text.replace(/(\\*|_)(?=\\S)([^\\r]*?\\S)\\1/g, '<em>$2</em>');\n  }\n\n  text = globals.converter._dispatch('italicsAndBold.after', text, options, globals);\n  return text;\n});\n\r\n/**\n * Form HTML ordered (numbered) and unordered (bulleted) lists.\n */\nshowdown.subParser('lists', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('lists.before', text, options, globals);\n\n  /**\n   * Process the contents of a single ordered or unordered list, splitting it\n   * into individual list items.\n   * @param {string} listStr\n   * @param {boolean} trimTrailing\n   * @returns {string}\n   */\n  function processListItems (listStr, trimTrailing) {\n    // The $g_list_level global keeps track of when we're inside a list.\n    // Each time we enter a list, we increment it; when we leave a list,\n    // we decrement. If it's zero, we're not in a list anymore.\n    //\n    // We do this because when we're not inside a list, we want to treat\n    // something like this:\n    //\n    //    I recommend upgrading to version\n    //    8. Oops, now this line is treated\n    //    as a sub-list.\n    //\n    // As a single paragraph, despite the fact that the second line starts\n    // with a digit-period-space sequence.\n    //\n    // Whereas when we're inside a list (or sub-list), that line will be\n    // treated as the start of a sub-list. What a kludge, huh? This is\n    // an aspect of Markdown's syntax that's hard to parse perfectly\n    // without resorting to mind-reading. Perhaps the solution is to\n    // change the syntax rules such that sub-lists must start with a\n    // starting cardinal number; e.g. \"1.\" or \"a.\".\n    globals.gListLevel++;\n\n    // trim trailing blank lines:\n    listStr = listStr.replace(/\\n{2,}$/, '\\n');\n\n    // attacklab: add sentinel to emulate \\z\n    listStr += '~0';\n\n    var rgx = /(\\n)?(^ {0,3})([*+-]|\\d+[.])[ \\t]+((\\[(x|X| )?])?[ \\t]*[^\\r]+?(\\n{1,2}))(?=\\n*(~0| {0,3}([*+-]|\\d+[.])[ \\t]+))/gm,\n        isParagraphed = (/\\n[ \\t]*\\n(?!~0)/.test(listStr));\n\n    // Since version 1.5, nesting sublists requires 4 spaces (or 1 tab) indentation,\n    // which is a syntax breaking change\n    // activating this option reverts to old behavior\n    if (options.disableForced4SpacesIndentedSublists) {\n      rgx = /(\\n)?(^ {0,3})([*+-]|\\d+[.])[ \\t]+((\\[(x|X| )?])?[ \\t]*[^\\r]+?(\\n{1,2}))(?=\\n*(~0|\\2([*+-]|\\d+[.])[ \\t]+))/gm;\n    }\n\n    listStr = listStr.replace(rgx, function (wholeMatch, m1, m2, m3, m4, taskbtn, checked) {\n      checked = (checked && checked.trim() !== '');\n\n      var item = showdown.subParser('outdent')(m4, options, globals),\n          bulletStyle = '';\n\n      // Support for github tasklists\n      if (taskbtn && options.tasklists) {\n        bulletStyle = ' class=\"task-list-item\" style=\"list-style-type: none;\"';\n        item = item.replace(/^[ \\t]*\\[(x|X| )?]/m, function () {\n          var otp = '<input type=\"checkbox\" disabled style=\"margin: 0px 0.35em 0.25em -1.6em; vertical-align: middle;\"';\n          if (checked) {\n            otp += ' checked';\n          }\n          otp += '>';\n          return otp;\n        });\n      }\n\n      // ISSUE #312\n      // This input: - - - a\n      // causes trouble to the parser, since it interprets it as:\n      // <ul><li><li><li>a</li></li></li></ul>\n      // instead of:\n      // <ul><li>- - a</li></ul>\n      // So, to prevent it, we will put a marker (~A)in the beginning of the line\n      // Kind of hackish/monkey patching, but seems more effective than overcomplicating the list parser\n      item = item.replace(/^([-*+]|\\d\\.)[ \\t]+[\\S\\n ]*/g, function (wm2) {\n        return '~A' + wm2;\n      });\n\n      // m1 - Leading line or\n      // Has a double return (multi paragraph) or\n      // Has sublist\n      if (m1 || (item.search(/\\n{2,}/) > -1)) {\n        item = showdown.subParser('githubCodeBlocks')(item, options, globals);\n        item = showdown.subParser('blockGamut')(item, options, globals);\n      } else {\n        // Recursion for sub-lists:\n        item = showdown.subParser('lists')(item, options, globals);\n        item = item.replace(/\\n$/, ''); // chomp(item)\n        item = showdown.subParser('hashHTMLBlocks')(item, options, globals);\n        item = item.replace(/\\n\\n+/g, '\\n\\n');\n        if (isParagraphed) {\n          item = showdown.subParser('paragraphs')(item, options, globals);\n        } else {\n          item = showdown.subParser('spanGamut')(item, options, globals);\n        }\n      }\n\n      // now we need to remove the marker (~A)\n      item = item.replace('~A', '');\n      // we can finally wrap the line in list item tags\n      item =  '<li' + bulletStyle + '>' + item + '</li>\\n';\n\n      return item;\n    });\n\n    // attacklab: strip sentinel\n    listStr = listStr.replace(/~0/g, '');\n\n    globals.gListLevel--;\n\n    if (trimTrailing) {\n      listStr = listStr.replace(/\\s+$/, '');\n    }\n\n    return listStr;\n  }\n\n  /**\n   * Check and parse consecutive lists (better fix for issue #142)\n   * @param {string} list\n   * @param {string} listType\n   * @param {boolean} trimTrailing\n   * @returns {string}\n   */\n  function parseConsecutiveLists(list, listType, trimTrailing) {\n    // check if we caught 2 or more consecutive lists by mistake\n    // we use the counterRgx, meaning if listType is UL we look for OL and vice versa\n    var olRgx = (options.disableForced4SpacesIndentedSublists) ? /^ ?\\d+\\.[ \\t]/gm : /^ {0,3}\\d+\\.[ \\t]/gm,\n        ulRgx = (options.disableForced4SpacesIndentedSublists) ? /^ ?[*+-][ \\t]/gm : /^ {0,3}[*+-][ \\t]/gm,\n        counterRxg = (listType === 'ul') ? olRgx : ulRgx,\n        result = '';\n\n    if (list.search(counterRxg) !== -1) {\n      (function parseCL(txt) {\n        var pos = txt.search(counterRxg);\n        if (pos !== -1) {\n          // slice\n          result += '\\n<' + listType + '>\\n' + processListItems(txt.slice(0, pos), !!trimTrailing) + '</' + listType + '>\\n';\n\n          // invert counterType and listType\n          listType = (listType === 'ul') ? 'ol' : 'ul';\n          counterRxg = (listType === 'ul') ? olRgx : ulRgx;\n\n          //recurse\n          parseCL(txt.slice(pos));\n        } else {\n          result += '\\n<' + listType + '>\\n' + processListItems(txt, !!trimTrailing) + '</' + listType + '>\\n';\n        }\n      })(list);\n    } else {\n      result = '\\n<' + listType + '>\\n' + processListItems(list, !!trimTrailing) + '</' + listType + '>\\n';\n    }\n\n    return result;\n  }\n\n  // add sentinel to hack around khtml/safari bug:\n  // http://bugs.webkit.org/show_bug.cgi?id=11231\n  text += '~0';\n\n  if (globals.gListLevel) {\n    text = text.replace(/^(( {0,3}([*+-]|\\d+[.])[ \\t]+)[^\\r]+?(~0|\\n{2,}(?=\\S)(?![ \\t]*(?:[*+-]|\\d+[.])[ \\t]+)))/gm,\n      function (wholeMatch, list, m2) {\n        var listType = (m2.search(/[*+-]/g) > -1) ? 'ul' : 'ol';\n        return parseConsecutiveLists(list, listType, true);\n      }\n    );\n  } else {\n    text = text.replace(/(\\n\\n|^\\n?)(( {0,3}([*+-]|\\d+[.])[ \\t]+)[^\\r]+?(~0|\\n{2,}(?=\\S)(?![ \\t]*(?:[*+-]|\\d+[.])[ \\t]+)))/gm,\n      function (wholeMatch, m1, list, m3) {\n        var listType = (m3.search(/[*+-]/g) > -1) ? 'ul' : 'ol';\n        return parseConsecutiveLists(list, listType, false);\n      }\n    );\n  }\n\n  // strip sentinel\n  text = text.replace(/~0/, '');\n  text = globals.converter._dispatch('lists.after', text, options, globals);\n  return text;\n});\n\r\n/**\n * Remove one level of line-leading tabs or spaces\n */\nshowdown.subParser('outdent', function (text) {\n  'use strict';\n\n  // attacklab: hack around Konqueror 3.5.4 bug:\n  // \"----------bug\".replace(/^-/g,\"\") == \"bug\"\n  text = text.replace(/^(\\t|[ ]{1,4})/gm, '~0'); // attacklab: g_tab_width\n\n  // attacklab: clean up hack\n  text = text.replace(/~0/g, '');\n\n  return text;\n});\n\r\n/**\n *\n */\nshowdown.subParser('paragraphs', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('paragraphs.before', text, options, globals);\n  // Strip leading and trailing lines:\n  text = text.replace(/^\\n+/g, '');\n  text = text.replace(/\\n+$/g, '');\n\n  var grafs = text.split(/\\n{2,}/g),\n      grafsOut = [],\n      end = grafs.length; // Wrap <p> tags\n\n  for (var i = 0; i < end; i++) {\n    var str = grafs[i];\n    // if this is an HTML marker, copy it\n    if (str.search(/~(K|G)(\\d+)\\1/g) >= 0) {\n      grafsOut.push(str);\n    } else {\n      str = showdown.subParser('spanGamut')(str, options, globals);\n      str = str.replace(/^([ \\t]*)/g, '<p>');\n      str += '</p>';\n      grafsOut.push(str);\n    }\n  }\n\n  /** Unhashify HTML blocks */\n  end = grafsOut.length;\n  for (i = 0; i < end; i++) {\n    var blockText = '',\n        grafsOutIt = grafsOut[i],\n        codeFlag = false;\n    // if this is a marker for an html block...\n    while (grafsOutIt.search(/~(K|G)(\\d+)\\1/) >= 0) {\n      var delim = RegExp.$1,\n          num   = RegExp.$2;\n\n      if (delim === 'K') {\n        blockText = globals.gHtmlBlocks[num];\n      } else {\n        // we need to check if ghBlock is a false positive\n        if (codeFlag) {\n          // use encoded version of all text\n          blockText = showdown.subParser('encodeCode')(globals.ghCodeBlocks[num].text);\n        } else {\n          blockText = globals.ghCodeBlocks[num].codeblock;\n        }\n      }\n      blockText = blockText.replace(/\\$/g, '$$$$'); // Escape any dollar signs\n\n      grafsOutIt = grafsOutIt.replace(/(\\n\\n)?~(K|G)\\d+\\2(\\n\\n)?/, blockText);\n      // Check if grafsOutIt is a pre->code\n      if (/^<pre\\b[^>]*>\\s*<code\\b[^>]*>/.test(grafsOutIt)) {\n        codeFlag = true;\n      }\n    }\n    grafsOut[i] = grafsOutIt;\n  }\n  text = grafsOut.join('\\n');\n  // Strip leading and trailing lines:\n  text = text.replace(/^\\n+/g, '');\n  text = text.replace(/\\n+$/g, '');\n  return globals.converter._dispatch('paragraphs.after', text, options, globals);\n});\n\r\n/**\n * Run extension\n */\nshowdown.subParser('runExtension', function (ext, text, options, globals) {\n  'use strict';\n\n  if (ext.filter) {\n    text = ext.filter(text, globals.converter, options);\n\n  } else if (ext.regex) {\n    // TODO remove this when old extension loading mechanism is deprecated\n    var re = ext.regex;\n    if (!re instanceof RegExp) {\n      re = new RegExp(re, 'g');\n    }\n    text = text.replace(re, ext.replace);\n  }\n\n  return text;\n});\n\r\n/**\n * These are all the transformations that occur *within* block-level\n * tags like paragraphs, headers, and list items.\n */\nshowdown.subParser('spanGamut', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('spanGamut.before', text, options, globals);\n  text = showdown.subParser('codeSpans')(text, options, globals);\n  text = showdown.subParser('escapeSpecialCharsWithinTagAttributes')(text, options, globals);\n  text = showdown.subParser('encodeBackslashEscapes')(text, options, globals);\n\n  // Process anchor and image tags. Images must come first,\n  // because ![foo][f] looks like an anchor.\n  text = showdown.subParser('images')(text, options, globals);\n  text = showdown.subParser('anchors')(text, options, globals);\n\n  // Make links out of things like `<http://example.com/>`\n  // Must come after _DoAnchors(), because you can use < and >\n  // delimiters in inline links like [this](<url>).\n  text = showdown.subParser('autoLinks')(text, options, globals);\n  text = showdown.subParser('encodeAmpsAndAngles')(text, options, globals);\n  text = showdown.subParser('italicsAndBold')(text, options, globals);\n  text = showdown.subParser('strikethrough')(text, options, globals);\n\n  // Do hard breaks\n  if (options.simpleLineBreaks) {\n    // GFM style hard breaks\n    text = text.replace(/\\b\\n\\b/g, '<br />\\n');\n  } else {\n    // Vanilla hard breaks\n    text = text.replace(/\\b  +\\n\\b/g, '<br />\\n');\n  }\n\n  text = globals.converter._dispatch('spanGamut.after', text, options, globals);\n  return text;\n});\n\r\nshowdown.subParser('strikethrough', function (text, options, globals) {\n  'use strict';\n\n  if (options.strikethrough) {\n    text = globals.converter._dispatch('strikethrough.before', text, options, globals);\n    text = text.replace(/(?:~T){2}([\\s\\S]+?)(?:~T){2}/g, '<del>$1</del>');\n    text = globals.converter._dispatch('strikethrough.after', text, options, globals);\n  }\n\n  return text;\n});\n\r\n/**\n * Strip any lines consisting only of spaces and tabs.\n * This makes subsequent regexs easier to write, because we can\n * match consecutive blank lines with /\\n+/ instead of something\n * contorted like /[ \\t]*\\n+/\n */\nshowdown.subParser('stripBlankLines', function (text) {\n  'use strict';\n  return text.replace(/^[ \\t]+$/mg, '');\n});\n\r\n/**\n * Strips link definitions from text, stores the URLs and titles in\n * hash references.\n * Link defs are in the form: ^[id]: url \"optional title\"\n */\nshowdown.subParser('stripLinkDefinitions', function (text, options, globals) {\n  'use strict';\n\n  var regex = /^ {0,3}\\[(.+)]:[ \\t]*\\n?[ \\t]*<?(\\S+?)>?(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*\\n?[ \\t]*(?:(\\n*)[\"|'(](.+?)[\"|')][ \\t]*)?(?:\\n+|(?=~0))/gm;\n\n  // attacklab: sentinel workarounds for lack of \\A and \\Z, safari\\khtml bug\n  text += '~0';\n\n  text = text.replace(regex, function (wholeMatch, linkId, url, width, height, blankLines, title) {\n    linkId = linkId.toLowerCase();\n    globals.gUrls[linkId] = showdown.subParser('encodeAmpsAndAngles')(url);  // Link IDs are case-insensitive\n\n    if (blankLines) {\n      // Oops, found blank lines, so it's not a title.\n      // Put back the parenthetical statement we stole.\n      return blankLines + title;\n\n    } else {\n      if (title) {\n        globals.gTitles[linkId] = title.replace(/\"|'/g, '&quot;');\n      }\n      if (options.parseImgDimensions && width && height) {\n        globals.gDimensions[linkId] = {\n          width:  width,\n          height: height\n        };\n      }\n    }\n    // Completely remove the definition from the text\n    return '';\n  });\n\n  // attacklab: strip sentinel\n  text = text.replace(/~0/, '');\n\n  return text;\n});\n\r\nshowdown.subParser('tables', function (text, options, globals) {\n  'use strict';\n\n  if (!options.tables) {\n    return text;\n  }\n\n  var tableRgx = /^ {0,3}\\|?.+\\|.+\\n[ \\t]{0,3}\\|?[ \\t]*:?[ \\t]*(?:-|=){2,}[ \\t]*:?[ \\t]*\\|[ \\t]*:?[ \\t]*(?:-|=){2,}[\\s\\S]+?(?:\\n\\n|~0)/gm;\n\n  function parseStyles(sLine) {\n    if (/^:[ \\t]*--*$/.test(sLine)) {\n      return ' style=\"text-align:left;\"';\n    } else if (/^--*[ \\t]*:[ \\t]*$/.test(sLine)) {\n      return ' style=\"text-align:right;\"';\n    } else if (/^:[ \\t]*--*[ \\t]*:$/.test(sLine)) {\n      return ' style=\"text-align:center;\"';\n    } else {\n      return '';\n    }\n  }\n\n  function parseHeaders(header, style) {\n    var id = '';\n    header = header.trim();\n    if (options.tableHeaderId) {\n      id = ' id=\"' + header.replace(/ /g, '_').toLowerCase() + '\"';\n    }\n    header = showdown.subParser('spanGamut')(header, options, globals);\n\n    return '<th' + id + style + '>' + header + '</th>\\n';\n  }\n\n  function parseCells(cell, style) {\n    var subText = showdown.subParser('spanGamut')(cell, options, globals);\n    return '<td' + style + '>' + subText + '</td>\\n';\n  }\n\n  function buildTable(headers, cells) {\n    var tb = '<table>\\n<thead>\\n<tr>\\n',\n        tblLgn = headers.length;\n\n    for (var i = 0; i < tblLgn; ++i) {\n      tb += headers[i];\n    }\n    tb += '</tr>\\n</thead>\\n<tbody>\\n';\n\n    for (i = 0; i < cells.length; ++i) {\n      tb += '<tr>\\n';\n      for (var ii = 0; ii < tblLgn; ++ii) {\n        tb += cells[i][ii];\n      }\n      tb += '</tr>\\n';\n    }\n    tb += '</tbody>\\n</table>\\n';\n    return tb;\n  }\n\n  text = globals.converter._dispatch('tables.before', text, options, globals);\n\n  text = text.replace(tableRgx, function (rawTable) {\n\n    var i, tableLines = rawTable.split('\\n');\n\n    // strip wrong first and last column if wrapped tables are used\n    for (i = 0; i < tableLines.length; ++i) {\n      if (/^ {0,3}\\|/.test(tableLines[i])) {\n        tableLines[i] = tableLines[i].replace(/^ {0,3}\\|/, '');\n      }\n      if (/\\|[ \\t]*$/.test(tableLines[i])) {\n        tableLines[i] = tableLines[i].replace(/\\|[ \\t]*$/, '');\n      }\n    }\n\n    var rawHeaders = tableLines[0].split('|').map(function (s) { return s.trim();}),\n        rawStyles = tableLines[1].split('|').map(function (s) { return s.trim();}),\n        rawCells = [],\n        headers = [],\n        styles = [],\n        cells = [];\n\n    tableLines.shift();\n    tableLines.shift();\n\n    for (i = 0; i < tableLines.length; ++i) {\n      if (tableLines[i].trim() === '') {\n        continue;\n      }\n      rawCells.push(\n        tableLines[i]\n          .split('|')\n          .map(function (s) {\n            return s.trim();\n          })\n      );\n    }\n\n    if (rawHeaders.length < rawStyles.length) {\n      return rawTable;\n    }\n\n    for (i = 0; i < rawStyles.length; ++i) {\n      styles.push(parseStyles(rawStyles[i]));\n    }\n\n    for (i = 0; i < rawHeaders.length; ++i) {\n      if (showdown.helper.isUndefined(styles[i])) {\n        styles[i] = '';\n      }\n      headers.push(parseHeaders(rawHeaders[i], styles[i]));\n    }\n\n    for (i = 0; i < rawCells.length; ++i) {\n      var row = [];\n      for (var ii = 0; ii < headers.length; ++ii) {\n        if (showdown.helper.isUndefined(rawCells[i][ii])) {\n\n        }\n        row.push(parseCells(rawCells[i][ii], styles[ii]));\n      }\n      cells.push(row);\n    }\n\n    return buildTable(headers, cells);\n  });\n\n  text = globals.converter._dispatch('tables.after', text, options, globals);\n\n  return text;\n});\n\r\n/**\n * Swap back in all the special characters we've hidden.\n */\nshowdown.subParser('unescapeSpecialChars', function (text) {\n  'use strict';\n\n  text = text.replace(/~E(\\d+)E/g, function (wholeMatch, m1) {\n    var charCodeToReplace = parseInt(m1);\n    return String.fromCharCode(charCodeToReplace);\n  });\n  return text;\n});\n\r\nvar root = this;\n\n// CommonJS/nodeJS Loader\nif (typeof module !== 'undefined' && module.exports) {\n  module.exports = showdown;\n\n// AMD Loader\n} else if (typeof define === 'function' && define.amd) {\n  define(function () {\n    'use strict';\n    return showdown;\n  });\n\n// Regular Browser loader\n} else {\n  root.showdown = showdown;\n}\n}).call(this);\r\n\n//# sourceMappingURL=showdown.js.map\r\n"
  },
  {
    "path": "index.d.ts",
    "content": "declare module 'noty' {\n\texport = Noty;\n}\n\ndeclare class Noty {\n\tconstructor(options?: Noty.Options);\n\n\t/**\n\t * Show a NOTY\n\t */\n\tshow: () => void;\n\n\t/**\n\t * Close a NOTY\n\t */\n\tclose: () => void;\n\n\t/**\n\t * Notification text updater. Important: .noty_body class is required for setText API method\n\t */\n\tsetText: (text: string, overrideConstructorOption?: true) => void;\n\n\t/**\n\t * Notification type updater\n\t */\n\tsetType: (type: Noty.Type, overrideConstructorOption?: true) => void;\n\n\t/**\n\t * Notification theme updater\n\t */\n\tsetTheme: (theme: Noty.Theme, overrideConstructorOption?: true) => void;\n\n\t/**\n\t * false (clears timeout) or integer (clears timer, starts for given value)\n\t */\n\tsetTimeout: (option: false | number) => void; //\n\n\t/**\n\t * Clears the timeout\n\t */\n\tstop: () => void;\n\n\t/**\n\t * Restarts the timeout\n\t */\n\tresume: () => void;\n\n\t/**\n\t * Register event handlers for Noty outside of constructior options\n\t * Important: You need to call on() methods before the show() method\n\t */\n\ton: (eventName: Noty.Event, callback: Function) => void;\n\n\t/**\n\t * Without queue name: Closes all notifications\n\t * With queue name: Closes all notifications for the named queue\n\t */\n\tstatic closeAll: (queueName?: string) => void;\n\n\t/**\n\t * Without queue name: Sets the maxVisible notification count for global queue\n\t * With parameter: Sets the maxVisible notification count for the named queue\n\t */\n\tstatic setMaxVisible: (max: number, queueName?: string) => void;\n\n\t/**\n\t * Change default values for new instances of NOTY\n\t */\n\tstatic overrideDefaults: (obj: { [i: string]: any }) => Noty;\n\n\tstatic button: (text: string, classNames: string, cb: Function, attributes?: any) => Noty.Button;\n}\n\ndeclare namespace Noty {\n\ttype Type = 'alert' | 'success' | 'warning' | 'error' | 'info' | 'information';\n\ttype Theme = string;\n\ttype Layout = 'top' | 'topLeft' | 'topCenter' | 'topRight' | 'center' | 'centerLeft' | 'centerRight' | 'bottom' | 'bottomLeft' | 'bottomCenter' | 'bottomRight';\n\ttype Event = 'beforeShow' | 'onShow' | 'afterShow' | 'onClose' | 'afterClose' | 'onHover' | 'onTemplate' | 'onClick';\n\n\tinterface Button {\n\t\tnew(text: string, classNames: string, cb: Function, attributes: any) : Noty.Button\n\t}\n\n\tinterface Options {\n\t\ttype?: Noty.Type;\n\t\tlayout?: Noty.Layout;\n\t\ttheme?: Noty.Theme;\n\t\ttext?: string;\n\t\ttimeout?: false | number;\n\t\tprogressBar?: boolean;\n\t\tcloseWith?: ('click' | 'button')[];\n\t\tanimation?: {\n\t\t\topen?: string | null | Function,\n\t\t\tclose?: string | null | Function\n\t\t};\n\t\tid?: false | string;\n\t\tforce?: boolean;\n\t\tkiller?: boolean | string;\n\t\tqueue?: string;\n\t\tcontainer?: false | string;\n\t\tbuttons?: Noty.Button[],\n\t\tcallbacks?: {\n\t\t\tbeforeShow?: () => void,\n\t\t\tonShow?: () => void,\n\t\t\tafterShow?: () => void,\n\t\t\tonClose?: () => void,\n\t\t\tafterClose?: () => void,\n\t\t\tonHover?: () => void,\n\t\t\tonTemplate?: () => void,\n\t\t\tonClick?: () => void\n\t\t};\n\t\tsounds?: {\n\t\t\tsources?: string[],\n\t\t\tvolume?: number,\n\t\t\tconditions?: string[]\n\t\t};\n\t\tdocTitle?: {\n\t\t\tconditions?: string[]\n\t\t};\n\t\tmodal?: boolean,\n\t}\n}\n"
  },
  {
    "path": "lib/noty.css",
    "content": ".noty_layout_mixin, #noty_layout__top, #noty_layout__topLeft, #noty_layout__topCenter, #noty_layout__topRight, #noty_layout__bottom, #noty_layout__bottomLeft, #noty_layout__bottomCenter, #noty_layout__bottomRight, #noty_layout__center, #noty_layout__centerLeft, #noty_layout__centerRight {\n  position: fixed;\n  margin: 0;\n  padding: 0;\n  z-index: 9999999;\n  -webkit-transform: translateZ(0) scale(1, 1);\n          transform: translateZ(0) scale(1, 1);\n  -webkit-backface-visibility: hidden;\n          backface-visibility: hidden;\n  -webkit-font-smoothing: subpixel-antialiased;\n  filter: blur(0);\n  -webkit-filter: blur(0);\n  max-width: 90%; }\n\n#noty_layout__top {\n  top: 0;\n  left: 5%;\n  width: 90%; }\n\n#noty_layout__topLeft {\n  top: 20px;\n  left: 20px;\n  width: 325px; }\n\n#noty_layout__topCenter {\n  top: 5%;\n  left: 50%;\n  width: 325px;\n  -webkit-transform: translate(-webkit-calc(-50% - .5px)) translateZ(0) scale(1, 1);\n          transform: translate(calc(-50% - .5px)) translateZ(0) scale(1, 1); }\n\n#noty_layout__topRight {\n  top: 20px;\n  right: 20px;\n  width: 325px; }\n\n#noty_layout__bottom {\n  bottom: 0;\n  left: 5%;\n  width: 90%; }\n\n#noty_layout__bottomLeft {\n  bottom: 20px;\n  left: 20px;\n  width: 325px; }\n\n#noty_layout__bottomCenter {\n  bottom: 5%;\n  left: 50%;\n  width: 325px;\n  -webkit-transform: translate(-webkit-calc(-50% - .5px)) translateZ(0) scale(1, 1);\n          transform: translate(calc(-50% - .5px)) translateZ(0) scale(1, 1); }\n\n#noty_layout__bottomRight {\n  bottom: 20px;\n  right: 20px;\n  width: 325px; }\n\n#noty_layout__center {\n  top: 50%;\n  left: 50%;\n  width: 325px;\n  -webkit-transform: translate(-webkit-calc(-50% - .5px), -webkit-calc(-50% - .5px)) translateZ(0) scale(1, 1);\n          transform: translate(calc(-50% - .5px), calc(-50% - .5px)) translateZ(0) scale(1, 1); }\n\n#noty_layout__centerLeft {\n  top: 50%;\n  left: 20px;\n  width: 325px;\n  -webkit-transform: translate(0, -webkit-calc(-50% - .5px)) translateZ(0) scale(1, 1);\n          transform: translate(0, calc(-50% - .5px)) translateZ(0) scale(1, 1); }\n\n#noty_layout__centerRight {\n  top: 50%;\n  right: 20px;\n  width: 325px;\n  -webkit-transform: translate(0, -webkit-calc(-50% - .5px)) translateZ(0) scale(1, 1);\n          transform: translate(0, calc(-50% - .5px)) translateZ(0) scale(1, 1); }\n\n.noty_progressbar {\n  display: none; }\n\n.noty_has_timeout.noty_has_progressbar .noty_progressbar {\n  display: block;\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  height: 3px;\n  width: 100%;\n  background-color: #646464;\n  opacity: 0.2;\n  filter: alpha(opacity=10); }\n\n.noty_bar {\n  -webkit-backface-visibility: hidden;\n  -webkit-transform: translate(0, 0) translateZ(0) scale(1, 1);\n  -ms-transform: translate(0, 0) scale(1, 1);\n      transform: translate(0, 0) scale(1, 1);\n  -webkit-font-smoothing: subpixel-antialiased;\n  overflow: hidden; }\n\n.noty_effects_open {\n  opacity: 0;\n  -webkit-transform: translate(50%);\n      -ms-transform: translate(50%);\n          transform: translate(50%);\n  -webkit-animation: noty_anim_in 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);\n          animation: noty_anim_in 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);\n  -webkit-animation-fill-mode: forwards;\n          animation-fill-mode: forwards; }\n\n.noty_effects_close {\n  -webkit-animation: noty_anim_out 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);\n          animation: noty_anim_out 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);\n  -webkit-animation-fill-mode: forwards;\n          animation-fill-mode: forwards; }\n\n.noty_fix_effects_height {\n  -webkit-animation: noty_anim_height 75ms ease-out;\n          animation: noty_anim_height 75ms ease-out; }\n\n.noty_close_with_click {\n  cursor: pointer; }\n\n.noty_close_button {\n  position: absolute;\n  top: 2px;\n  right: 2px;\n  font-weight: bold;\n  width: 20px;\n  height: 20px;\n  text-align: center;\n  line-height: 20px;\n  background-color: rgba(0, 0, 0, 0.05);\n  border-radius: 2px;\n  cursor: pointer;\n  -webkit-transition: all .2s ease-out;\n  transition: all .2s ease-out; }\n\n.noty_close_button:hover {\n  background-color: rgba(0, 0, 0, 0.1); }\n\n.noty_modal {\n  position: fixed;\n  width: 100%;\n  height: 100%;\n  background-color: #000;\n  z-index: 10000;\n  opacity: .3;\n  left: 0;\n  top: 0; }\n\n.noty_modal.noty_modal_open {\n  opacity: 0;\n  -webkit-animation: noty_modal_in .3s ease-out;\n          animation: noty_modal_in .3s ease-out; }\n\n.noty_modal.noty_modal_close {\n  -webkit-animation: noty_modal_out .3s ease-out;\n          animation: noty_modal_out .3s ease-out;\n  -webkit-animation-fill-mode: forwards;\n          animation-fill-mode: forwards; }\n\n@-webkit-keyframes noty_modal_in {\n  100% {\n    opacity: .3; } }\n\n@keyframes noty_modal_in {\n  100% {\n    opacity: .3; } }\n\n@-webkit-keyframes noty_modal_out {\n  100% {\n    opacity: 0; } }\n\n@keyframes noty_modal_out {\n  100% {\n    opacity: 0; } }\n\n@keyframes noty_modal_out {\n  100% {\n    opacity: 0; } }\n\n@-webkit-keyframes noty_anim_in {\n  100% {\n    -webkit-transform: translate(0);\n            transform: translate(0);\n    opacity: 1; } }\n\n@keyframes noty_anim_in {\n  100% {\n    -webkit-transform: translate(0);\n            transform: translate(0);\n    opacity: 1; } }\n\n@-webkit-keyframes noty_anim_out {\n  100% {\n    -webkit-transform: translate(50%);\n            transform: translate(50%);\n    opacity: 0; } }\n\n@keyframes noty_anim_out {\n  100% {\n    -webkit-transform: translate(50%);\n            transform: translate(50%);\n    opacity: 0; } }\n\n@-webkit-keyframes noty_anim_height {\n  100% {\n    height: 0; } }\n\n@keyframes noty_anim_height {\n  100% {\n    height: 0; } }\n\n/*# sourceMappingURL=noty.css.map*/"
  },
  {
    "path": "lib/noty.js",
    "content": "/* \r\n  @package NOTY - Dependency-free notification library \r\n  @version version: 3.2.0-beta \r\n  @contributors https://github.com/needim/noty/graphs/contributors \r\n  @documentation Examples and Documentation - https://ned.im/noty \r\n  @license Licensed under the MIT licenses: http://www.opensource.org/licenses/mit-license.php \r\n*/\r\n\r\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"Noty\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Noty\"] = factory();\n\telse\n\t\troot[\"Noty\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// identity function for calling harmony imports with the correct context\n/******/ \t__webpack_require__.i = function(value) { return value; };\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 6);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.css = exports.deepExtend = exports.animationEndEvents = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.inArray = inArray;\nexports.stopPropagation = stopPropagation;\nexports.generateID = generateID;\nexports.outerHeight = outerHeight;\nexports.addListener = addListener;\nexports.hasClass = hasClass;\nexports.addClass = addClass;\nexports.removeClass = removeClass;\nexports.remove = remove;\nexports.classList = classList;\nexports.visibilityChangeFlow = visibilityChangeFlow;\nexports.createAudioElements = createAudioElements;\n\nvar _api = __webpack_require__(1);\n\nvar API = _interopRequireWildcard(_api);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar animationEndEvents = exports.animationEndEvents = 'webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend';\n\nfunction inArray(needle, haystack, argStrict) {\n  var key = void 0;\n  var strict = !!argStrict;\n\n  if (strict) {\n    for (key in haystack) {\n      if (haystack.hasOwnProperty(key) && haystack[key] === needle) {\n        return true;\n      }\n    }\n  } else {\n    for (key in haystack) {\n      if (haystack.hasOwnProperty(key) && haystack[key] === needle) {\n        return true;\n      }\n    }\n  }\n  return false;\n}\n\nfunction stopPropagation(evt) {\n  evt = evt || window.event;\n\n  if (typeof evt.stopPropagation !== 'undefined') {\n    evt.stopPropagation();\n  } else {\n    evt.cancelBubble = true;\n  }\n}\n\nvar deepExtend = exports.deepExtend = function deepExtend(out) {\n  out = out || {};\n\n  for (var i = 1; i < arguments.length; i++) {\n    var obj = arguments[i];\n\n    if (!obj) continue;\n\n    for (var key in obj) {\n      if (obj.hasOwnProperty(key)) {\n        if (Array.isArray(obj[key])) {\n          out[key] = obj[key];\n        } else if (_typeof(obj[key]) === 'object' && obj[key] !== null) {\n          out[key] = deepExtend(out[key], obj[key]);\n        } else {\n          out[key] = obj[key];\n        }\n      }\n    }\n  }\n\n  return out;\n};\n\nfunction generateID() {\n  var prefix = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n  var id = 'noty_' + prefix + '_';\n\n  id += 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n    var r = Math.random() * 16 | 0;\n    var v = c === 'x' ? r : r & 0x3 | 0x8;\n    return v.toString(16);\n  });\n\n  return id;\n}\n\nfunction outerHeight(el) {\n  var height = el.offsetHeight;\n  var style = window.getComputedStyle(el);\n\n  height += parseInt(style.marginTop) + parseInt(style.marginBottom);\n  return height;\n}\n\nvar css = exports.css = function () {\n  var cssPrefixes = ['Webkit', 'O', 'Moz', 'ms'];\n  var cssProps = {};\n\n  function camelCase(string) {\n    return string.replace(/^-ms-/, 'ms-').replace(/-([\\da-z])/gi, function (match, letter) {\n      return letter.toUpperCase();\n    });\n  }\n\n  function getVendorProp(name) {\n    var style = document.body.style;\n    if (name in style) return name;\n\n    var i = cssPrefixes.length;\n    var capName = name.charAt(0).toUpperCase() + name.slice(1);\n    var vendorName = void 0;\n\n    while (i--) {\n      vendorName = cssPrefixes[i] + capName;\n      if (vendorName in style) return vendorName;\n    }\n\n    return name;\n  }\n\n  function getStyleProp(name) {\n    name = camelCase(name);\n    return cssProps[name] || (cssProps[name] = getVendorProp(name));\n  }\n\n  function applyCss(element, prop, value) {\n    prop = getStyleProp(prop);\n    element.style[prop] = value;\n  }\n\n  return function (element, properties) {\n    var args = arguments;\n    var prop = void 0;\n    var value = void 0;\n\n    if (args.length === 2) {\n      for (prop in properties) {\n        if (properties.hasOwnProperty(prop)) {\n          value = properties[prop];\n          if (value !== undefined && properties.hasOwnProperty(prop)) {\n            applyCss(element, prop, value);\n          }\n        }\n      }\n    } else {\n      applyCss(element, args[1], args[2]);\n    }\n  };\n}();\n\nfunction addListener(el, events, cb) {\n  var useCapture = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n  events = events.split(' ');\n  for (var i = 0; i < events.length; i++) {\n    if (document.addEventListener) {\n      el.addEventListener(events[i], cb, useCapture);\n    } else if (document.attachEvent) {\n      el.attachEvent('on' + events[i], cb);\n    }\n  }\n}\n\nfunction hasClass(element, name) {\n  var list = typeof element === 'string' ? element : classList(element);\n  return list.indexOf(' ' + name + ' ') >= 0;\n}\n\nfunction addClass(element, name) {\n  var oldList = classList(element);\n  var newList = oldList + name;\n\n  if (hasClass(oldList, name)) return;\n\n  // Trim the opening space.\n  element.className = newList.substring(1);\n}\n\nfunction removeClass(element, name) {\n  var oldList = classList(element);\n  var newList = void 0;\n\n  if (!hasClass(element, name)) return;\n\n  // Replace the class name.\n  newList = oldList.replace(' ' + name + ' ', ' ');\n\n  // Trim the opening and closing spaces.\n  element.className = newList.substring(1, newList.length - 1);\n}\n\nfunction remove(element) {\n  if (element.parentNode) {\n    element.parentNode.removeChild(element);\n  }\n}\n\nfunction classList(element) {\n  return (' ' + (element && element.className || '') + ' ').replace(/\\s+/gi, ' ');\n}\n\nfunction visibilityChangeFlow() {\n  var hidden = void 0;\n  var visibilityChange = void 0;\n  if (typeof document.hidden !== 'undefined') {\n    // Opera 12.10 and Firefox 18 and later support\n    hidden = 'hidden';\n    visibilityChange = 'visibilitychange';\n  } else if (typeof document.msHidden !== 'undefined') {\n    hidden = 'msHidden';\n    visibilityChange = 'msvisibilitychange';\n  } else if (typeof document.webkitHidden !== 'undefined') {\n    hidden = 'webkitHidden';\n    visibilityChange = 'webkitvisibilitychange';\n  }\n\n  function onVisibilityChange() {\n    API.PageHidden = document[hidden];\n    handleVisibilityChange();\n  }\n\n  function onBlur() {\n    API.PageHidden = true;\n    handleVisibilityChange();\n  }\n\n  function onFocus() {\n    API.PageHidden = false;\n    handleVisibilityChange();\n  }\n\n  function handleVisibilityChange() {\n    if (API.PageHidden) stopAll();else resumeAll();\n  }\n\n  function stopAll() {\n    setTimeout(function () {\n      Object.keys(API.Store).forEach(function (id) {\n        if (API.Store.hasOwnProperty(id)) {\n          if (API.Store[id].options.visibilityControl) {\n            API.Store[id].stop();\n          }\n        }\n      });\n    }, 100);\n  }\n\n  function resumeAll() {\n    setTimeout(function () {\n      Object.keys(API.Store).forEach(function (id) {\n        if (API.Store.hasOwnProperty(id)) {\n          if (API.Store[id].options.visibilityControl) {\n            API.Store[id].resume();\n          }\n        }\n      });\n      API.queueRenderAll();\n    }, 100);\n  }\n\n  if (visibilityChange) {\n    addListener(document, visibilityChange, onVisibilityChange);\n  }\n\n  addListener(window, 'blur', onBlur);\n  addListener(window, 'focus', onFocus);\n}\n\nfunction createAudioElements(ref) {\n  if (ref.hasSound) {\n    var audioElement = document.createElement('audio');\n\n    ref.options.sounds.sources.forEach(function (s) {\n      var source = document.createElement('source');\n      source.src = s;\n      source.type = 'audio/' + getExtension(s);\n      audioElement.appendChild(source);\n    });\n\n    if (ref.barDom) {\n      ref.barDom.appendChild(audioElement);\n    } else {\n      document.querySelector('body').appendChild(audioElement);\n    }\n\n    audioElement.volume = ref.options.sounds.volume;\n\n    if (!ref.soundPlayed) {\n      audioElement.play();\n      ref.soundPlayed = true;\n    }\n\n    audioElement.onended = function () {\n      remove(audioElement);\n    };\n  }\n}\n\nfunction getExtension(fileName) {\n  return fileName.match(/\\.([^.]+)$/)[1];\n}\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Defaults = exports.Store = exports.Queues = exports.DefaultMaxVisible = exports.docTitle = exports.DocModalCount = exports.PageHidden = undefined;\nexports.getQueueCounts = getQueueCounts;\nexports.addToQueue = addToQueue;\nexports.removeFromQueue = removeFromQueue;\nexports.queueRender = queueRender;\nexports.queueRenderAll = queueRenderAll;\nexports.ghostFix = ghostFix;\nexports.build = build;\nexports.hasButtons = hasButtons;\nexports.handleModal = handleModal;\nexports.handleModalClose = handleModalClose;\nexports.queueClose = queueClose;\nexports.dequeueClose = dequeueClose;\nexports.fire = fire;\nexports.openFlow = openFlow;\nexports.closeFlow = closeFlow;\n\nvar _utils = __webpack_require__(0);\n\nvar Utils = _interopRequireWildcard(_utils);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar PageHidden = exports.PageHidden = false;\nvar DocModalCount = exports.DocModalCount = 0;\n\nvar DocTitleProps = {\n  originalTitle: null,\n  count: 0,\n  changed: false,\n  timer: -1\n};\n\nvar docTitle = exports.docTitle = {\n  increment: function increment() {\n    DocTitleProps.count++;\n\n    docTitle._update();\n  },\n\n  decrement: function decrement() {\n    DocTitleProps.count--;\n\n    if (DocTitleProps.count <= 0) {\n      docTitle._clear();\n      return;\n    }\n\n    docTitle._update();\n  },\n\n  _update: function _update() {\n    var title = document.title;\n\n    if (!DocTitleProps.changed) {\n      DocTitleProps.originalTitle = title;\n      document.title = '(' + DocTitleProps.count + ') ' + title;\n      DocTitleProps.changed = true;\n    } else {\n      document.title = '(' + DocTitleProps.count + ') ' + DocTitleProps.originalTitle;\n    }\n  },\n\n  _clear: function _clear() {\n    if (DocTitleProps.changed) {\n      DocTitleProps.count = 0;\n      document.title = DocTitleProps.originalTitle;\n      DocTitleProps.changed = false;\n    }\n  }\n};\n\nvar DefaultMaxVisible = exports.DefaultMaxVisible = 5;\n\nvar Queues = exports.Queues = {\n  global: {\n    maxVisible: DefaultMaxVisible,\n    queue: []\n  }\n};\n\nvar Store = exports.Store = {};\n\nvar Defaults = exports.Defaults = {\n  type: 'alert',\n  layout: 'topRight',\n  theme: 'mint',\n  text: '',\n  timeout: false,\n  progressBar: true,\n  closeWith: ['click'],\n  animation: {\n    open: 'noty_effects_open',\n    close: 'noty_effects_close'\n  },\n  id: false,\n  force: false,\n  killer: false,\n  queue: 'global',\n  container: false,\n  buttons: [],\n  callbacks: {\n    beforeShow: null,\n    onShow: null,\n    afterShow: null,\n    onClose: null,\n    afterClose: null,\n    onClick: null,\n    onHover: null,\n    onTemplate: null\n  },\n  sounds: {\n    sources: [],\n    volume: 1,\n    conditions: []\n  },\n  titleCount: {\n    conditions: []\n  },\n  modal: false,\n  visibilityControl: false\n\n  /**\r\n   * @param {string} queueName\r\n   * @return {object}\r\n   */\n};function getQueueCounts() {\n  var queueName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'global';\n\n  var count = 0;\n  var max = DefaultMaxVisible;\n\n  if (Queues.hasOwnProperty(queueName)) {\n    max = Queues[queueName].maxVisible;\n    Object.keys(Store).forEach(function (i) {\n      if (Store[i].options.queue === queueName && !Store[i].closed) count++;\n    });\n  }\n\n  return {\n    current: count,\n    maxVisible: max\n  };\n}\n\n/**\r\n * @param {Noty} ref\r\n * @return {void}\r\n */\nfunction addToQueue(ref) {\n  if (!Queues.hasOwnProperty(ref.options.queue)) {\n    Queues[ref.options.queue] = { maxVisible: DefaultMaxVisible, queue: [] };\n  }\n\n  Queues[ref.options.queue].queue.push(ref);\n}\n\n/**\r\n * @param {Noty} ref\r\n * @return {void}\r\n */\nfunction removeFromQueue(ref) {\n  if (Queues.hasOwnProperty(ref.options.queue)) {\n    var queue = [];\n    Object.keys(Queues[ref.options.queue].queue).forEach(function (i) {\n      if (Queues[ref.options.queue].queue[i].id !== ref.id) {\n        queue.push(Queues[ref.options.queue].queue[i]);\n      }\n    });\n    Queues[ref.options.queue].queue = queue;\n  }\n}\n\n/**\r\n * @param {string} queueName\r\n * @return {void}\r\n */\nfunction queueRender() {\n  var queueName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'global';\n\n  if (Queues.hasOwnProperty(queueName)) {\n    var noty = Queues[queueName].queue.shift();\n\n    if (noty) noty.show();\n  }\n}\n\n/**\r\n * @return {void}\r\n */\nfunction queueRenderAll() {\n  Object.keys(Queues).forEach(function (queueName) {\n    queueRender(queueName);\n  });\n}\n\n/**\r\n * @param {Noty} ref\r\n * @return {void}\r\n */\nfunction ghostFix(ref) {\n  var ghostID = Utils.generateID('ghost');\n  var ghost = document.createElement('div');\n  ghost.setAttribute('id', ghostID);\n  Utils.css(ghost, {\n    height: Utils.outerHeight(ref.barDom) + 'px'\n  });\n\n  ref.barDom.insertAdjacentHTML('afterend', ghost.outerHTML);\n\n  Utils.remove(ref.barDom);\n  ghost = document.getElementById(ghostID);\n  Utils.addClass(ghost, 'noty_fix_effects_height');\n  Utils.addListener(ghost, Utils.animationEndEvents, function () {\n    Utils.remove(ghost);\n  });\n}\n\n/**\r\n * @param {Noty} ref\r\n * @return {void}\r\n */\nfunction build(ref) {\n  findOrCreateContainer(ref);\n\n  var markup = '<div class=\"noty_body\">' + ref.options.text + '</div>' + buildButtons(ref) + '<div class=\"noty_progressbar\"></div>';\n\n  ref.barDom = document.createElement('div');\n  ref.barDom.setAttribute('id', ref.id);\n  Utils.addClass(ref.barDom, 'noty_bar noty_type__' + ref.options.type + ' noty_theme__' + ref.options.theme);\n\n  ref.barDom.innerHTML = markup;\n\n  fire(ref, 'onTemplate');\n}\n\n/**\r\n * @param {Noty} ref\r\n * @return {boolean}\r\n */\nfunction hasButtons(ref) {\n  return !!(ref.options.buttons && Object.keys(ref.options.buttons).length);\n}\n\n/**\r\n * @param {Noty} ref\r\n * @return {string}\r\n */\nfunction buildButtons(ref) {\n  if (hasButtons(ref)) {\n    var buttons = document.createElement('div');\n    Utils.addClass(buttons, 'noty_buttons');\n\n    Object.keys(ref.options.buttons).forEach(function (key) {\n      buttons.appendChild(ref.options.buttons[key].dom);\n    });\n\n    ref.options.buttons.forEach(function (btn) {\n      buttons.appendChild(btn.dom);\n    });\n    return buttons.outerHTML;\n  }\n  return '';\n}\n\n/**\r\n * @param {Noty} ref\r\n * @return {void}\r\n */\nfunction handleModal(ref) {\n  if (ref.options.modal) {\n    if (DocModalCount === 0) {\n      createModal(ref);\n    }\n\n    exports.DocModalCount = DocModalCount += 1;\n  }\n}\n\n/**\r\n * @param {Noty} ref\r\n * @return {void}\r\n */\nfunction handleModalClose(ref) {\n  if (ref.options.modal && DocModalCount > 0) {\n    exports.DocModalCount = DocModalCount -= 1;\n\n    if (DocModalCount <= 0) {\n      var modal = document.querySelector('.noty_modal');\n\n      if (modal) {\n        Utils.removeClass(modal, 'noty_modal_open');\n        Utils.addClass(modal, 'noty_modal_close');\n        Utils.addListener(modal, Utils.animationEndEvents, function () {\n          Utils.remove(modal);\n        });\n      }\n    }\n  }\n}\n\n/**\r\n * @return {void}\r\n */\nfunction createModal() {\n  var body = document.querySelector('body');\n  var modal = document.createElement('div');\n  Utils.addClass(modal, 'noty_modal');\n  body.insertBefore(modal, body.firstChild);\n  Utils.addClass(modal, 'noty_modal_open');\n\n  Utils.addListener(modal, Utils.animationEndEvents, function () {\n    Utils.removeClass(modal, 'noty_modal_open');\n  });\n}\n\n/**\r\n * @param {Noty} ref\r\n * @return {void}\r\n */\nfunction findOrCreateContainer(ref) {\n  if (ref.options.container) {\n    ref.layoutDom = document.querySelector(ref.options.container);\n    return;\n  }\n\n  var layoutID = 'noty_layout__' + ref.options.layout;\n  ref.layoutDom = document.querySelector('div#' + layoutID);\n\n  if (!ref.layoutDom) {\n    ref.layoutDom = document.createElement('div');\n    ref.layoutDom.setAttribute('id', layoutID);\n    ref.layoutDom.setAttribute('role', 'alert');\n    ref.layoutDom.setAttribute('aria-live', 'polite');\n    Utils.addClass(ref.layoutDom, 'noty_layout');\n    document.querySelector('body').appendChild(ref.layoutDom);\n  }\n}\n\n/**\r\n * @param {Noty} ref\r\n * @return {void}\r\n */\nfunction queueClose(ref) {\n  if (ref.options.timeout) {\n    if (ref.options.progressBar && ref.progressDom) {\n      Utils.css(ref.progressDom, {\n        transition: 'width ' + ref.options.timeout + 'ms linear',\n        width: '0%'\n      });\n    }\n\n    clearTimeout(ref.closeTimer);\n\n    ref.closeTimer = setTimeout(function () {\n      ref.close();\n    }, ref.options.timeout);\n  }\n}\n\n/**\r\n * @param {Noty} ref\r\n * @return {void}\r\n */\nfunction dequeueClose(ref) {\n  if (ref.options.timeout && ref.closeTimer) {\n    clearTimeout(ref.closeTimer);\n    ref.closeTimer = -1;\n\n    if (ref.options.progressBar && ref.progressDom) {\n      Utils.css(ref.progressDom, {\n        transition: 'width 0ms linear',\n        width: '100%'\n      });\n    }\n  }\n}\n\n/**\r\n * @param {Noty} ref\r\n * @param {string} eventName\r\n * @return {void}\r\n */\nfunction fire(ref, eventName) {\n  if (ref.listeners.hasOwnProperty(eventName)) {\n    ref.listeners[eventName].forEach(function (cb) {\n      if (typeof cb === 'function') {\n        cb.apply(ref);\n      }\n    });\n  }\n}\n\n/**\r\n * @param {Noty} ref\r\n * @return {void}\r\n */\nfunction openFlow(ref) {\n  fire(ref, 'afterShow');\n  queueClose(ref);\n\n  Utils.addListener(ref.barDom, 'mouseenter', function () {\n    dequeueClose(ref);\n  });\n\n  Utils.addListener(ref.barDom, 'mouseleave', function () {\n    queueClose(ref);\n  });\n}\n\n/**\r\n * @param {Noty} ref\r\n * @return {void}\r\n */\nfunction closeFlow(ref) {\n  delete Store[ref.id];\n  ref.closing = false;\n  fire(ref, 'afterClose');\n\n  Utils.remove(ref.barDom);\n\n  if (ref.layoutDom.querySelectorAll('.noty_bar').length === 0 && !ref.options.container) {\n    Utils.remove(ref.layoutDom);\n  }\n\n  if (Utils.inArray('docVisible', ref.options.titleCount.conditions) || Utils.inArray('docHidden', ref.options.titleCount.conditions)) {\n    docTitle.decrement();\n  }\n\n  queueRender(ref.options.queue);\n}\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.NotyButton = undefined;\n\nvar _utils = __webpack_require__(0);\n\nvar Utils = _interopRequireWildcard(_utils);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar NotyButton = exports.NotyButton = function NotyButton(html, classes, cb) {\n  var _this = this;\n\n  var attributes = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n  _classCallCheck(this, NotyButton);\n\n  this.dom = document.createElement('button');\n  this.dom.innerHTML = html;\n  this.id = attributes.id = attributes.id || Utils.generateID('button');\n  this.cb = cb;\n  Object.keys(attributes).forEach(function (propertyName) {\n    _this.dom.setAttribute(propertyName, attributes[propertyName]);\n  });\n  Utils.addClass(this.dom, classes || 'noty_btn');\n\n  return this;\n};\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Push = exports.Push = function () {\n  function Push() {\n    var workerPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '/service-worker.js';\n\n    _classCallCheck(this, Push);\n\n    this.subData = {};\n    this.workerPath = workerPath;\n    this.listeners = {\n      onPermissionGranted: [],\n      onPermissionDenied: [],\n      onSubscriptionSuccess: [],\n      onSubscriptionCancel: [],\n      onWorkerError: [],\n      onWorkerSuccess: [],\n      onWorkerNotSupported: []\n    };\n    return this;\n  }\n\n  /**\r\n   * @param {string} eventName\r\n   * @param {function} cb\r\n   * @return {Push}\r\n   */\n\n\n  _createClass(Push, [{\n    key: 'on',\n    value: function on(eventName) {\n      var cb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};\n\n      if (typeof cb === 'function' && this.listeners.hasOwnProperty(eventName)) {\n        this.listeners[eventName].push(cb);\n      }\n\n      return this;\n    }\n  }, {\n    key: 'fire',\n    value: function fire(eventName) {\n      var _this = this;\n\n      var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n\n      if (this.listeners.hasOwnProperty(eventName)) {\n        this.listeners[eventName].forEach(function (cb) {\n          if (typeof cb === 'function') {\n            cb.apply(_this, params);\n          }\n        });\n      }\n    }\n  }, {\n    key: 'create',\n    value: function create() {\n      console.log('NOT IMPLEMENTED YET');\n    }\n\n    /**\r\n     * @return {boolean}\r\n     */\n\n  }, {\n    key: 'isSupported',\n    value: function isSupported() {\n      var result = false;\n\n      try {\n        result = window.Notification || window.webkitNotifications || navigator.mozNotification || window.external && window.external.msIsSiteMode() !== undefined;\n      } catch (e) {}\n\n      return result;\n    }\n\n    /**\r\n     * @return {string}\r\n     */\n\n  }, {\n    key: 'getPermissionStatus',\n    value: function getPermissionStatus() {\n      var perm = 'default';\n\n      if (window.Notification && window.Notification.permissionLevel) {\n        perm = window.Notification.permissionLevel;\n      } else if (window.webkitNotifications && window.webkitNotifications.checkPermission) {\n        switch (window.webkitNotifications.checkPermission()) {\n          case 1:\n            perm = 'default';\n            break;\n          case 0:\n            perm = 'granted';\n            break;\n          default:\n            perm = 'denied';\n        }\n      } else if (window.Notification && window.Notification.permission) {\n        perm = window.Notification.permission;\n      } else if (navigator.mozNotification) {\n        perm = 'granted';\n      } else if (window.external && window.external.msIsSiteMode() !== undefined) {\n        perm = window.external.msIsSiteMode() ? 'granted' : 'default';\n      }\n\n      return perm.toString().toLowerCase();\n    }\n\n    /**\r\n     * @return {string}\r\n     */\n\n  }, {\n    key: 'getEndpoint',\n    value: function getEndpoint(subscription) {\n      var endpoint = subscription.endpoint;\n      var subscriptionId = subscription.subscriptionId;\n\n      // fix for Chrome < 45\n      if (subscriptionId && endpoint.indexOf(subscriptionId) === -1) {\n        endpoint += '/' + subscriptionId;\n      }\n\n      return endpoint;\n    }\n\n    /**\r\n     * @return {boolean}\r\n     */\n\n  }, {\n    key: 'isSWRegistered',\n    value: function isSWRegistered() {\n      try {\n        return navigator.serviceWorker.controller.state === 'activated';\n      } catch (e) {\n        return false;\n      }\n    }\n\n    /**\r\n     * @return {void}\r\n     */\n\n  }, {\n    key: 'unregisterWorker',\n    value: function unregisterWorker() {\n      var self = this;\n      if ('serviceWorker' in navigator) {\n        navigator.serviceWorker.getRegistrations().then(function (registrations) {\n          var _iteratorNormalCompletion = true;\n          var _didIteratorError = false;\n          var _iteratorError = undefined;\n\n          try {\n            for (var _iterator = registrations[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n              var registration = _step.value;\n\n              registration.unregister();\n              self.fire('onSubscriptionCancel');\n            }\n          } catch (err) {\n            _didIteratorError = true;\n            _iteratorError = err;\n          } finally {\n            try {\n              if (!_iteratorNormalCompletion && _iterator.return) {\n                _iterator.return();\n              }\n            } finally {\n              if (_didIteratorError) {\n                throw _iteratorError;\n              }\n            }\n          }\n        });\n      }\n    }\n\n    /**\r\n     * @return {void}\r\n     */\n\n  }, {\n    key: 'requestSubscription',\n    value: function requestSubscription() {\n      var _this2 = this;\n\n      var userVisibleOnly = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n      var self = this;\n      var current = this.getPermissionStatus();\n      var cb = function cb(result) {\n        if (result === 'granted') {\n          _this2.fire('onPermissionGranted');\n\n          if ('serviceWorker' in navigator) {\n            navigator.serviceWorker.register(_this2.workerPath).then(function () {\n              navigator.serviceWorker.ready.then(function (serviceWorkerRegistration) {\n                self.fire('onWorkerSuccess');\n                serviceWorkerRegistration.pushManager.subscribe({\n                  userVisibleOnly: userVisibleOnly\n                }).then(function (subscription) {\n                  var key = subscription.getKey('p256dh');\n                  var token = subscription.getKey('auth');\n\n                  self.subData = {\n                    endpoint: self.getEndpoint(subscription),\n                    p256dh: key ? window.btoa(String.fromCharCode.apply(null, new Uint8Array(key))) : null,\n                    auth: token ? window.btoa(String.fromCharCode.apply(null, new Uint8Array(token))) : null\n                  };\n\n                  self.fire('onSubscriptionSuccess', [self.subData]);\n                }).catch(function (err) {\n                  self.fire('onWorkerError', [err]);\n                });\n              });\n            });\n          } else {\n            self.fire('onWorkerNotSupported');\n          }\n        } else if (result === 'denied') {\n          _this2.fire('onPermissionDenied');\n          _this2.unregisterWorker();\n        }\n      };\n\n      if (current === 'default') {\n        if (window.Notification && window.Notification.requestPermission) {\n          window.Notification.requestPermission(cb);\n        } else if (window.webkitNotifications && window.webkitNotifications.checkPermission) {\n          window.webkitNotifications.requestPermission(cb);\n        }\n      } else {\n        cb(current);\n      }\n    }\n  }]);\n\n  return Push;\n}();\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(process, global) {var require;/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license   Licensed under MIT license\n *            See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n * @version   4.1.1\n */\n\n(function (global, factory) {\n\t true ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.ES6Promise = factory());\n}(this, (function () { 'use strict';\n\nfunction objectOrFunction(x) {\n  var type = typeof x;\n  return x !== null && (type === 'object' || type === 'function');\n}\n\nfunction isFunction(x) {\n  return typeof x === 'function';\n}\n\nvar _isArray = undefined;\nif (Array.isArray) {\n  _isArray = Array.isArray;\n} else {\n  _isArray = function (x) {\n    return Object.prototype.toString.call(x) === '[object Array]';\n  };\n}\n\nvar isArray = _isArray;\n\nvar len = 0;\nvar vertxNext = undefined;\nvar customSchedulerFn = undefined;\n\nvar asap = function asap(callback, arg) {\n  queue[len] = callback;\n  queue[len + 1] = arg;\n  len += 2;\n  if (len === 2) {\n    // If len is 2, that means that we need to schedule an async flush.\n    // If additional callbacks are queued before the queue is flushed, they\n    // will be processed by this flush that we are scheduling.\n    if (customSchedulerFn) {\n      customSchedulerFn(flush);\n    } else {\n      scheduleFlush();\n    }\n  }\n};\n\nfunction setScheduler(scheduleFn) {\n  customSchedulerFn = scheduleFn;\n}\n\nfunction setAsap(asapFn) {\n  asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && ({}).toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n  // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n  // see https://github.com/cujojs/when/issues/410 for details\n  return function () {\n    return process.nextTick(flush);\n  };\n}\n\n// vertx\nfunction useVertxTimer() {\n  if (typeof vertxNext !== 'undefined') {\n    return function () {\n      vertxNext(flush);\n    };\n  }\n\n  return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n  var iterations = 0;\n  var observer = new BrowserMutationObserver(flush);\n  var node = document.createTextNode('');\n  observer.observe(node, { characterData: true });\n\n  return function () {\n    node.data = iterations = ++iterations % 2;\n  };\n}\n\n// web worker\nfunction useMessageChannel() {\n  var channel = new MessageChannel();\n  channel.port1.onmessage = flush;\n  return function () {\n    return channel.port2.postMessage(0);\n  };\n}\n\nfunction useSetTimeout() {\n  // Store setTimeout reference so es6-promise will be unaffected by\n  // other code modifying setTimeout (like sinon.useFakeTimers())\n  var globalSetTimeout = setTimeout;\n  return function () {\n    return globalSetTimeout(flush, 1);\n  };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n  for (var i = 0; i < len; i += 2) {\n    var callback = queue[i];\n    var arg = queue[i + 1];\n\n    callback(arg);\n\n    queue[i] = undefined;\n    queue[i + 1] = undefined;\n  }\n\n  len = 0;\n}\n\nfunction attemptVertx() {\n  try {\n    var r = require;\n    var vertx = __webpack_require__(9);\n    vertxNext = vertx.runOnLoop || vertx.runOnContext;\n    return useVertxTimer();\n  } catch (e) {\n    return useSetTimeout();\n  }\n}\n\nvar scheduleFlush = undefined;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n  scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n  scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n  scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && \"function\" === 'function') {\n  scheduleFlush = attemptVertx();\n} else {\n  scheduleFlush = useSetTimeout();\n}\n\nfunction then(onFulfillment, onRejection) {\n  var _arguments = arguments;\n\n  var parent = this;\n\n  var child = new this.constructor(noop);\n\n  if (child[PROMISE_ID] === undefined) {\n    makePromise(child);\n  }\n\n  var _state = parent._state;\n\n  if (_state) {\n    (function () {\n      var callback = _arguments[_state - 1];\n      asap(function () {\n        return invokeCallback(_state, child, callback, parent._result);\n      });\n    })();\n  } else {\n    subscribe(parent, child, onFulfillment, onRejection);\n  }\n\n  return child;\n}\n\n/**\n  `Promise.resolve` returns a promise that will become resolved with the\n  passed `value`. It is shorthand for the following:\n\n  ```javascript\n  let promise = new Promise(function(resolve, reject){\n    resolve(1);\n  });\n\n  promise.then(function(value){\n    // value === 1\n  });\n  ```\n\n  Instead of writing the above, your code now simply becomes the following:\n\n  ```javascript\n  let promise = Promise.resolve(1);\n\n  promise.then(function(value){\n    // value === 1\n  });\n  ```\n\n  @method resolve\n  @static\n  @param {Any} value value that the returned promise will be resolved with\n  Useful for tooling.\n  @return {Promise} a promise that will become fulfilled with the given\n  `value`\n*/\nfunction resolve$1(object) {\n  /*jshint validthis:true */\n  var Constructor = this;\n\n  if (object && typeof object === 'object' && object.constructor === Constructor) {\n    return object;\n  }\n\n  var promise = new Constructor(noop);\n  resolve(promise, object);\n  return promise;\n}\n\nvar PROMISE_ID = Math.random().toString(36).substring(16);\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nvar GET_THEN_ERROR = new ErrorObject();\n\nfunction selfFulfillment() {\n  return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n  return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction getThen(promise) {\n  try {\n    return promise.then;\n  } catch (error) {\n    GET_THEN_ERROR.error = error;\n    return GET_THEN_ERROR;\n  }\n}\n\nfunction tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {\n  try {\n    then$$1.call(value, fulfillmentHandler, rejectionHandler);\n  } catch (e) {\n    return e;\n  }\n}\n\nfunction handleForeignThenable(promise, thenable, then$$1) {\n  asap(function (promise) {\n    var sealed = false;\n    var error = tryThen(then$$1, thenable, function (value) {\n      if (sealed) {\n        return;\n      }\n      sealed = true;\n      if (thenable !== value) {\n        resolve(promise, value);\n      } else {\n        fulfill(promise, value);\n      }\n    }, function (reason) {\n      if (sealed) {\n        return;\n      }\n      sealed = true;\n\n      reject(promise, reason);\n    }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n    if (!sealed && error) {\n      sealed = true;\n      reject(promise, error);\n    }\n  }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n  if (thenable._state === FULFILLED) {\n    fulfill(promise, thenable._result);\n  } else if (thenable._state === REJECTED) {\n    reject(promise, thenable._result);\n  } else {\n    subscribe(thenable, undefined, function (value) {\n      return resolve(promise, value);\n    }, function (reason) {\n      return reject(promise, reason);\n    });\n  }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then$$1) {\n  if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) {\n    handleOwnThenable(promise, maybeThenable);\n  } else {\n    if (then$$1 === GET_THEN_ERROR) {\n      reject(promise, GET_THEN_ERROR.error);\n      GET_THEN_ERROR.error = null;\n    } else if (then$$1 === undefined) {\n      fulfill(promise, maybeThenable);\n    } else if (isFunction(then$$1)) {\n      handleForeignThenable(promise, maybeThenable, then$$1);\n    } else {\n      fulfill(promise, maybeThenable);\n    }\n  }\n}\n\nfunction resolve(promise, value) {\n  if (promise === value) {\n    reject(promise, selfFulfillment());\n  } else if (objectOrFunction(value)) {\n    handleMaybeThenable(promise, value, getThen(value));\n  } else {\n    fulfill(promise, value);\n  }\n}\n\nfunction publishRejection(promise) {\n  if (promise._onerror) {\n    promise._onerror(promise._result);\n  }\n\n  publish(promise);\n}\n\nfunction fulfill(promise, value) {\n  if (promise._state !== PENDING) {\n    return;\n  }\n\n  promise._result = value;\n  promise._state = FULFILLED;\n\n  if (promise._subscribers.length !== 0) {\n    asap(publish, promise);\n  }\n}\n\nfunction reject(promise, reason) {\n  if (promise._state !== PENDING) {\n    return;\n  }\n  promise._state = REJECTED;\n  promise._result = reason;\n\n  asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n  var _subscribers = parent._subscribers;\n  var length = _subscribers.length;\n\n  parent._onerror = null;\n\n  _subscribers[length] = child;\n  _subscribers[length + FULFILLED] = onFulfillment;\n  _subscribers[length + REJECTED] = onRejection;\n\n  if (length === 0 && parent._state) {\n    asap(publish, parent);\n  }\n}\n\nfunction publish(promise) {\n  var subscribers = promise._subscribers;\n  var settled = promise._state;\n\n  if (subscribers.length === 0) {\n    return;\n  }\n\n  var child = undefined,\n      callback = undefined,\n      detail = promise._result;\n\n  for (var i = 0; i < subscribers.length; i += 3) {\n    child = subscribers[i];\n    callback = subscribers[i + settled];\n\n    if (child) {\n      invokeCallback(settled, child, callback, detail);\n    } else {\n      callback(detail);\n    }\n  }\n\n  promise._subscribers.length = 0;\n}\n\nfunction ErrorObject() {\n  this.error = null;\n}\n\nvar TRY_CATCH_ERROR = new ErrorObject();\n\nfunction tryCatch(callback, detail) {\n  try {\n    return callback(detail);\n  } catch (e) {\n    TRY_CATCH_ERROR.error = e;\n    return TRY_CATCH_ERROR;\n  }\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n  var hasCallback = isFunction(callback),\n      value = undefined,\n      error = undefined,\n      succeeded = undefined,\n      failed = undefined;\n\n  if (hasCallback) {\n    value = tryCatch(callback, detail);\n\n    if (value === TRY_CATCH_ERROR) {\n      failed = true;\n      error = value.error;\n      value.error = null;\n    } else {\n      succeeded = true;\n    }\n\n    if (promise === value) {\n      reject(promise, cannotReturnOwn());\n      return;\n    }\n  } else {\n    value = detail;\n    succeeded = true;\n  }\n\n  if (promise._state !== PENDING) {\n    // noop\n  } else if (hasCallback && succeeded) {\n      resolve(promise, value);\n    } else if (failed) {\n      reject(promise, error);\n    } else if (settled === FULFILLED) {\n      fulfill(promise, value);\n    } else if (settled === REJECTED) {\n      reject(promise, value);\n    }\n}\n\nfunction initializePromise(promise, resolver) {\n  try {\n    resolver(function resolvePromise(value) {\n      resolve(promise, value);\n    }, function rejectPromise(reason) {\n      reject(promise, reason);\n    });\n  } catch (e) {\n    reject(promise, e);\n  }\n}\n\nvar id = 0;\nfunction nextId() {\n  return id++;\n}\n\nfunction makePromise(promise) {\n  promise[PROMISE_ID] = id++;\n  promise._state = undefined;\n  promise._result = undefined;\n  promise._subscribers = [];\n}\n\nfunction Enumerator$1(Constructor, input) {\n  this._instanceConstructor = Constructor;\n  this.promise = new Constructor(noop);\n\n  if (!this.promise[PROMISE_ID]) {\n    makePromise(this.promise);\n  }\n\n  if (isArray(input)) {\n    this.length = input.length;\n    this._remaining = input.length;\n\n    this._result = new Array(this.length);\n\n    if (this.length === 0) {\n      fulfill(this.promise, this._result);\n    } else {\n      this.length = this.length || 0;\n      this._enumerate(input);\n      if (this._remaining === 0) {\n        fulfill(this.promise, this._result);\n      }\n    }\n  } else {\n    reject(this.promise, validationError());\n  }\n}\n\nfunction validationError() {\n  return new Error('Array Methods must be provided an Array');\n}\n\nEnumerator$1.prototype._enumerate = function (input) {\n  for (var i = 0; this._state === PENDING && i < input.length; i++) {\n    this._eachEntry(input[i], i);\n  }\n};\n\nEnumerator$1.prototype._eachEntry = function (entry, i) {\n  var c = this._instanceConstructor;\n  var resolve$$1 = c.resolve;\n\n  if (resolve$$1 === resolve$1) {\n    var _then = getThen(entry);\n\n    if (_then === then && entry._state !== PENDING) {\n      this._settledAt(entry._state, i, entry._result);\n    } else if (typeof _then !== 'function') {\n      this._remaining--;\n      this._result[i] = entry;\n    } else if (c === Promise$2) {\n      var promise = new c(noop);\n      handleMaybeThenable(promise, entry, _then);\n      this._willSettleAt(promise, i);\n    } else {\n      this._willSettleAt(new c(function (resolve$$1) {\n        return resolve$$1(entry);\n      }), i);\n    }\n  } else {\n    this._willSettleAt(resolve$$1(entry), i);\n  }\n};\n\nEnumerator$1.prototype._settledAt = function (state, i, value) {\n  var promise = this.promise;\n\n  if (promise._state === PENDING) {\n    this._remaining--;\n\n    if (state === REJECTED) {\n      reject(promise, value);\n    } else {\n      this._result[i] = value;\n    }\n  }\n\n  if (this._remaining === 0) {\n    fulfill(promise, this._result);\n  }\n};\n\nEnumerator$1.prototype._willSettleAt = function (promise, i) {\n  var enumerator = this;\n\n  subscribe(promise, undefined, function (value) {\n    return enumerator._settledAt(FULFILLED, i, value);\n  }, function (reason) {\n    return enumerator._settledAt(REJECTED, i, reason);\n  });\n};\n\n/**\n  `Promise.all` accepts an array of promises, and returns a new promise which\n  is fulfilled with an array of fulfillment values for the passed promises, or\n  rejected with the reason of the first passed promise to be rejected. It casts all\n  elements of the passed iterable to promises as it runs this algorithm.\n\n  Example:\n\n  ```javascript\n  let promise1 = resolve(1);\n  let promise2 = resolve(2);\n  let promise3 = resolve(3);\n  let promises = [ promise1, promise2, promise3 ];\n\n  Promise.all(promises).then(function(array){\n    // The array here would be [ 1, 2, 3 ];\n  });\n  ```\n\n  If any of the `promises` given to `all` are rejected, the first promise\n  that is rejected will be given as an argument to the returned promises's\n  rejection handler. For example:\n\n  Example:\n\n  ```javascript\n  let promise1 = resolve(1);\n  let promise2 = reject(new Error(\"2\"));\n  let promise3 = reject(new Error(\"3\"));\n  let promises = [ promise1, promise2, promise3 ];\n\n  Promise.all(promises).then(function(array){\n    // Code here never runs because there are rejected promises!\n  }, function(error) {\n    // error.message === \"2\"\n  });\n  ```\n\n  @method all\n  @static\n  @param {Array} entries array of promises\n  @param {String} label optional string for labeling the promise.\n  Useful for tooling.\n  @return {Promise} promise that is fulfilled when all `promises` have been\n  fulfilled, or rejected if any of them become rejected.\n  @static\n*/\nfunction all$1(entries) {\n  return new Enumerator$1(this, entries).promise;\n}\n\n/**\n  `Promise.race` returns a new promise which is settled in the same way as the\n  first passed promise to settle.\n\n  Example:\n\n  ```javascript\n  let promise1 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 1');\n    }, 200);\n  });\n\n  let promise2 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 2');\n    }, 100);\n  });\n\n  Promise.race([promise1, promise2]).then(function(result){\n    // result === 'promise 2' because it was resolved before promise1\n    // was resolved.\n  });\n  ```\n\n  `Promise.race` is deterministic in that only the state of the first\n  settled promise matters. For example, even if other promises given to the\n  `promises` array argument are resolved, but the first settled promise has\n  become rejected before the other promises became fulfilled, the returned\n  promise will become rejected:\n\n  ```javascript\n  let promise1 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 1');\n    }, 200);\n  });\n\n  let promise2 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      reject(new Error('promise 2'));\n    }, 100);\n  });\n\n  Promise.race([promise1, promise2]).then(function(result){\n    // Code here never runs\n  }, function(reason){\n    // reason.message === 'promise 2' because promise 2 became rejected before\n    // promise 1 became fulfilled\n  });\n  ```\n\n  An example real-world use case is implementing timeouts:\n\n  ```javascript\n  Promise.race([ajax('foo.json'), timeout(5000)])\n  ```\n\n  @method race\n  @static\n  @param {Array} promises array of promises to observe\n  Useful for tooling.\n  @return {Promise} a promise which settles in the same way as the first passed\n  promise to settle.\n*/\nfunction race$1(entries) {\n  /*jshint validthis:true */\n  var Constructor = this;\n\n  if (!isArray(entries)) {\n    return new Constructor(function (_, reject) {\n      return reject(new TypeError('You must pass an array to race.'));\n    });\n  } else {\n    return new Constructor(function (resolve, reject) {\n      var length = entries.length;\n      for (var i = 0; i < length; i++) {\n        Constructor.resolve(entries[i]).then(resolve, reject);\n      }\n    });\n  }\n}\n\n/**\n  `Promise.reject` returns a promise rejected with the passed `reason`.\n  It is shorthand for the following:\n\n  ```javascript\n  let promise = new Promise(function(resolve, reject){\n    reject(new Error('WHOOPS'));\n  });\n\n  promise.then(function(value){\n    // Code here doesn't run because the promise is rejected!\n  }, function(reason){\n    // reason.message === 'WHOOPS'\n  });\n  ```\n\n  Instead of writing the above, your code now simply becomes the following:\n\n  ```javascript\n  let promise = Promise.reject(new Error('WHOOPS'));\n\n  promise.then(function(value){\n    // Code here doesn't run because the promise is rejected!\n  }, function(reason){\n    // reason.message === 'WHOOPS'\n  });\n  ```\n\n  @method reject\n  @static\n  @param {Any} reason value that the returned promise will be rejected with.\n  Useful for tooling.\n  @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject$1(reason) {\n  /*jshint validthis:true */\n  var Constructor = this;\n  var promise = new Constructor(noop);\n  reject(promise, reason);\n  return promise;\n}\n\nfunction needsResolver() {\n  throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n  throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n  Promise objects represent the eventual result of an asynchronous operation. The\n  primary way of interacting with a promise is through its `then` method, which\n  registers callbacks to receive either a promise's eventual value or the reason\n  why the promise cannot be fulfilled.\n\n  Terminology\n  -----------\n\n  - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n  - `thenable` is an object or function that defines a `then` method.\n  - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n  - `exception` is a value that is thrown using the throw statement.\n  - `reason` is a value that indicates why a promise was rejected.\n  - `settled` the final resting state of a promise, fulfilled or rejected.\n\n  A promise can be in one of three states: pending, fulfilled, or rejected.\n\n  Promises that are fulfilled have a fulfillment value and are in the fulfilled\n  state.  Promises that are rejected have a rejection reason and are in the\n  rejected state.  A fulfillment value is never a thenable.\n\n  Promises can also be said to *resolve* a value.  If this value is also a\n  promise, then the original promise's settled state will match the value's\n  settled state.  So a promise that *resolves* a promise that rejects will\n  itself reject, and a promise that *resolves* a promise that fulfills will\n  itself fulfill.\n\n\n  Basic Usage:\n  ------------\n\n  ```js\n  let promise = new Promise(function(resolve, reject) {\n    // on success\n    resolve(value);\n\n    // on failure\n    reject(reason);\n  });\n\n  promise.then(function(value) {\n    // on fulfillment\n  }, function(reason) {\n    // on rejection\n  });\n  ```\n\n  Advanced Usage:\n  ---------------\n\n  Promises shine when abstracting away asynchronous interactions such as\n  `XMLHttpRequest`s.\n\n  ```js\n  function getJSON(url) {\n    return new Promise(function(resolve, reject){\n      let xhr = new XMLHttpRequest();\n\n      xhr.open('GET', url);\n      xhr.onreadystatechange = handler;\n      xhr.responseType = 'json';\n      xhr.setRequestHeader('Accept', 'application/json');\n      xhr.send();\n\n      function handler() {\n        if (this.readyState === this.DONE) {\n          if (this.status === 200) {\n            resolve(this.response);\n          } else {\n            reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n          }\n        }\n      };\n    });\n  }\n\n  getJSON('/posts.json').then(function(json) {\n    // on fulfillment\n  }, function(reason) {\n    // on rejection\n  });\n  ```\n\n  Unlike callbacks, promises are great composable primitives.\n\n  ```js\n  Promise.all([\n    getJSON('/posts'),\n    getJSON('/comments')\n  ]).then(function(values){\n    values[0] // => postsJSON\n    values[1] // => commentsJSON\n\n    return values;\n  });\n  ```\n\n  @class Promise\n  @param {function} resolver\n  Useful for tooling.\n  @constructor\n*/\nfunction Promise$2(resolver) {\n  this[PROMISE_ID] = nextId();\n  this._result = this._state = undefined;\n  this._subscribers = [];\n\n  if (noop !== resolver) {\n    typeof resolver !== 'function' && needsResolver();\n    this instanceof Promise$2 ? initializePromise(this, resolver) : needsNew();\n  }\n}\n\nPromise$2.all = all$1;\nPromise$2.race = race$1;\nPromise$2.resolve = resolve$1;\nPromise$2.reject = reject$1;\nPromise$2._setScheduler = setScheduler;\nPromise$2._setAsap = setAsap;\nPromise$2._asap = asap;\n\nPromise$2.prototype = {\n  constructor: Promise$2,\n\n  /**\n    The primary way of interacting with a promise is through its `then` method,\n    which registers callbacks to receive either a promise's eventual value or the\n    reason why the promise cannot be fulfilled.\n  \n    ```js\n    findUser().then(function(user){\n      // user is available\n    }, function(reason){\n      // user is unavailable, and you are given the reason why\n    });\n    ```\n  \n    Chaining\n    --------\n  \n    The return value of `then` is itself a promise.  This second, 'downstream'\n    promise is resolved with the return value of the first promise's fulfillment\n    or rejection handler, or rejected if the handler throws an exception.\n  \n    ```js\n    findUser().then(function (user) {\n      return user.name;\n    }, function (reason) {\n      return 'default name';\n    }).then(function (userName) {\n      // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n      // will be `'default name'`\n    });\n  \n    findUser().then(function (user) {\n      throw new Error('Found user, but still unhappy');\n    }, function (reason) {\n      throw new Error('`findUser` rejected and we're unhappy');\n    }).then(function (value) {\n      // never reached\n    }, function (reason) {\n      // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n      // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n    });\n    ```\n    If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n  \n    ```js\n    findUser().then(function (user) {\n      throw new PedagogicalException('Upstream error');\n    }).then(function (value) {\n      // never reached\n    }).then(function (value) {\n      // never reached\n    }, function (reason) {\n      // The `PedgagocialException` is propagated all the way down to here\n    });\n    ```\n  \n    Assimilation\n    ------------\n  \n    Sometimes the value you want to propagate to a downstream promise can only be\n    retrieved asynchronously. This can be achieved by returning a promise in the\n    fulfillment or rejection handler. The downstream promise will then be pending\n    until the returned promise is settled. This is called *assimilation*.\n  \n    ```js\n    findUser().then(function (user) {\n      return findCommentsByAuthor(user);\n    }).then(function (comments) {\n      // The user's comments are now available\n    });\n    ```\n  \n    If the assimliated promise rejects, then the downstream promise will also reject.\n  \n    ```js\n    findUser().then(function (user) {\n      return findCommentsByAuthor(user);\n    }).then(function (comments) {\n      // If `findCommentsByAuthor` fulfills, we'll have the value here\n    }, function (reason) {\n      // If `findCommentsByAuthor` rejects, we'll have the reason here\n    });\n    ```\n  \n    Simple Example\n    --------------\n  \n    Synchronous Example\n  \n    ```javascript\n    let result;\n  \n    try {\n      result = findResult();\n      // success\n    } catch(reason) {\n      // failure\n    }\n    ```\n  \n    Errback Example\n  \n    ```js\n    findResult(function(result, err){\n      if (err) {\n        // failure\n      } else {\n        // success\n      }\n    });\n    ```\n  \n    Promise Example;\n  \n    ```javascript\n    findResult().then(function(result){\n      // success\n    }, function(reason){\n      // failure\n    });\n    ```\n  \n    Advanced Example\n    --------------\n  \n    Synchronous Example\n  \n    ```javascript\n    let author, books;\n  \n    try {\n      author = findAuthor();\n      books  = findBooksByAuthor(author);\n      // success\n    } catch(reason) {\n      // failure\n    }\n    ```\n  \n    Errback Example\n  \n    ```js\n  \n    function foundBooks(books) {\n  \n    }\n  \n    function failure(reason) {\n  \n    }\n  \n    findAuthor(function(author, err){\n      if (err) {\n        failure(err);\n        // failure\n      } else {\n        try {\n          findBoooksByAuthor(author, function(books, err) {\n            if (err) {\n              failure(err);\n            } else {\n              try {\n                foundBooks(books);\n              } catch(reason) {\n                failure(reason);\n              }\n            }\n          });\n        } catch(error) {\n          failure(err);\n        }\n        // success\n      }\n    });\n    ```\n  \n    Promise Example;\n  \n    ```javascript\n    findAuthor().\n      then(findBooksByAuthor).\n      then(function(books){\n        // found books\n    }).catch(function(reason){\n      // something went wrong\n    });\n    ```\n  \n    @method then\n    @param {Function} onFulfilled\n    @param {Function} onRejected\n    Useful for tooling.\n    @return {Promise}\n  */\n  then: then,\n\n  /**\n    `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n    as the catch block of a try/catch statement.\n  \n    ```js\n    function findAuthor(){\n      throw new Error('couldn't find that author');\n    }\n  \n    // synchronous\n    try {\n      findAuthor();\n    } catch(reason) {\n      // something went wrong\n    }\n  \n    // async with promises\n    findAuthor().catch(function(reason){\n      // something went wrong\n    });\n    ```\n  \n    @method catch\n    @param {Function} onRejection\n    Useful for tooling.\n    @return {Promise}\n  */\n  'catch': function _catch(onRejection) {\n    return this.then(null, onRejection);\n  }\n};\n\n/*global self*/\nfunction polyfill$1() {\n    var local = undefined;\n\n    if (typeof global !== 'undefined') {\n        local = global;\n    } else if (typeof self !== 'undefined') {\n        local = self;\n    } else {\n        try {\n            local = Function('return this')();\n        } catch (e) {\n            throw new Error('polyfill failed because global object is unavailable in this environment');\n        }\n    }\n\n    var P = local.Promise;\n\n    if (P) {\n        var promiseToString = null;\n        try {\n            promiseToString = Object.prototype.toString.call(P.resolve());\n        } catch (e) {\n            // silently ignored\n        }\n\n        if (promiseToString === '[object Promise]' && !P.cast) {\n            return;\n        }\n    }\n\n    local.Promise = Promise$2;\n}\n\n// Strange compat..\nPromise$2.polyfill = polyfill$1;\nPromise$2.Promise = Promise$2;\n\nreturn Promise$2;\n\n})));\n\n//# sourceMappingURL=es6-promise.map\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(7), __webpack_require__(8)))\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /* global VERSION */\n\n__webpack_require__(5);\n\nvar _es6Promise = __webpack_require__(4);\n\nvar _es6Promise2 = _interopRequireDefault(_es6Promise);\n\nvar _utils = __webpack_require__(0);\n\nvar Utils = _interopRequireWildcard(_utils);\n\nvar _api = __webpack_require__(1);\n\nvar API = _interopRequireWildcard(_api);\n\nvar _button = __webpack_require__(2);\n\nvar _push = __webpack_require__(3);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Noty = function () {\n  /**\n   * @param {object} options\n   * @return {Noty}\n   */\n  function Noty() {\n    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    _classCallCheck(this, Noty);\n\n    this.options = Utils.deepExtend({}, API.Defaults, options);\n\n    if (API.Store[this.options.id]) {\n      return API.Store[this.options.id];\n    }\n\n    this.id = this.options.id || Utils.generateID('bar');\n    this.closeTimer = -1;\n    this.barDom = null;\n    this.layoutDom = null;\n    this.progressDom = null;\n    this.showing = false;\n    this.shown = false;\n    this.closed = false;\n    this.closing = false;\n    this.killable = this.options.timeout || this.options.closeWith.length > 0;\n    this.hasSound = this.options.sounds.sources.length > 0;\n    this.soundPlayed = false;\n    this.listeners = {\n      beforeShow: [],\n      onShow: [],\n      afterShow: [],\n      onClose: [],\n      afterClose: [],\n      onClick: [],\n      onHover: [],\n      onTemplate: []\n    };\n    this.promises = {\n      show: null,\n      close: null\n    };\n    this.on('beforeShow', this.options.callbacks.beforeShow);\n    this.on('onShow', this.options.callbacks.onShow);\n    this.on('afterShow', this.options.callbacks.afterShow);\n    this.on('onClose', this.options.callbacks.onClose);\n    this.on('afterClose', this.options.callbacks.afterClose);\n    this.on('onClick', this.options.callbacks.onClick);\n    this.on('onHover', this.options.callbacks.onHover);\n    this.on('onTemplate', this.options.callbacks.onTemplate);\n\n    return this;\n  }\n\n  /**\n   * @param {string} eventName\n   * @param {function} cb\n   * @return {Noty}\n   */\n\n\n  _createClass(Noty, [{\n    key: 'on',\n    value: function on(eventName) {\n      var cb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};\n\n      if (typeof cb === 'function' && this.listeners.hasOwnProperty(eventName)) {\n        this.listeners[eventName].push(cb);\n      }\n\n      return this;\n    }\n\n    /**\n     * @return {Noty}\n     */\n\n  }, {\n    key: 'show',\n    value: function show() {\n      var _this = this;\n\n      if (this.showing || this.shown) {\n        return this; // preventing multiple show\n      }\n\n      if (this.options.killer === true) {\n        Noty.closeAll();\n      } else if (typeof this.options.killer === 'string') {\n        Noty.closeAll(this.options.killer);\n      }\n\n      var queueCounts = API.getQueueCounts(this.options.queue);\n\n      if (queueCounts.current >= queueCounts.maxVisible || API.PageHidden && this.options.visibilityControl) {\n        API.addToQueue(this);\n\n        if (API.PageHidden && this.hasSound && Utils.inArray('docHidden', this.options.sounds.conditions)) {\n          Utils.createAudioElements(this);\n        }\n\n        if (API.PageHidden && Utils.inArray('docHidden', this.options.titleCount.conditions)) {\n          API.docTitle.increment();\n        }\n\n        return this;\n      }\n\n      API.Store[this.id] = this;\n\n      API.fire(this, 'beforeShow');\n\n      this.showing = true;\n\n      if (this.closing) {\n        this.showing = false;\n        return this;\n      }\n\n      API.build(this);\n      API.handleModal(this);\n\n      if (this.options.force) {\n        this.layoutDom.insertBefore(this.barDom, this.layoutDom.firstChild);\n      } else {\n        this.layoutDom.appendChild(this.barDom);\n      }\n\n      if (this.hasSound && !this.soundPlayed && Utils.inArray('docVisible', this.options.sounds.conditions)) {\n        Utils.createAudioElements(this);\n      }\n\n      if (Utils.inArray('docVisible', this.options.titleCount.conditions)) {\n        API.docTitle.increment();\n      }\n\n      this.shown = true;\n      this.closed = false;\n\n      // bind button events if any\n      if (API.hasButtons(this)) {\n        Object.keys(this.options.buttons).forEach(function (key) {\n          var btn = _this.barDom.querySelector('#' + _this.options.buttons[key].id);\n          Utils.addListener(btn, 'click', function (e) {\n            Utils.stopPropagation(e);\n            _this.options.buttons[key].cb(_this);\n          });\n        });\n      }\n\n      this.progressDom = this.barDom.querySelector('.noty_progressbar');\n\n      if (Utils.inArray('click', this.options.closeWith)) {\n        Utils.addClass(this.barDom, 'noty_close_with_click');\n        Utils.addListener(this.barDom, 'click', function (e) {\n          Utils.stopPropagation(e);\n          API.fire(_this, 'onClick');\n          _this.close();\n        }, false);\n      }\n\n      Utils.addListener(this.barDom, 'mouseenter', function () {\n        API.fire(_this, 'onHover');\n      }, false);\n\n      if (this.options.timeout) Utils.addClass(this.barDom, 'noty_has_timeout');\n      if (this.options.progressBar) {\n        Utils.addClass(this.barDom, 'noty_has_progressbar');\n      }\n\n      if (Utils.inArray('button', this.options.closeWith)) {\n        Utils.addClass(this.barDom, 'noty_close_with_button');\n\n        var closeButton = document.createElement('div');\n        Utils.addClass(closeButton, 'noty_close_button');\n        closeButton.innerHTML = '×';\n        this.barDom.appendChild(closeButton);\n\n        Utils.addListener(closeButton, 'click', function (e) {\n          Utils.stopPropagation(e);\n          _this.close();\n        }, false);\n      }\n\n      API.fire(this, 'onShow');\n\n      if (this.options.animation.open === null) {\n        this.promises.show = new _es6Promise2.default(function (resolve) {\n          resolve();\n        });\n      } else if (typeof this.options.animation.open === 'function') {\n        this.promises.show = new _es6Promise2.default(this.options.animation.open.bind(this));\n      } else {\n        Utils.addClass(this.barDom, this.options.animation.open);\n        this.promises.show = new _es6Promise2.default(function (resolve) {\n          Utils.addListener(_this.barDom, Utils.animationEndEvents, function () {\n            Utils.removeClass(_this.barDom, _this.options.animation.open);\n            resolve();\n          });\n        });\n      }\n\n      this.promises.show.then(function () {\n        var _t = _this;\n        setTimeout(function () {\n          API.openFlow(_t);\n        }, 100);\n      });\n\n      return this;\n    }\n\n    /**\n     * @return {Noty}\n     */\n\n  }, {\n    key: 'stop',\n    value: function stop() {\n      API.dequeueClose(this);\n      return this;\n    }\n\n    /**\n     * @return {Noty}\n     */\n\n  }, {\n    key: 'resume',\n    value: function resume() {\n      API.queueClose(this);\n      return this;\n    }\n\n    /**\n     * @param {int|boolean} ms\n     * @return {Noty}\n     */\n\n  }, {\n    key: 'setTimeout',\n    value: function (_setTimeout) {\n      function setTimeout(_x) {\n        return _setTimeout.apply(this, arguments);\n      }\n\n      setTimeout.toString = function () {\n        return _setTimeout.toString();\n      };\n\n      return setTimeout;\n    }(function (ms) {\n      this.stop();\n      this.options.timeout = ms;\n\n      if (this.barDom) {\n        if (this.options.timeout) {\n          Utils.addClass(this.barDom, 'noty_has_timeout');\n        } else {\n          Utils.removeClass(this.barDom, 'noty_has_timeout');\n        }\n\n        var _t = this;\n        setTimeout(function () {\n          // ugly fix for progressbar display bug\n          _t.resume();\n        }, 100);\n      }\n\n      return this;\n    })\n\n    /**\n     * @param {string} html\n     * @param {boolean} optionsOverride\n     * @return {Noty}\n     */\n\n  }, {\n    key: 'setText',\n    value: function setText(html) {\n      var optionsOverride = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      if (this.barDom) {\n        this.barDom.querySelector('.noty_body').innerHTML = html;\n      }\n\n      if (optionsOverride) this.options.text = html;\n\n      return this;\n    }\n\n    /**\n     * @param {string} type\n     * @param {boolean} optionsOverride\n     * @return {Noty}\n     */\n\n  }, {\n    key: 'setType',\n    value: function setType(type) {\n      var _this2 = this;\n\n      var optionsOverride = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      if (this.barDom) {\n        var classList = Utils.classList(this.barDom).split(' ');\n\n        classList.forEach(function (c) {\n          if (c.substring(0, 11) === 'noty_type__') {\n            Utils.removeClass(_this2.barDom, c);\n          }\n        });\n\n        Utils.addClass(this.barDom, 'noty_type__' + type);\n      }\n\n      if (optionsOverride) this.options.type = type;\n\n      return this;\n    }\n\n    /**\n     * @param {string} theme\n     * @param {boolean} optionsOverride\n     * @return {Noty}\n     */\n\n  }, {\n    key: 'setTheme',\n    value: function setTheme(theme) {\n      var _this3 = this;\n\n      var optionsOverride = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n      if (this.barDom) {\n        var classList = Utils.classList(this.barDom).split(' ');\n\n        classList.forEach(function (c) {\n          if (c.substring(0, 12) === 'noty_theme__') {\n            Utils.removeClass(_this3.barDom, c);\n          }\n        });\n\n        Utils.addClass(this.barDom, 'noty_theme__' + theme);\n      }\n\n      if (optionsOverride) this.options.theme = theme;\n\n      return this;\n    }\n\n    /**\n     * @return {Noty}\n     */\n\n  }, {\n    key: 'close',\n    value: function close() {\n      var _this4 = this;\n\n      if (this.closed) return this;\n\n      if (!this.shown) {\n        // it's in the queue\n        API.removeFromQueue(this);\n        return this;\n      }\n\n      API.fire(this, 'onClose');\n\n      this.closing = true;\n\n      if (this.options.animation.close === null || this.options.animation.close === false) {\n        this.promises.close = new _es6Promise2.default(function (resolve) {\n          resolve();\n        });\n      } else if (typeof this.options.animation.close === 'function') {\n        this.promises.close = new _es6Promise2.default(this.options.animation.close.bind(this));\n      } else {\n        Utils.addClass(this.barDom, this.options.animation.close);\n        this.promises.close = new _es6Promise2.default(function (resolve) {\n          Utils.addListener(_this4.barDom, Utils.animationEndEvents, function () {\n            if (_this4.options.force) {\n              Utils.remove(_this4.barDom);\n            } else {\n              API.ghostFix(_this4);\n            }\n            resolve();\n          });\n        });\n      }\n\n      this.promises.close.then(function () {\n        API.closeFlow(_this4);\n        API.handleModalClose(_this4);\n      });\n\n      this.closed = true;\n\n      return this;\n    }\n\n    // API functions\n\n    /**\n     * @param {boolean|string} queueName\n     * @return {Noty}\n     */\n\n  }], [{\n    key: 'closeAll',\n    value: function closeAll() {\n      var queueName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      Object.keys(API.Store).forEach(function (id) {\n        if (queueName) {\n          if (API.Store[id].options.queue === queueName && API.Store[id].killable) {\n            API.Store[id].close();\n          }\n        } else if (API.Store[id].killable) {\n          API.Store[id].close();\n        }\n      });\n      return this;\n    }\n\n    /**\n     * @param {string} queueName\n     * @return {Noty}\n     */\n\n  }, {\n    key: 'clearQueue',\n    value: function clearQueue() {\n      var queueName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'global';\n\n      if (API.Queues.hasOwnProperty(queueName)) {\n        API.Queues[queueName].queue = [];\n      }\n      return this;\n    }\n\n    /**\n     * @return {API.Queues}\n     */\n\n  }, {\n    key: 'overrideDefaults',\n\n\n    /**\n     * @param {Object} obj\n     * @return {Noty}\n     */\n    value: function overrideDefaults(obj) {\n      API.Defaults = Utils.deepExtend({}, API.Defaults, obj);\n      return this;\n    }\n\n    /**\n     * @param {int} amount\n     * @param {string} queueName\n     * @return {Noty}\n     */\n\n  }, {\n    key: 'setMaxVisible',\n    value: function setMaxVisible() {\n      var amount = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : API.DefaultMaxVisible;\n      var queueName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'global';\n\n      if (!API.Queues.hasOwnProperty(queueName)) {\n        API.Queues[queueName] = { maxVisible: amount, queue: [] };\n      }\n\n      API.Queues[queueName].maxVisible = amount;\n      return this;\n    }\n\n    /**\n     * @param {string} innerHtml\n     * @param {String} classes\n     * @param {Function} cb\n     * @param {Object} attributes\n     * @return {NotyButton}\n     */\n\n  }, {\n    key: 'button',\n    value: function button(innerHtml) {\n      var classes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n      var cb = arguments[2];\n      var attributes = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n      return new _button.NotyButton(innerHtml, classes, cb, attributes);\n    }\n\n    /**\n     * @return {string}\n     */\n\n  }, {\n    key: 'version',\n    value: function version() {\n      return \"3.2.0-beta\";\n    }\n\n    /**\n     * @param {String} workerPath\n     * @return {Push}\n     */\n\n  }, {\n    key: 'Push',\n    value: function Push(workerPath) {\n      return new _push.Push(workerPath);\n    }\n  }, {\n    key: 'Queues',\n    get: function get() {\n      return API.Queues;\n    }\n\n    /**\n     * @return {API.PageHidden}\n     */\n\n  }, {\n    key: 'PageHidden',\n    get: function get() {\n      return API.PageHidden;\n    }\n  }]);\n\n  return Noty;\n}();\n\n// Document visibility change controller\n\n\nexports.default = Noty;\nif (typeof window !== 'undefined') {\n  Utils.visibilityChangeFlow();\n}\nmodule.exports = exports['default'];\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports) {\n\n// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\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 = runTimeout(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    runClearTimeout(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        runTimeout(drainQueue);\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;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\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\n/***/ }),\n/* 8 */\n/***/ (function(module, exports) {\n\nvar g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports) {\n\n/* (ignored) */\n\n/***/ })\n/******/ ]);\n});\n//# sourceMappingURL=noty.js.map"
  },
  {
    "path": "lib/themes/bootstrap-v3.css",
    "content": ".noty_theme__bootstrap-v3.noty_bar {\n  margin: 4px 0;\n  overflow: hidden;\n  position: relative;\n  border: 1px solid transparent;\n  border-radius: 4px; }\n  .noty_theme__bootstrap-v3.noty_bar .noty_body {\n    padding: 15px; }\n  .noty_theme__bootstrap-v3.noty_bar .noty_buttons {\n    padding: 10px; }\n  .noty_theme__bootstrap-v3.noty_bar .noty_close_button {\n    font-size: 21px;\n    font-weight: 700;\n    line-height: 1;\n    color: #000;\n    text-shadow: 0 1px 0 #fff;\n    filter: alpha(opacity=20);\n    opacity: .2;\n    background: transparent; }\n  .noty_theme__bootstrap-v3.noty_bar .noty_close_button:hover {\n    background: transparent;\n    text-decoration: none;\n    cursor: pointer;\n    filter: alpha(opacity=50);\n    opacity: .5; }\n\n.noty_theme__bootstrap-v3.noty_type__alert,\n.noty_theme__bootstrap-v3.noty_type__notification {\n  background-color: #fff;\n  color: inherit; }\n\n.noty_theme__bootstrap-v3.noty_type__warning {\n  background-color: #fcf8e3;\n  color: #8a6d3b;\n  border-color: #faebcc; }\n\n.noty_theme__bootstrap-v3.noty_type__error {\n  background-color: #f2dede;\n  color: #a94442;\n  border-color: #ebccd1; }\n\n.noty_theme__bootstrap-v3.noty_type__info,\n.noty_theme__bootstrap-v3.noty_type__information {\n  background-color: #d9edf7;\n  color: #31708f;\n  border-color: #bce8f1; }\n\n.noty_theme__bootstrap-v3.noty_type__success {\n  background-color: #dff0d8;\n  color: #3c763d;\n  border-color: #d6e9c6; }\n"
  },
  {
    "path": "lib/themes/bootstrap-v4.css",
    "content": ".noty_theme__bootstrap-v4.noty_bar {\n  margin: 4px 0;\n  overflow: hidden;\n  position: relative;\n  border: 1px solid transparent;\n  border-radius: .25rem; }\n  .noty_theme__bootstrap-v4.noty_bar .noty_body {\n    padding: .75rem 1.25rem; }\n  .noty_theme__bootstrap-v4.noty_bar .noty_buttons {\n    padding: 10px; }\n  .noty_theme__bootstrap-v4.noty_bar .noty_close_button {\n    font-size: 1.5rem;\n    font-weight: 700;\n    line-height: 1;\n    color: #000;\n    text-shadow: 0 1px 0 #fff;\n    filter: alpha(opacity=20);\n    opacity: .5;\n    background: transparent; }\n  .noty_theme__bootstrap-v4.noty_bar .noty_close_button:hover {\n    background: transparent;\n    text-decoration: none;\n    cursor: pointer;\n    filter: alpha(opacity=50);\n    opacity: .75; }\n\n.noty_theme__bootstrap-v4.noty_type__alert,\n.noty_theme__bootstrap-v4.noty_type__notification {\n  background-color: #fff;\n  color: inherit; }\n\n.noty_theme__bootstrap-v4.noty_type__warning {\n  background-color: #fcf8e3;\n  color: #8a6d3b;\n  border-color: #faebcc; }\n\n.noty_theme__bootstrap-v4.noty_type__error {\n  background-color: #f2dede;\n  color: #a94442;\n  border-color: #ebccd1; }\n\n.noty_theme__bootstrap-v4.noty_type__info,\n.noty_theme__bootstrap-v4.noty_type__information {\n  background-color: #d9edf7;\n  color: #31708f;\n  border-color: #bce8f1; }\n\n.noty_theme__bootstrap-v4.noty_type__success {\n  background-color: #dff0d8;\n  color: #3c763d;\n  border-color: #d6e9c6; }\n"
  },
  {
    "path": "lib/themes/light.css",
    "content": ".noty_theme__light.noty_bar {\n  margin: 4px 0;\n  overflow: hidden;\n  border-radius: 2px;\n  position: relative; }\n  .noty_theme__light.noty_bar .noty_body {\n    padding: 10px; }\n  .noty_theme__light.noty_bar .noty_buttons {\n    border-top: 1px solid #e7e7e7;\n    padding: 5px 10px; }\n\n.noty_theme__light.noty_type__alert,\n.noty_theme__light.noty_type__notification {\n  background-color: #fff;\n  border: 1px solid #dedede;\n  color: #444; }\n\n.noty_theme__light.noty_type__warning {\n  background-color: #FFEAA8;\n  border: 1px solid #FFC237;\n  color: #826200; }\n  .noty_theme__light.noty_type__warning .noty_buttons {\n    border-color: #dfaa30; }\n\n.noty_theme__light.noty_type__error {\n  background-color: #ED7000;\n  border: 1px solid #e25353;\n  color: #FFF; }\n  .noty_theme__light.noty_type__error .noty_buttons {\n    border-color: darkred; }\n\n.noty_theme__light.noty_type__info,\n.noty_theme__light.noty_type__information {\n  background-color: #78C5E7;\n  border: 1px solid #3badd6;\n  color: #FFF; }\n  .noty_theme__light.noty_type__info .noty_buttons,\n  .noty_theme__light.noty_type__information .noty_buttons {\n    border-color: #0B90C4; }\n\n.noty_theme__light.noty_type__success {\n  background-color: #57C880;\n  border: 1px solid #7cdd77;\n  color: darkgreen; }\n  .noty_theme__light.noty_type__success .noty_buttons {\n    border-color: #50C24E; }\n"
  },
  {
    "path": "lib/themes/metroui.css",
    "content": ".noty_theme__metroui.noty_bar {\n  margin: 4px 0;\n  overflow: hidden;\n  position: relative;\n  box-shadow: rgba(0, 0, 0, 0.298039) 0 0 5px 0; }\n  .noty_theme__metroui.noty_bar .noty_progressbar {\n    position: absolute;\n    left: 0;\n    bottom: 0;\n    height: 3px;\n    width: 100%;\n    background-color: #000;\n    opacity: 0.2;\n    filter: alpha(opacity=20); }\n  .noty_theme__metroui.noty_bar .noty_body {\n    padding: 1.25em;\n    font-size: 14px; }\n  .noty_theme__metroui.noty_bar .noty_buttons {\n    padding: 0 10px .5em 10px; }\n\n.noty_theme__metroui.noty_type__alert,\n.noty_theme__metroui.noty_type__notification {\n  background-color: #fff;\n  color: #1d1d1d; }\n\n.noty_theme__metroui.noty_type__warning {\n  background-color: #FA6800;\n  color: #fff; }\n\n.noty_theme__metroui.noty_type__error {\n  background-color: #CE352C;\n  color: #FFF; }\n\n.noty_theme__metroui.noty_type__info,\n.noty_theme__metroui.noty_type__information {\n  background-color: #1BA1E2;\n  color: #FFF; }\n\n.noty_theme__metroui.noty_type__success {\n  background-color: #60A917;\n  color: #fff; }\n"
  },
  {
    "path": "lib/themes/mint.css",
    "content": ".noty_theme__mint.noty_bar {\n  margin: 4px 0;\n  overflow: hidden;\n  border-radius: 2px;\n  position: relative; }\n  .noty_theme__mint.noty_bar .noty_body {\n    padding: 10px;\n    font-size: 14px; }\n  .noty_theme__mint.noty_bar .noty_buttons {\n    padding: 10px; }\n\n.noty_theme__mint.noty_type__alert,\n.noty_theme__mint.noty_type__notification {\n  background-color: #fff;\n  border-bottom: 1px solid #D1D1D1;\n  color: #2F2F2F; }\n\n.noty_theme__mint.noty_type__warning {\n  background-color: #FFAE42;\n  border-bottom: 1px solid #E89F3C;\n  color: #fff; }\n\n.noty_theme__mint.noty_type__error {\n  background-color: #DE636F;\n  border-bottom: 1px solid #CA5A65;\n  color: #fff; }\n\n.noty_theme__mint.noty_type__info,\n.noty_theme__mint.noty_type__information {\n  background-color: #7F7EFF;\n  border-bottom: 1px solid #7473E8;\n  color: #fff; }\n\n.noty_theme__mint.noty_type__success {\n  background-color: #AFC765;\n  border-bottom: 1px solid #A0B55C;\n  color: #fff; }\n"
  },
  {
    "path": "lib/themes/nest.css",
    "content": ".noty_theme__nest.noty_bar {\n  margin: 0 0 15px 0;\n  overflow: hidden;\n  border-radius: 2px;\n  position: relative;\n  box-shadow: rgba(0, 0, 0, 0.098039) 5px 4px 10px 0; }\n  .noty_theme__nest.noty_bar .noty_body {\n    padding: 10px;\n    font-size: 14px;\n    text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); }\n  .noty_theme__nest.noty_bar .noty_buttons {\n    padding: 10px; }\n\n.noty_layout .noty_theme__nest.noty_bar {\n  z-index: 5; }\n\n.noty_layout .noty_theme__nest.noty_bar:nth-child(2) {\n  position: absolute;\n  top: 0;\n  margin-top: 4px;\n  margin-right: -4px;\n  margin-left: 4px;\n  z-index: 4;\n  width: 100%; }\n\n.noty_layout .noty_theme__nest.noty_bar:nth-child(3) {\n  position: absolute;\n  top: 0;\n  margin-top: 8px;\n  margin-right: -8px;\n  margin-left: 8px;\n  z-index: 3;\n  width: 100%; }\n\n.noty_layout .noty_theme__nest.noty_bar:nth-child(4) {\n  position: absolute;\n  top: 0;\n  margin-top: 12px;\n  margin-right: -12px;\n  margin-left: 12px;\n  z-index: 2;\n  width: 100%; }\n\n.noty_layout .noty_theme__nest.noty_bar:nth-child(5) {\n  position: absolute;\n  top: 0;\n  margin-top: 16px;\n  margin-right: -16px;\n  margin-left: 16px;\n  z-index: 1;\n  width: 100%; }\n\n.noty_layout .noty_theme__nest.noty_bar:nth-child(n+6) {\n  position: absolute;\n  top: 0;\n  margin-top: 20px;\n  margin-right: -20px;\n  margin-left: 20px;\n  z-index: -1;\n  width: 100%; }\n\n#noty_layout__bottomLeft .noty_theme__nest.noty_bar:nth-child(2),\n#noty_layout__topLeft .noty_theme__nest.noty_bar:nth-child(2) {\n  margin-top: 4px;\n  margin-left: -4px;\n  margin-right: 4px; }\n\n#noty_layout__bottomLeft .noty_theme__nest.noty_bar:nth-child(3),\n#noty_layout__topLeft .noty_theme__nest.noty_bar:nth-child(3) {\n  margin-top: 8px;\n  margin-left: -8px;\n  margin-right: 8px; }\n\n#noty_layout__bottomLeft .noty_theme__nest.noty_bar:nth-child(4),\n#noty_layout__topLeft .noty_theme__nest.noty_bar:nth-child(4) {\n  margin-top: 12px;\n  margin-left: -12px;\n  margin-right: 12px; }\n\n#noty_layout__bottomLeft .noty_theme__nest.noty_bar:nth-child(5),\n#noty_layout__topLeft .noty_theme__nest.noty_bar:nth-child(5) {\n  margin-top: 16px;\n  margin-left: -16px;\n  margin-right: 16px; }\n\n#noty_layout__bottomLeft .noty_theme__nest.noty_bar:nth-child(n+6),\n#noty_layout__topLeft .noty_theme__nest.noty_bar:nth-child(n+6) {\n  margin-top: 20px;\n  margin-left: -20px;\n  margin-right: 20px; }\n\n.noty_theme__nest.noty_type__alert,\n.noty_theme__nest.noty_type__notification {\n  background-color: #073B4C;\n  color: #fff; }\n  .noty_theme__nest.noty_type__alert .noty_progressbar,\n  .noty_theme__nest.noty_type__notification .noty_progressbar {\n    background-color: #fff; }\n\n.noty_theme__nest.noty_type__warning {\n  background-color: #FFD166;\n  color: #fff; }\n\n.noty_theme__nest.noty_type__error {\n  background-color: #EF476F;\n  color: #fff; }\n  .noty_theme__nest.noty_type__error .noty_progressbar {\n    opacity: .4; }\n\n.noty_theme__nest.noty_type__info,\n.noty_theme__nest.noty_type__information {\n  background-color: #118AB2;\n  color: #fff; }\n  .noty_theme__nest.noty_type__info .noty_progressbar,\n  .noty_theme__nest.noty_type__information .noty_progressbar {\n    opacity: .6; }\n\n.noty_theme__nest.noty_type__success {\n  background-color: #06D6A0;\n  color: #fff; }\n"
  },
  {
    "path": "lib/themes/relax.css",
    "content": ".noty_theme__relax.noty_bar {\n  margin: 4px 0;\n  overflow: hidden;\n  border-radius: 2px;\n  position: relative; }\n  .noty_theme__relax.noty_bar .noty_body {\n    padding: 10px; }\n  .noty_theme__relax.noty_bar .noty_buttons {\n    border-top: 1px solid #e7e7e7;\n    padding: 5px 10px; }\n\n.noty_theme__relax.noty_type__alert,\n.noty_theme__relax.noty_type__notification {\n  background-color: #fff;\n  border: 1px solid #dedede;\n  color: #444; }\n\n.noty_theme__relax.noty_type__warning {\n  background-color: #FFEAA8;\n  border: 1px solid #FFC237;\n  color: #826200; }\n  .noty_theme__relax.noty_type__warning .noty_buttons {\n    border-color: #dfaa30; }\n\n.noty_theme__relax.noty_type__error {\n  background-color: #FF8181;\n  border: 1px solid #e25353;\n  color: #FFF; }\n  .noty_theme__relax.noty_type__error .noty_buttons {\n    border-color: darkred; }\n\n.noty_theme__relax.noty_type__info,\n.noty_theme__relax.noty_type__information {\n  background-color: #78C5E7;\n  border: 1px solid #3badd6;\n  color: #FFF; }\n  .noty_theme__relax.noty_type__info .noty_buttons,\n  .noty_theme__relax.noty_type__information .noty_buttons {\n    border-color: #0B90C4; }\n\n.noty_theme__relax.noty_type__success {\n  background-color: #BCF5BC;\n  border: 1px solid #7cdd77;\n  color: darkgreen; }\n  .noty_theme__relax.noty_type__success .noty_buttons {\n    border-color: #50C24E; }\n"
  },
  {
    "path": "lib/themes/semanticui.css",
    "content": ".noty_theme__semanticui.noty_bar {\n  margin: 4px 0;\n  overflow: hidden;\n  position: relative;\n  border: 1px solid transparent;\n  font-size: 1em;\n  border-radius: .28571429rem;\n  box-shadow: 0 0 0 1px rgba(34, 36, 38, 0.22) inset, 0 0 0 0 transparent; }\n  .noty_theme__semanticui.noty_bar .noty_body {\n    padding: 1em 1.5em;\n    line-height: 1.4285em; }\n  .noty_theme__semanticui.noty_bar .noty_buttons {\n    padding: 10px; }\n\n.noty_theme__semanticui.noty_type__alert,\n.noty_theme__semanticui.noty_type__notification {\n  background-color: #f8f8f9;\n  color: rgba(0, 0, 0, 0.87); }\n\n.noty_theme__semanticui.noty_type__warning {\n  background-color: #fffaf3;\n  color: #573a08;\n  box-shadow: 0 0 0 1px #c9ba9b inset, 0 0 0 0 transparent; }\n\n.noty_theme__semanticui.noty_type__error {\n  background-color: #fff6f6;\n  color: #9f3a38;\n  box-shadow: 0 0 0 1px #e0b4b4 inset, 0 0 0 0 transparent; }\n\n.noty_theme__semanticui.noty_type__info,\n.noty_theme__semanticui.noty_type__information {\n  background-color: #f8ffff;\n  color: #276f86;\n  box-shadow: 0 0 0 1px #a9d5de inset, 0 0 0 0 transparent; }\n\n.noty_theme__semanticui.noty_type__success {\n  background-color: #fcfff5;\n  color: #2c662d;\n  box-shadow: 0 0 0 1px #a3c293 inset, 0 0 0 0 transparent; }\n"
  },
  {
    "path": "lib/themes/sunset.css",
    "content": ".noty_theme__sunset.noty_bar {\n  margin: 4px 0;\n  overflow: hidden;\n  border-radius: 2px;\n  position: relative; }\n  .noty_theme__sunset.noty_bar .noty_body {\n    padding: 10px;\n    font-size: 14px;\n    text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); }\n  .noty_theme__sunset.noty_bar .noty_buttons {\n    padding: 10px; }\n\n.noty_theme__sunset.noty_type__alert,\n.noty_theme__sunset.noty_type__notification {\n  background-color: #073B4C;\n  color: #fff; }\n  .noty_theme__sunset.noty_type__alert .noty_progressbar,\n  .noty_theme__sunset.noty_type__notification .noty_progressbar {\n    background-color: #fff; }\n\n.noty_theme__sunset.noty_type__warning {\n  background-color: #FFD166;\n  color: #fff; }\n\n.noty_theme__sunset.noty_type__error {\n  background-color: #EF476F;\n  color: #fff; }\n  .noty_theme__sunset.noty_type__error .noty_progressbar {\n    opacity: .4; }\n\n.noty_theme__sunset.noty_type__info,\n.noty_theme__sunset.noty_type__information {\n  background-color: #118AB2;\n  color: #fff; }\n  .noty_theme__sunset.noty_type__info .noty_progressbar,\n  .noty_theme__sunset.noty_type__information .noty_progressbar {\n    opacity: .6; }\n\n.noty_theme__sunset.noty_type__success {\n  background-color: #06D6A0;\n  color: #fff; }\n"
  },
  {
    "path": "manifest.json.template",
    "content": "{\n  \"name\": \"NOTY\",\n  \"short_name\": \"NOTY\",\n  \"start_url\": \"./demo/push.html\",\n  \"display\": \"standalone\",\n  \"gcm_sender_id\": \"<-your-sender-id>\"\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"noty\",\n  \"version\": \"3.2.0-beta\",\n  \"title\": \"Noty - Dependency-free notification library\",\n  \"description\": \"Noty is a dependency-free notification library that makes it easy to create alert - success - error - warning - information - confirmation messages as an alternative the standard alert dialog. Each notification is added to a queue. (Optional)\",\n  \"homepage\": \"https://ned.im/noty\",\n  \"main\": \"lib/noty.js\",\n  \"types\": \"index.d.ts\",\n  \"keywords\": [\n    \"noty\",\n    \"notification\",\n    \"alert\",\n    \"confirm\",\n    \"confirmation\",\n    \"success\",\n    \"error\",\n    \"warning\",\n    \"information\"\n  ],\n  \"files\": [\n    \"lib\",\n    \"src\",\n    \"index.d.ts\"\n  ],\n  \"bugs\": {\n    \"url\": \"https://github.com/needim/noty/issues\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/needim/noty.git\"\n  },\n  \"author\": {\n    \"name\": \"Nedim Arabacı\",\n    \"url\": \"http://ned.im\"\n  },\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"build\": \"grunt themes && webpack --env dev && webpack --env build && grunt banner\",\n    \"dev\": \"grunt themes && webpack --progress --colors --watch --env dev\",\n    \"format\": \"prettier-standard 'src/**/*.js'\",\n    \"test\": \"npm run format && standard && grunt test\",\n    \"browserstack\": \"node_modules/.bin/browserstack-runner\",\n    \"precommit-msg\": \"echo 'Pre-commit checks...' && exit 0\",\n    \"serve-docs\": \"docsify start ./docs\"\n  },\n  \"pre-commit\": [\n    \"precommit-msg\",\n    \"test\"\n  ],\n  \"standard\": {\n    \"ignore\": [\n      \"demo/**/*\",\n      \"docs/**/*\",\n      \"lib/**\",\n      \"test/**\"\n    ],\n    \"parser\": \"babel-eslint\"\n  },\n  \"devDependencies\": {\n    \"autoprefixer\": \"^6.3.6\",\n    \"babel-core\": \"6.24.1\",\n    \"babel-eslint\": \"7.2.2\",\n    \"babel-loader\": \"6.4.1\",\n    \"babel-plugin-add-module-exports\": \"0.2.1\",\n    \"babel-preset-es2015\": \"6.24.1\",\n    \"browser-sync\": \"^2.19.0\",\n    \"browser-sync-webpack-plugin\": \"^1.2.0\",\n    \"browserstack-runner\": \"^0.5.2\",\n    \"css-loader\": \"^0.26.0\",\n    \"docsify-cli\": \"^4.1.9\",\n    \"es6-promise\": \"^4.1.0\",\n    \"eslint\": \"^4.3.0\",\n    \"eslint-loader\": \"1.9.0\",\n    \"extract-text-webpack-plugin\": \"2.1.0\",\n    \"grunt\": \"^1.0.1\",\n    \"grunt-banner\": \"^0.6.0\",\n    \"grunt-contrib-connect\": \"^1.0.2\",\n    \"grunt-contrib-qunit\": \"^2.0.0\",\n    \"grunt-curl\": \"^2.2.1\",\n    \"grunt-exec\": \"^2.0.0\",\n    \"grunt-sass\": \"^2.0.0\",\n    \"load-grunt-tasks\": \"^3.5.2\",\n    \"node-sass\": \"^4.1.0\",\n    \"postcss-loader\": \"^1.0.0\",\n    \"pre-commit\": \"^1.2.2\",\n    \"prettier-standard\": \"^3.0.1\",\n    \"sass-loader\": \"^4.0.1\",\n    \"standard\": \"^10.0.2\",\n    \"standard-loader\": \"^6.0.1\",\n    \"style-loader\": \"^0.13.1\",\n    \"web-push\": \"^3.2.2\",\n    \"webpack\": \"2.4.1\",\n    \"yargs\": \"7.0.2\"\n  }\n}\n"
  },
  {
    "path": "postcss.config.js",
    "content": "module.exports = {\n  plugins: [\n    require('autoprefixer')({\n      browsers: ['last 8 versions']\n    })\n  ]\n}\n"
  },
  {
    "path": "service-worker.js.template",
    "content": "self.addEventListener('install', event => {\n  self.skipWaiting()\n  console.log('worker installed', event)\n})\n\nself.addEventListener('activate', event => {\n  console.log('worker activated', event)\n})\n\nself.addEventListener('push', event => {\n  console.log('push fired', event)\n\n  const data = event.data.json()\n\n  const options = {\n    body: data.body,\n    icon: data.icon ? data.icon : '',\n    image: data.image ? data.image : '',\n    data: {\n      url: data.url\n    }\n  }\n\n  if (data.actions)\n    options.actions = data.actions\n\n  event.waitUntil(\n    Promise.all([\n      self.registration.showNotification(data.title, options)\n    ])\n  )\n})\n\nself.addEventListener('notificationclick', event => {\n  console.log('notificationclick fired', event)\n  // INFO: You can customize this callback for your needs\n\n  // currently we are closing notification on click\n  event.notification.close()\n\n  if (event.action) {\n    console.log('action clicked', event.action)\n  }\n\n  // then if url is provided open a new window\n  var clickResponsePromise = Promise.resolve()\n  if (event.notification.data && event.notification.data.url) {\n    clickResponsePromise = clients.openWindow(event.notification.data.url)\n  }\n\n  event.waitUntil(\n    Promise.all([\n      clickResponsePromise\n    ])\n  )\n})\n"
  },
  {
    "path": "src/api.js",
    "content": "import * as Utils from 'utils'\n\nexport let PageHidden = false\nexport let DocModalCount = 0\n\nconst DocTitleProps = {\n  originalTitle: null,\n  count: 0,\n  changed: false,\n  timer: -1\n}\n\nexport const docTitle = {\n  increment: () => {\n    DocTitleProps.count++\n\n    docTitle._update()\n  },\n\n  decrement: () => {\n    DocTitleProps.count--\n\n    if (DocTitleProps.count <= 0) {\n      docTitle._clear()\n      return\n    }\n\n    docTitle._update()\n  },\n\n  _update: () => {\n    let title = document.title\n\n    if (!DocTitleProps.changed) {\n      DocTitleProps.originalTitle = title\n      document.title = `(${DocTitleProps.count}) ${title}`\n      DocTitleProps.changed = true\n    } else {\n      document.title = `(${DocTitleProps.count}) ${DocTitleProps.originalTitle}`\n    }\n  },\n\n  _clear: () => {\n    if (DocTitleProps.changed) {\n      DocTitleProps.count = 0\n      document.title = DocTitleProps.originalTitle\n      DocTitleProps.changed = false\n    }\n  }\n}\n\nexport const DefaultMaxVisible = 5\n\nexport const Queues = {\n  global: {\n    maxVisible: DefaultMaxVisible,\n    queue: []\n  }\n}\n\nexport const Store = {}\n\nexport let Defaults = {\n  type: 'alert',\n  layout: 'topRight',\n  theme: 'mint',\n  text: '',\n  timeout: false,\n  progressBar: true,\n  closeWith: ['click'],\n  animation: {\n    open: 'noty_effects_open',\n    close: 'noty_effects_close'\n  },\n  id: false,\n  force: false,\n  killer: false,\n  queue: 'global',\n  container: false,\n  buttons: [],\n  callbacks: {\n    beforeShow: null,\n    onShow: null,\n    afterShow: null,\n    onClose: null,\n    afterClose: null,\n    onClick: null,\n    onHover: null,\n    onTemplate: null\n  },\n  sounds: {\n    sources: [],\n    volume: 1,\n    conditions: []\n  },\n  titleCount: {\n    conditions: []\n  },\n  modal: false,\n  visibilityControl: false\n}\n\n/**\n * @param {string} queueName\n * @return {object}\n */\nexport function getQueueCounts (queueName = 'global') {\n  let count = 0\n  let max = DefaultMaxVisible\n\n  if (Queues.hasOwnProperty(queueName)) {\n    max = Queues[queueName].maxVisible\n    Object.keys(Store).forEach(i => {\n      if (Store[i].options.queue === queueName && !Store[i].closed) count++\n    })\n  }\n\n  return {\n    current: count,\n    maxVisible: max\n  }\n}\n\n/**\n * @param {Noty} ref\n * @return {void}\n */\nexport function addToQueue (ref) {\n  if (!Queues.hasOwnProperty(ref.options.queue)) {\n    Queues[ref.options.queue] = {maxVisible: DefaultMaxVisible, queue: []}\n  }\n\n  Queues[ref.options.queue].queue.push(ref)\n}\n\n/**\n * @param {Noty} ref\n * @return {void}\n */\nexport function removeFromQueue (ref) {\n  if (Queues.hasOwnProperty(ref.options.queue)) {\n    const queue = []\n    Object.keys(Queues[ref.options.queue].queue).forEach(i => {\n      if (Queues[ref.options.queue].queue[i].id !== ref.id) {\n        queue.push(Queues[ref.options.queue].queue[i])\n      }\n    })\n    Queues[ref.options.queue].queue = queue\n  }\n}\n\n/**\n * @param {string} queueName\n * @return {void}\n */\nexport function queueRender (queueName = 'global') {\n  if (Queues.hasOwnProperty(queueName)) {\n    const noty = Queues[queueName].queue.shift()\n\n    if (noty) noty.show()\n  }\n}\n\n/**\n * @return {void}\n */\nexport function queueRenderAll () {\n  Object.keys(Queues).forEach(queueName => {\n    queueRender(queueName)\n  })\n}\n\n/**\n * @param {Noty} ref\n * @return {void}\n */\nexport function ghostFix (ref) {\n  const ghostID = Utils.generateID('ghost')\n  let ghost = document.createElement('div')\n  ghost.setAttribute('id', ghostID)\n  Utils.css(ghost, {\n    height: Utils.outerHeight(ref.barDom) + 'px'\n  })\n\n  ref.barDom.insertAdjacentHTML('afterend', ghost.outerHTML)\n\n  Utils.remove(ref.barDom)\n  ghost = document.getElementById(ghostID)\n  Utils.addClass(ghost, 'noty_fix_effects_height')\n  Utils.addListener(ghost, Utils.animationEndEvents, () => {\n    Utils.remove(ghost)\n  })\n}\n\n/**\n * @param {Noty} ref\n * @return {void}\n */\nexport function build (ref) {\n  findOrCreateContainer(ref)\n\n  const markup = `<div class=\"noty_body\">${ref.options.text}</div>${buildButtons(ref)}<div class=\"noty_progressbar\"></div>`\n\n  ref.barDom = document.createElement('div')\n  ref.barDom.setAttribute('id', ref.id)\n  Utils.addClass(\n    ref.barDom,\n    `noty_bar noty_type__${ref.options.type} noty_theme__${ref.options.theme}`\n  )\n\n  ref.barDom.innerHTML = markup\n\n  fire(ref, 'onTemplate')\n}\n\n/**\n * @param {Noty} ref\n * @return {boolean}\n */\nexport function hasButtons (ref) {\n  return !!(ref.options.buttons && Object.keys(ref.options.buttons).length)\n}\n\n/**\n * @param {Noty} ref\n * @return {string}\n */\nfunction buildButtons (ref) {\n  if (hasButtons(ref)) {\n    let buttons = document.createElement('div')\n    Utils.addClass(buttons, 'noty_buttons')\n\n    Object.keys(ref.options.buttons).forEach(key => {\n      buttons.appendChild(ref.options.buttons[key].dom)\n    })\n\n    ref.options.buttons.forEach(btn => {\n      buttons.appendChild(btn.dom)\n    })\n    return buttons.outerHTML\n  }\n  return ''\n}\n\n/**\n * @param {Noty} ref\n * @return {void}\n */\nexport function handleModal (ref) {\n  if (ref.options.modal) {\n    if (DocModalCount === 0) {\n      createModal(ref)\n    }\n\n    DocModalCount++\n  }\n}\n\n/**\n * @param {Noty} ref\n * @return {void}\n */\nexport function handleModalClose (ref) {\n  if (ref.options.modal && DocModalCount > 0) {\n    DocModalCount--\n\n    if (DocModalCount <= 0) {\n      const modal = document.querySelector('.noty_modal')\n\n      if (modal) {\n        Utils.removeClass(modal, 'noty_modal_open')\n        Utils.addClass(modal, 'noty_modal_close')\n        Utils.addListener(modal, Utils.animationEndEvents, () => {\n          Utils.remove(modal)\n        })\n      }\n    }\n  }\n}\n\n/**\n * @return {void}\n */\nfunction createModal () {\n  const body = document.querySelector('body')\n  const modal = document.createElement('div')\n  Utils.addClass(modal, 'noty_modal')\n  body.insertBefore(modal, body.firstChild)\n  Utils.addClass(modal, 'noty_modal_open')\n\n  Utils.addListener(modal, Utils.animationEndEvents, () => {\n    Utils.removeClass(modal, 'noty_modal_open')\n  })\n}\n\n/**\n * @param {Noty} ref\n * @return {void}\n */\nfunction findOrCreateContainer (ref) {\n  if (ref.options.container) {\n    ref.layoutDom = document.querySelector(ref.options.container)\n    return\n  }\n\n  const layoutID = `noty_layout__${ref.options.layout}`\n  ref.layoutDom = document.querySelector(`div#${layoutID}`)\n\n  if (!ref.layoutDom) {\n    ref.layoutDom = document.createElement('div')\n    ref.layoutDom.setAttribute('id', layoutID)\n    ref.layoutDom.setAttribute('role', 'alert')\n    ref.layoutDom.setAttribute('aria-live', 'polite')\n    Utils.addClass(ref.layoutDom, 'noty_layout')\n    document.querySelector('body').appendChild(ref.layoutDom)\n  }\n}\n\n/**\n * @param {Noty} ref\n * @return {void}\n */\nexport function queueClose (ref) {\n  if (ref.options.timeout) {\n    if (ref.options.progressBar && ref.progressDom) {\n      Utils.css(ref.progressDom, {\n        transition: `width ${ref.options.timeout}ms linear`,\n        width: '0%'\n      })\n    }\n\n    clearTimeout(ref.closeTimer)\n\n    ref.closeTimer = setTimeout(\n      () => {\n        ref.close()\n      },\n      ref.options.timeout\n    )\n  }\n}\n\n/**\n * @param {Noty} ref\n * @return {void}\n */\nexport function dequeueClose (ref) {\n  if (ref.options.timeout && ref.closeTimer) {\n    clearTimeout(ref.closeTimer)\n    ref.closeTimer = -1\n\n    if (ref.options.progressBar && ref.progressDom) {\n      Utils.css(ref.progressDom, {\n        transition: 'width 0ms linear',\n        width: '100%'\n      })\n    }\n  }\n}\n\n/**\n * @param {Noty} ref\n * @param {string} eventName\n * @return {void}\n */\nexport function fire (ref, eventName) {\n  if (ref.listeners.hasOwnProperty(eventName)) {\n    ref.listeners[eventName].forEach(cb => {\n      if (typeof cb === 'function') {\n        cb.apply(ref)\n      }\n    })\n  }\n}\n\n/**\n * @param {Noty} ref\n * @return {void}\n */\nexport function openFlow (ref) {\n  fire(ref, 'afterShow')\n  queueClose(ref)\n\n  Utils.addListener(ref.barDom, 'mouseenter', () => {\n    dequeueClose(ref)\n  })\n\n  Utils.addListener(ref.barDom, 'mouseleave', () => {\n    queueClose(ref)\n  })\n}\n\n/**\n * @param {Noty} ref\n * @return {void}\n */\nexport function closeFlow (ref) {\n  delete Store[ref.id]\n  ref.closing = false\n  fire(ref, 'afterClose')\n\n  Utils.remove(ref.barDom)\n\n  if (\n    ref.layoutDom.querySelectorAll('.noty_bar').length === 0 &&\n    !ref.options.container\n  ) {\n    Utils.remove(ref.layoutDom)\n  }\n\n  if (\n    Utils.inArray('docVisible', ref.options.titleCount.conditions) ||\n    Utils.inArray('docHidden', ref.options.titleCount.conditions)\n  ) {\n    docTitle.decrement()\n  }\n\n  queueRender(ref.options.queue)\n}\n"
  },
  {
    "path": "src/button.js",
    "content": "import * as Utils from 'utils'\n\nexport class NotyButton {\n  constructor (html, classes, cb, attributes = {}) {\n    this.dom = document.createElement('button')\n    this.dom.innerHTML = html\n    this.id = (attributes.id = attributes.id || Utils.generateID('button'))\n    this.cb = cb\n    Object.keys(attributes).forEach(propertyName => {\n      this.dom.setAttribute(propertyName, attributes[propertyName])\n    })\n    Utils.addClass(this.dom, classes || 'noty_btn')\n\n    return this\n  }\n}\n"
  },
  {
    "path": "src/index.js",
    "content": "/* global VERSION */\n\nimport 'noty.scss'\nimport Promise from 'es6-promise'\nimport * as Utils from 'utils'\nimport * as API from 'api'\nimport { NotyButton } from 'button'\nimport { Push } from 'push'\n\nexport default class Noty {\n  /**\n   * @param {object} options\n   * @return {Noty}\n   */\n  constructor (options = {}) {\n    this.options = Utils.deepExtend({}, API.Defaults, options)\n\n    if (API.Store[this.options.id]) {\n      return API.Store[this.options.id]\n    }\n\n    this.id = this.options.id || Utils.generateID('bar')\n    this.closeTimer = -1\n    this.barDom = null\n    this.layoutDom = null\n    this.progressDom = null\n    this.showing = false\n    this.shown = false\n    this.closed = false\n    this.closing = false\n    this.killable = this.options.timeout || this.options.closeWith.length > 0\n    this.hasSound = this.options.sounds.sources.length > 0\n    this.soundPlayed = false\n    this.listeners = {\n      beforeShow: [],\n      onShow: [],\n      afterShow: [],\n      onClose: [],\n      afterClose: [],\n      onClick: [],\n      onHover: [],\n      onTemplate: []\n    }\n    this.promises = {\n      show: null,\n      close: null\n    }\n    this.on('beforeShow', this.options.callbacks.beforeShow)\n    this.on('onShow', this.options.callbacks.onShow)\n    this.on('afterShow', this.options.callbacks.afterShow)\n    this.on('onClose', this.options.callbacks.onClose)\n    this.on('afterClose', this.options.callbacks.afterClose)\n    this.on('onClick', this.options.callbacks.onClick)\n    this.on('onHover', this.options.callbacks.onHover)\n    this.on('onTemplate', this.options.callbacks.onTemplate)\n\n    return this\n  }\n\n  /**\n   * @param {string} eventName\n   * @param {function} cb\n   * @return {Noty}\n   */\n  on (eventName, cb = () => {}) {\n    if (typeof cb === 'function' && this.listeners.hasOwnProperty(eventName)) {\n      this.listeners[eventName].push(cb)\n    }\n\n    return this\n  }\n\n  /**\n   * @return {Noty}\n   */\n  show () {\n    if (this.showing || this.shown) {\n      return this // preventing multiple show\n    }\n\n    if (this.options.killer === true) {\n      Noty.closeAll()\n    } else if (typeof this.options.killer === 'string') {\n      Noty.closeAll(this.options.killer)\n    }\n\n    let queueCounts = API.getQueueCounts(this.options.queue)\n\n    if (\n      queueCounts.current >= queueCounts.maxVisible ||\n      (API.PageHidden && this.options.visibilityControl)\n    ) {\n      API.addToQueue(this)\n\n      if (\n        API.PageHidden &&\n        this.hasSound &&\n        Utils.inArray('docHidden', this.options.sounds.conditions)\n      ) {\n        Utils.createAudioElements(this)\n      }\n\n      if (\n        API.PageHidden &&\n        Utils.inArray('docHidden', this.options.titleCount.conditions)\n      ) {\n        API.docTitle.increment()\n      }\n\n      return this\n    }\n\n    API.Store[this.id] = this\n\n    API.fire(this, 'beforeShow')\n\n    this.showing = true\n\n    if (this.closing) {\n      this.showing = false\n      return this\n    }\n\n    API.build(this)\n    API.handleModal(this)\n\n    if (this.options.force) {\n      this.layoutDom.insertBefore(this.barDom, this.layoutDom.firstChild)\n    } else {\n      this.layoutDom.appendChild(this.barDom)\n    }\n\n    if (\n      this.hasSound &&\n      !this.soundPlayed &&\n      Utils.inArray('docVisible', this.options.sounds.conditions)\n    ) {\n      Utils.createAudioElements(this)\n    }\n\n    if (Utils.inArray('docVisible', this.options.titleCount.conditions)) {\n      API.docTitle.increment()\n    }\n\n    this.shown = true\n    this.closed = false\n\n    // bind button events if any\n    if (API.hasButtons(this)) {\n      Object.keys(this.options.buttons).forEach(key => {\n        const btn = this.barDom.querySelector(\n          `#${this.options.buttons[key].id}`\n        )\n        Utils.addListener(btn, 'click', e => {\n          Utils.stopPropagation(e)\n          this.options.buttons[key].cb(this)\n        })\n      })\n    }\n\n    this.progressDom = this.barDom.querySelector('.noty_progressbar')\n\n    if (Utils.inArray('click', this.options.closeWith)) {\n      Utils.addClass(this.barDom, 'noty_close_with_click')\n      Utils.addListener(\n        this.barDom,\n        'click',\n        e => {\n          Utils.stopPropagation(e)\n          API.fire(this, 'onClick')\n          this.close()\n        },\n        false\n      )\n    }\n\n    Utils.addListener(\n      this.barDom,\n      'mouseenter',\n      () => {\n        API.fire(this, 'onHover')\n      },\n      false\n    )\n\n    if (this.options.timeout) Utils.addClass(this.barDom, 'noty_has_timeout')\n    if (this.options.progressBar) {\n      Utils.addClass(this.barDom, 'noty_has_progressbar')\n    }\n\n    if (Utils.inArray('button', this.options.closeWith)) {\n      Utils.addClass(this.barDom, 'noty_close_with_button')\n\n      const closeButton = document.createElement('div')\n      Utils.addClass(closeButton, 'noty_close_button')\n      closeButton.innerHTML = '×'\n      this.barDom.appendChild(closeButton)\n\n      Utils.addListener(\n        closeButton,\n        'click',\n        e => {\n          Utils.stopPropagation(e)\n          this.close()\n        },\n        false\n      )\n    }\n\n    API.fire(this, 'onShow')\n\n    if (this.options.animation.open === null) {\n      this.promises.show = new Promise(resolve => {\n        resolve()\n      })\n    } else if (typeof this.options.animation.open === 'function') {\n      this.promises.show = new Promise(this.options.animation.open.bind(this))\n    } else {\n      Utils.addClass(this.barDom, this.options.animation.open)\n      this.promises.show = new Promise(resolve => {\n        Utils.addListener(this.barDom, Utils.animationEndEvents, () => {\n          Utils.removeClass(this.barDom, this.options.animation.open)\n          resolve()\n        })\n      })\n    }\n\n    this.promises.show.then(() => {\n      const _t = this\n      setTimeout(\n        () => {\n          API.openFlow(_t)\n        },\n        100\n      )\n    })\n\n    return this\n  }\n\n  /**\n   * @return {Noty}\n   */\n  stop () {\n    API.dequeueClose(this)\n    return this\n  }\n\n  /**\n   * @return {Noty}\n   */\n  resume () {\n    API.queueClose(this)\n    return this\n  }\n\n  /**\n   * @param {int|boolean} ms\n   * @return {Noty}\n   */\n  setTimeout (ms) {\n    this.stop()\n    this.options.timeout = ms\n\n    if (this.barDom) {\n      if (this.options.timeout) {\n        Utils.addClass(this.barDom, 'noty_has_timeout')\n      } else {\n        Utils.removeClass(this.barDom, 'noty_has_timeout')\n      }\n\n      const _t = this\n      setTimeout(\n        function () {\n          // ugly fix for progressbar display bug\n          _t.resume()\n        },\n        100\n      )\n    }\n\n    return this\n  }\n\n  /**\n   * @param {string} html\n   * @param {boolean} optionsOverride\n   * @return {Noty}\n   */\n  setText (html, optionsOverride = false) {\n    if (this.barDom) {\n      this.barDom.querySelector('.noty_body').innerHTML = html\n    }\n\n    if (optionsOverride) this.options.text = html\n\n    return this\n  }\n\n  /**\n   * @param {string} type\n   * @param {boolean} optionsOverride\n   * @return {Noty}\n   */\n  setType (type, optionsOverride = false) {\n    if (this.barDom) {\n      let classList = Utils.classList(this.barDom).split(' ')\n\n      classList.forEach(c => {\n        if (c.substring(0, 11) === 'noty_type__') {\n          Utils.removeClass(this.barDom, c)\n        }\n      })\n\n      Utils.addClass(this.barDom, `noty_type__${type}`)\n    }\n\n    if (optionsOverride) this.options.type = type\n\n    return this\n  }\n\n  /**\n   * @param {string} theme\n   * @param {boolean} optionsOverride\n   * @return {Noty}\n   */\n  setTheme (theme, optionsOverride = false) {\n    if (this.barDom) {\n      let classList = Utils.classList(this.barDom).split(' ')\n\n      classList.forEach(c => {\n        if (c.substring(0, 12) === 'noty_theme__') {\n          Utils.removeClass(this.barDom, c)\n        }\n      })\n\n      Utils.addClass(this.barDom, `noty_theme__${theme}`)\n    }\n\n    if (optionsOverride) this.options.theme = theme\n\n    return this\n  }\n\n  /**\n   * @return {Noty}\n   */\n  close () {\n    if (this.closed) return this\n\n    if (!this.shown) {\n      // it's in the queue\n      API.removeFromQueue(this)\n      return this\n    }\n\n    API.fire(this, 'onClose')\n\n    this.closing = true\n\n    if (this.options.animation.close === null || this.options.animation.close === false) {\n      this.promises.close = new Promise(resolve => {\n        resolve()\n      })\n    } else if (typeof this.options.animation.close === 'function') {\n      this.promises.close = new Promise(\n        this.options.animation.close.bind(this)\n      )\n    } else {\n      Utils.addClass(this.barDom, this.options.animation.close)\n      this.promises.close = new Promise(resolve => {\n        Utils.addListener(this.barDom, Utils.animationEndEvents, () => {\n          if (this.options.force) {\n            Utils.remove(this.barDom)\n          } else {\n            API.ghostFix(this)\n          }\n          resolve()\n        })\n      })\n    }\n\n    this.promises.close.then(() => {\n      API.closeFlow(this)\n      API.handleModalClose(this)\n    })\n\n    this.closed = true\n\n    return this\n  }\n\n  // API functions\n\n  /**\n   * @param {boolean|string} queueName\n   * @return {Noty}\n   */\n  static closeAll (queueName = false) {\n    Object.keys(API.Store).forEach(id => {\n      if (queueName) {\n        if (\n          API.Store[id].options.queue === queueName && API.Store[id].killable\n        ) {\n          API.Store[id].close()\n        }\n      } else if (API.Store[id].killable) {\n        API.Store[id].close()\n      }\n    })\n    return this\n  }\n\n  /**\n   * @param {string} queueName\n   * @return {Noty}\n   */\n  static clearQueue (queueName = 'global') {\n    if (API.Queues.hasOwnProperty(queueName)) {\n      API.Queues[queueName].queue = []\n    }\n    return this\n  }\n\n  /**\n   * @return {API.Queues}\n   */\n  static get Queues () {\n    return API.Queues\n  }\n\n  /**\n   * @return {API.PageHidden}\n   */\n  static get PageHidden () {\n    return API.PageHidden\n  }\n\n  /**\n   * @param {Object} obj\n   * @return {Noty}\n   */\n  static overrideDefaults (obj) {\n    API.Defaults = Utils.deepExtend({}, API.Defaults, obj)\n    return this\n  }\n\n  /**\n   * @param {int} amount\n   * @param {string} queueName\n   * @return {Noty}\n   */\n  static setMaxVisible (amount = API.DefaultMaxVisible, queueName = 'global') {\n    if (!API.Queues.hasOwnProperty(queueName)) {\n      API.Queues[queueName] = {maxVisible: amount, queue: []}\n    }\n\n    API.Queues[queueName].maxVisible = amount\n    return this\n  }\n\n  /**\n   * @param {string} innerHtml\n   * @param {String} classes\n   * @param {Function} cb\n   * @param {Object} attributes\n   * @return {NotyButton}\n   */\n  static button (innerHtml, classes = null, cb, attributes = {}) {\n    return new NotyButton(innerHtml, classes, cb, attributes)\n  }\n\n  /**\n   * @return {string}\n   */\n  static version () {\n    return VERSION\n  }\n\n  /**\n   * @param {String} workerPath\n   * @return {Push}\n   */\n  static Push (workerPath) {\n    return new Push(workerPath)\n  }\n}\n\n// Document visibility change controller\nif (typeof window !== 'undefined') {\n  Utils.visibilityChangeFlow()\n}\n"
  },
  {
    "path": "src/noty.scss",
    "content": "$noty-primary-color: #333 !default;\n$noty-default-width: 325px !default;\n$noty-corner-space: 20px !default;\n\n.noty_layout_mixin {\n  position: fixed;\n  margin: 0;\n  padding: 0;\n  z-index: 9999999;\n  transform: translateZ(0) scale(1.0, 1.0);\n  backface-visibility: hidden;\n  -webkit-font-smoothing: subpixel-antialiased;\n  filter: blur(0);\n  -webkit-filter: blur(0);\n  max-width: 90%;\n}\n\n#noty_layout__top {\n  @extend .noty_layout_mixin;\n  top: 0;\n  left: 5%;\n  width: 90%;\n}\n\n#noty_layout__topLeft {\n  @extend .noty_layout_mixin;\n  top: $noty-corner-space;\n  left: $noty-corner-space;\n  width: $noty-default-width;\n}\n\n#noty_layout__topCenter {\n  @extend .noty_layout_mixin;\n  top: 5%;\n  left: 50%;\n  width: $noty-default-width;\n  transform: translate(calc(-50% - .5px)) translateZ(0) scale(1.0, 1.0);\n}\n\n#noty_layout__topRight {\n  @extend .noty_layout_mixin;\n  top: $noty-corner-space;\n  right: $noty-corner-space;\n  width: $noty-default-width;\n}\n\n#noty_layout__bottom {\n  @extend .noty_layout_mixin;\n  bottom: 0;\n  left: 5%;\n  width: 90%;\n}\n\n#noty_layout__bottomLeft {\n  @extend .noty_layout_mixin;\n  bottom: $noty-corner-space;\n  left: $noty-corner-space;\n  width: $noty-default-width;\n}\n\n#noty_layout__bottomCenter {\n  @extend .noty_layout_mixin;\n  bottom: 5%;\n  left: 50%;\n  width: $noty-default-width;\n  transform: translate(calc(-50% - .5px)) translateZ(0) scale(1.0, 1.0);\n}\n\n#noty_layout__bottomRight {\n  @extend .noty_layout_mixin;\n  bottom: $noty-corner-space;\n  right: $noty-corner-space;\n  width: $noty-default-width;\n}\n\n#noty_layout__center {\n  @extend .noty_layout_mixin;\n  top: 50%;\n  left: 50%;\n  width: $noty-default-width;\n  transform: translate(calc(-50% - .5px), calc(-50% - .5px)) translateZ(0) scale(1.0, 1.0);\n}\n\n#noty_layout__centerLeft {\n  @extend .noty_layout_mixin;\n  top: 50%;\n  left: $noty-corner-space;\n  width: $noty-default-width;\n  transform: translate(0, calc(-50% - .5px)) translateZ(0) scale(1.0, 1.0);\n}\n\n#noty_layout__centerRight {\n  @extend .noty_layout_mixin;\n  top: 50%;\n  right: $noty-corner-space;\n  width: $noty-default-width;\n  transform: translate(0, calc(-50% - .5px)) translateZ(0) scale(1, 1);\n}\n\n.noty_progressbar {\n  display: none;\n}\n\n.noty_has_timeout.noty_has_progressbar .noty_progressbar {\n  display: block;\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  height: 3px;\n  width: 100%;\n  background-color: #646464;\n  opacity: 0.2;\n  filter: alpha(opacity=10)\n}\n\n.noty_bar {\n  -webkit-backface-visibility: hidden;\n  -webkit-transform: translate(0, 0) translateZ(0) scale(1.0, 1.0);\n  transform: translate(0, 0) scale(1.0, 1.0);\n  -webkit-font-smoothing: subpixel-antialiased;\n  overflow: hidden;\n}\n\n.noty_effects_open {\n  opacity: 0;\n  transform: translate(50%);\n  animation: noty_anim_in .5s cubic-bezier(0.68, -0.55, 0.265, 1.55);\n  animation-fill-mode: forwards;\n}\n\n.noty_effects_close {\n  animation: noty_anim_out .5s cubic-bezier(0.68, -0.55, 0.265, 1.55);\n  animation-fill-mode: forwards;\n}\n\n.noty_fix_effects_height {\n  animation: noty_anim_height 75ms ease-out;\n}\n\n.noty_close_with_click {\n  cursor: pointer;\n}\n\n.noty_close_button {\n  position: absolute;\n  top: 2px;\n  right: 2px;\n  font-weight: bold;\n  width: 20px;\n  height: 20px;\n  text-align: center;\n  line-height: 20px;\n  background-color: rgba(0, 0, 0, .05);\n  border-radius: 2px;\n  cursor: pointer;\n  transition: all .2s ease-out;\n}\n\n.noty_close_button:hover {\n  background-color: rgba(0, 0, 0, .1);\n}\n\n.noty_modal {\n  position: fixed;\n  width: 100%;\n  height: 100%;\n  background-color: #000;\n  z-index: 10000;\n  opacity: .3;\n  left: 0;\n  top: 0;\n}\n\n.noty_modal.noty_modal_open {\n  opacity: 0;\n  animation: noty_modal_in .3s ease-out;\n}\n.noty_modal.noty_modal_close {\n  animation: noty_modal_out .3s ease-out;\n  animation-fill-mode: forwards;\n}\n\n@keyframes noty_modal_in {\n  100% {\n    opacity: .3;\n  }\n}\n@keyframes noty_modal_out {\n  100% {\n    opacity: 0;\n  }\n}\n\n@keyframes noty_anim_in {\n  100% {\n    transform: translate(0);\n    opacity: 1;\n  }\n}\n\n@keyframes noty_anim_out {\n  100% {\n    transform: translate(50%);\n    opacity: 0;\n  }\n}\n\n@keyframes noty_anim_height {\n  100% {\n    height: 0;\n  }\n}\n"
  },
  {
    "path": "src/push.js",
    "content": "export class Push {\n  constructor (workerPath = '/service-worker.js') {\n    this.subData = {}\n    this.workerPath = workerPath\n    this.listeners = {\n      onPermissionGranted: [],\n      onPermissionDenied: [],\n      onSubscriptionSuccess: [],\n      onSubscriptionCancel: [],\n      onWorkerError: [],\n      onWorkerSuccess: [],\n      onWorkerNotSupported: []\n    }\n    return this\n  }\n\n  /**\n   * @param {string} eventName\n   * @param {function} cb\n   * @return {Push}\n   */\n  on (eventName, cb = () => {}) {\n    if (typeof cb === 'function' && this.listeners.hasOwnProperty(eventName)) {\n      this.listeners[eventName].push(cb)\n    }\n\n    return this\n  }\n\n  fire (eventName, params = []) {\n    if (this.listeners.hasOwnProperty(eventName)) {\n      this.listeners[eventName].forEach(cb => {\n        if (typeof cb === 'function') {\n          cb.apply(this, params)\n        }\n      })\n    }\n  }\n\n  create () {\n    console.log('NOT IMPLEMENTED YET')\n  }\n\n  /**\n   * @return {boolean}\n   */\n  isSupported () {\n    let result = false\n\n    try {\n      result = window.Notification ||\n        window.webkitNotifications ||\n        navigator.mozNotification ||\n        (window.external && window.external.msIsSiteMode() !== undefined)\n    } catch (e) {}\n\n    return result\n  }\n\n  /**\n   * @return {string}\n   */\n  getPermissionStatus () {\n    let perm = 'default'\n\n    if (window.Notification && window.Notification.permissionLevel) {\n      perm = window.Notification.permissionLevel\n    } else if (\n      window.webkitNotifications && window.webkitNotifications.checkPermission\n    ) {\n      switch (window.webkitNotifications.checkPermission()) {\n        case 1:\n          perm = 'default'\n          break\n        case 0:\n          perm = 'granted'\n          break\n        default:\n          perm = 'denied'\n      }\n    } else if (window.Notification && window.Notification.permission) {\n      perm = window.Notification.permission\n    } else if (navigator.mozNotification) {\n      perm = 'granted'\n    } else if (\n      window.external && window.external.msIsSiteMode() !== undefined\n    ) {\n      perm = window.external.msIsSiteMode() ? 'granted' : 'default'\n    }\n\n    return perm.toString().toLowerCase()\n  }\n\n  /**\n   * @return {string}\n   */\n  getEndpoint (subscription) {\n    let endpoint = subscription.endpoint\n    const subscriptionId = subscription.subscriptionId\n\n    // fix for Chrome < 45\n    if (subscriptionId && endpoint.indexOf(subscriptionId) === -1) {\n      endpoint += '/' + subscriptionId\n    }\n\n    return endpoint\n  }\n\n  /**\n   * @return {boolean}\n   */\n  isSWRegistered () {\n    try {\n      return navigator.serviceWorker.controller.state === 'activated'\n    } catch (e) {\n      return false\n    }\n  }\n\n  /**\n   * @return {void}\n   */\n  unregisterWorker () {\n    const self = this\n    if ('serviceWorker' in navigator) {\n      navigator.serviceWorker.getRegistrations().then(function (registrations) {\n        for (let registration of registrations) {\n          registration.unregister()\n          self.fire('onSubscriptionCancel')\n        }\n      })\n    }\n  }\n\n  /**\n   * @return {void}\n   */\n  requestSubscription (userVisibleOnly = true) {\n    const self = this\n    const current = this.getPermissionStatus()\n    const cb = result => {\n      if (result === 'granted') {\n        this.fire('onPermissionGranted')\n\n        if ('serviceWorker' in navigator) {\n          navigator.serviceWorker.register(this.workerPath).then(function () {\n            navigator.serviceWorker.ready.then(\n              function (serviceWorkerRegistration) {\n                self.fire('onWorkerSuccess')\n                serviceWorkerRegistration.pushManager\n                  .subscribe({\n                    userVisibleOnly: userVisibleOnly\n                  })\n                  .then(function (subscription) {\n                    const key = subscription.getKey('p256dh')\n                    const token = subscription.getKey('auth')\n\n                    self.subData = {\n                      endpoint: self.getEndpoint(subscription),\n                      p256dh: key\n                        ? window.btoa(\n                            String.fromCharCode.apply(null, new Uint8Array(key))\n                          )\n                        : null,\n                      auth: token\n                        ? window.btoa(\n                            String.fromCharCode.apply(\n                              null,\n                              new Uint8Array(token)\n                            )\n                          )\n                        : null\n                    }\n\n                    self.fire('onSubscriptionSuccess', [self.subData])\n                  })\n                  .catch(function (err) {\n                    self.fire('onWorkerError', [err])\n                  })\n              }\n            )\n          })\n        } else {\n          self.fire('onWorkerNotSupported')\n        }\n      } else if (result === 'denied') {\n        this.fire('onPermissionDenied')\n        this.unregisterWorker()\n      }\n    }\n\n    if (current === 'default') {\n      if (window.Notification && window.Notification.requestPermission) {\n        window.Notification.requestPermission(cb)\n      } else if (\n        window.webkitNotifications && window.webkitNotifications.checkPermission\n      ) {\n        window.webkitNotifications.requestPermission(cb)\n      }\n    } else {\n      cb(current)\n    }\n  }\n}\n"
  },
  {
    "path": "src/themes/bootstrap-v3.scss",
    "content": ".noty_theme__bootstrap-v3.noty_bar {\n  margin: 4px 0;\n  overflow: hidden;\n  position: relative;\n  border: 1px solid transparent;\n  border-radius: 4px;\n\n  .noty_body {\n\tpadding: 15px;\n  }\n\n  .noty_buttons {\n\tpadding: 10px;\n  }\n\n  .noty_close_button {\n\tfont-size: 21px;\n\tfont-weight: 700;\n\tline-height: 1;\n\tcolor: #000;\n\ttext-shadow: 0 1px 0 #fff;\n\tfilter: alpha(opacity=20);\n\topacity: .2;\n\tbackground: transparent;\n  }\n  .noty_close_button:hover {\n\tbackground: transparent;\n\ttext-decoration: none;\n\tcursor: pointer;\n\tfilter: alpha(opacity=50);\n\topacity: .5;\n  }\n}\n\n.noty_theme__bootstrap-v3.noty_type__alert,\n.noty_theme__bootstrap-v3.noty_type__notification {\n  background-color: #fff;\n  color: inherit;\n}\n\n.noty_theme__bootstrap-v3.noty_type__warning {\n  background-color: #fcf8e3;\n  color: #8a6d3b;\n  border-color: #faebcc;\n}\n\n.noty_theme__bootstrap-v3.noty_type__error {\n  background-color: #f2dede;\n  color: #a94442;\n  border-color: #ebccd1;\n}\n\n.noty_theme__bootstrap-v3.noty_type__info,\n.noty_theme__bootstrap-v3.noty_type__information {\n  background-color: #d9edf7;\n  color: #31708f;\n  border-color: #bce8f1;\n}\n\n.noty_theme__bootstrap-v3.noty_type__success {\n  background-color: #dff0d8;\n  color: #3c763d;\n  border-color: #d6e9c6;\n}\n"
  },
  {
    "path": "src/themes/bootstrap-v4.scss",
    "content": ".noty_theme__bootstrap-v4.noty_bar {\n  margin: 4px 0;\n  overflow: hidden;\n  position: relative;\n  border: 1px solid transparent;\n  border-radius: .25rem;\n\n  .noty_body {\n\tpadding: .75rem 1.25rem;\n  }\n\n  .noty_buttons {\n\tpadding: 10px;\n  }\n\n  .noty_close_button {\n\tfont-size: 1.5rem;\n\tfont-weight: 700;\n\tline-height: 1;\n\tcolor: #000;\n\ttext-shadow: 0 1px 0 #fff;\n\tfilter: alpha(opacity=20);\n\topacity: .5;\n\tbackground: transparent;\n  }\n\n  .noty_close_button:hover {\n\tbackground: transparent;\n\ttext-decoration: none;\n\tcursor: pointer;\n\tfilter: alpha(opacity=50);\n\topacity: .75;\n  }\n}\n\n.noty_theme__bootstrap-v4.noty_type__alert,\n.noty_theme__bootstrap-v4.noty_type__notification {\n  background-color: #fff;\n  color: inherit;\n}\n\n.noty_theme__bootstrap-v4.noty_type__warning {\n  background-color: #fcf8e3;\n  color: #8a6d3b;\n  border-color: #faebcc;\n}\n\n.noty_theme__bootstrap-v4.noty_type__error {\n  background-color: #f2dede;\n  color: #a94442;\n  border-color: #ebccd1;\n}\n\n.noty_theme__bootstrap-v4.noty_type__info,\n.noty_theme__bootstrap-v4.noty_type__information {\n  background-color: #d9edf7;\n  color: #31708f;\n  border-color: #bce8f1;\n}\n\n.noty_theme__bootstrap-v4.noty_type__success {\n  background-color: #dff0d8;\n  color: #3c763d;\n  border-color: #d6e9c6;\n}\n"
  },
  {
    "path": "src/themes/light.scss",
    "content": ".noty_theme__light.noty_bar {\n  margin: 4px 0;\n  overflow: hidden;\n  border-radius: 2px;\n  position: relative;\n\n  .noty_body {\n\tpadding: 10px;\n  }\n\n  .noty_buttons {\n\tborder-top: 1px solid #e7e7e7;\n\tpadding: 5px 10px;\n  }\n}\n\n.noty_theme__light.noty_type__alert,\n.noty_theme__light.noty_type__notification {\n  background-color: #fff;\n  border: 1px solid #dedede;\n  color: #444;\n}\n\n.noty_theme__light.noty_type__warning {\n  background-color: #FFEAA8;\n  border: 1px solid #FFC237;\n  color: #826200;\n\n  .noty_buttons {\n\tborder-color: #dfaa30;\n  }\n}\n\n.noty_theme__light.noty_type__error {\n  background-color: #ED7000;\n  border: 1px solid #e25353;\n  color: #FFF;\n\n  .noty_buttons {\n\tborder-color: darkred;\n  }\n}\n\n.noty_theme__light.noty_type__info,\n.noty_theme__light.noty_type__information {\n  background-color: #78C5E7;\n  border: 1px solid #3badd6;\n  color: #FFF;\n\n  .noty_buttons {\n\tborder-color: #0B90C4;\n  }\n}\n\n.noty_theme__light.noty_type__success {\n  background-color: #57C880;\n  border: 1px solid #7cdd77;\n  color: darkgreen;\n\n  .noty_buttons {\n\tborder-color: #50C24E;\n  }\n}\n"
  },
  {
    "path": "src/themes/metroui.scss",
    "content": ".noty_theme__metroui.noty_bar {\n  margin: 4px 0;\n  overflow: hidden;\n  position: relative;\n  box-shadow: rgba(0, 0, 0, 0.298039) 0 0 5px 0;\n\n  .noty_progressbar {\n\tposition: absolute;\n\tleft: 0;\n\tbottom: 0;\n\theight: 3px;\n\twidth: 100%;\n\tbackground-color: #000;\n\topacity: 0.2;\n\tfilter: alpha(opacity=20)\n  }\n\n  .noty_body {\n\tpadding: 1.25em;\n\tfont-size: 14px;\n  }\n\n  .noty_buttons {\n\tpadding: 0 10px .5em 10px;\n  }\n}\n\n.noty_theme__metroui.noty_type__alert,\n.noty_theme__metroui.noty_type__notification {\n  background-color: #fff;\n  color: #1d1d1d;\n}\n\n.noty_theme__metroui.noty_type__warning {\n  background-color: #FA6800;\n  color: #fff;\n}\n\n.noty_theme__metroui.noty_type__error {\n  background-color: #CE352C;\n  color: #FFF;\n}\n\n.noty_theme__metroui.noty_type__info,\n.noty_theme__metroui.noty_type__information {\n  background-color: #1BA1E2;\n  color: #FFF;\n}\n\n.noty_theme__metroui.noty_type__success {\n  background-color: #60A917;\n  color: #fff;\n}\n"
  },
  {
    "path": "src/themes/mint.scss",
    "content": ".noty_theme__mint.noty_bar {\n  margin: 4px 0;\n  overflow: hidden;\n  border-radius: 2px;\n  position: relative;\n\n  .noty_body {\n\tpadding: 10px;\n\tfont-size: 14px;\n  }\n\n  .noty_buttons {\n\tpadding: 10px;\n  }\n}\n\n.noty_theme__mint.noty_type__alert,\n.noty_theme__mint.noty_type__notification {\n  background-color: #fff;\n  border-bottom: 1px solid #D1D1D1;\n  color: #2F2F2F;\n}\n\n.noty_theme__mint.noty_type__warning {\n  background-color: #FFAE42;\n  border-bottom: 1px solid #E89F3C;\n  color: #fff;\n}\n\n.noty_theme__mint.noty_type__error {\n  background-color: #DE636F;\n  border-bottom: 1px solid #CA5A65;\n  color: #fff;\n}\n\n.noty_theme__mint.noty_type__info,\n.noty_theme__mint.noty_type__information {\n  background-color: #7F7EFF;\n  border-bottom: 1px solid #7473E8;\n  color: #fff;\n}\n\n.noty_theme__mint.noty_type__success {\n  background-color: #AFC765;\n  border-bottom: 1px solid #A0B55C;\n  color: #fff;\n}\n"
  },
  {
    "path": "src/themes/nest.scss",
    "content": ".noty_theme__nest.noty_bar {\n  margin: 0 0 15px 0;\n  overflow: hidden;\n  border-radius: 2px;\n  position: relative;\n  box-shadow: rgba(0, 0, 0, 0.098039) 5px 4px 10px 0;\n\n  .noty_body {\n    padding: 10px;\n    font-size: 14px;\n    text-shadow: 1px 1px 1px rgba(0, 0, 0, .1);\n  }\n\n  .noty_buttons {\n    padding: 10px;\n  }\n}\n\n.noty_layout .noty_theme__nest.noty_bar {\n  z-index: 5;\n}\n\n.noty_layout .noty_theme__nest.noty_bar:nth-child(2) {\n  position: absolute;\n  top: 0;\n  margin-top: 4px;\n  margin-right: -4px;\n  margin-left: 4px;\n  z-index: 4;\n  width: 100%;\n}\n\n.noty_layout .noty_theme__nest.noty_bar:nth-child(3) {\n  position: absolute;\n  top: 0;\n  margin-top: 8px;\n  margin-right: -8px;\n  margin-left: 8px;\n  z-index: 3;\n  width: 100%;\n}\n\n.noty_layout .noty_theme__nest.noty_bar:nth-child(4) {\n  position: absolute;\n  top: 0;\n  margin-top: 12px;\n  margin-right: -12px;\n  margin-left: 12px;\n  z-index: 2;\n  width: 100%;\n}\n\n.noty_layout .noty_theme__nest.noty_bar:nth-child(5) {\n  position: absolute;\n  top: 0;\n  margin-top: 16px;\n  margin-right: -16px;\n  margin-left: 16px;\n  z-index: 1;\n  width: 100%;\n}\n\n.noty_layout .noty_theme__nest.noty_bar:nth-child(n+6) {\n  position: absolute;\n  top: 0;\n  margin-top: 20px;\n  margin-right: -20px;\n  margin-left: 20px;\n  z-index: -1;\n  width: 100%;\n}\n\n// left corner stacks\n#noty_layout__bottomLeft .noty_theme__nest.noty_bar:nth-child(2),\n#noty_layout__topLeft .noty_theme__nest.noty_bar:nth-child(2) {\n  margin-top: 4px;\n  margin-left: -4px;\n  margin-right: 4px;\n}\n\n#noty_layout__bottomLeft .noty_theme__nest.noty_bar:nth-child(3),\n#noty_layout__topLeft .noty_theme__nest.noty_bar:nth-child(3) {\n  margin-top: 8px;\n  margin-left: -8px;\n  margin-right: 8px;\n}\n\n#noty_layout__bottomLeft .noty_theme__nest.noty_bar:nth-child(4),\n#noty_layout__topLeft .noty_theme__nest.noty_bar:nth-child(4) {\n  margin-top: 12px;\n  margin-left: -12px;\n  margin-right: 12px;\n}\n\n#noty_layout__bottomLeft .noty_theme__nest.noty_bar:nth-child(5),\n#noty_layout__topLeft .noty_theme__nest.noty_bar:nth-child(5) {\n  margin-top: 16px;\n  margin-left: -16px;\n  margin-right: 16px;\n}\n\n#noty_layout__bottomLeft .noty_theme__nest.noty_bar:nth-child(n+6),\n#noty_layout__topLeft .noty_theme__nest.noty_bar:nth-child(n+6) {\n  margin-top: 20px;\n  margin-left: -20px;\n  margin-right: 20px;\n}\n\n.noty_theme__nest.noty_type__alert,\n.noty_theme__nest.noty_type__notification {\n  background-color: #073B4C;\n  color: #fff;\n\n  .noty_progressbar {\n    background-color: #fff;\n  }\n}\n\n.noty_theme__nest.noty_type__warning {\n  background-color: #FFD166;\n  color: #fff;\n}\n\n.noty_theme__nest.noty_type__error {\n  background-color: #EF476F;\n  color: #fff;\n\n  .noty_progressbar {\n    opacity: .4;\n  }\n}\n\n.noty_theme__nest.noty_type__info,\n.noty_theme__nest.noty_type__information {\n  background-color: #118AB2;\n  color: #fff;\n\n  .noty_progressbar {\n    opacity: .6;\n  }\n}\n\n.noty_theme__nest.noty_type__success {\n  background-color: #06D6A0;\n  color: #fff;\n}\n"
  },
  {
    "path": "src/themes/relax.scss",
    "content": ".noty_theme__relax.noty_bar {\n  margin: 4px 0;\n  overflow: hidden;\n  border-radius: 2px;\n  position: relative;\n\n  .noty_body {\n\tpadding: 10px;\n  }\n\n  .noty_buttons {\n\tborder-top: 1px solid #e7e7e7;\n\tpadding: 5px 10px;\n  }\n}\n\n.noty_theme__relax.noty_type__alert,\n.noty_theme__relax.noty_type__notification {\n  background-color: #fff;\n  border: 1px solid #dedede;\n  color: #444;\n}\n\n.noty_theme__relax.noty_type__warning {\n  background-color: #FFEAA8;\n  border: 1px solid #FFC237;\n  color: #826200;\n\n  .noty_buttons {\n\tborder-color: #dfaa30;\n  }\n}\n\n.noty_theme__relax.noty_type__error {\n  background-color: #FF8181;\n  border: 1px solid #e25353;\n  color: #FFF;\n\n  .noty_buttons {\n\tborder-color: darkred;\n  }\n}\n\n.noty_theme__relax.noty_type__info,\n.noty_theme__relax.noty_type__information {\n  background-color: #78C5E7;\n  border: 1px solid #3badd6;\n  color: #FFF;\n\n  .noty_buttons {\n\tborder-color: #0B90C4;\n  }\n}\n\n.noty_theme__relax.noty_type__success {\n  background-color: #BCF5BC;\n  border: 1px solid #7cdd77;\n  color: darkgreen;\n\n  .noty_buttons {\n\tborder-color: #50C24E;\n  }\n}\n"
  },
  {
    "path": "src/themes/semanticui.scss",
    "content": ".noty_theme__semanticui.noty_bar {\n  margin: 4px 0;\n  overflow: hidden;\n  position: relative;\n  border: 1px solid transparent;\n  font-size: 1em;\n  border-radius: .28571429rem;\n  box-shadow: 0 0 0 1px rgba(34,36,38,.22) inset, 0 0 0 0 transparent;\n\n  .noty_body {\n\tpadding: 1em 1.5em;\n\tline-height: 1.4285em;\n  }\n\n  .noty_buttons {\n\tpadding: 10px;\n  }\n}\n\n.noty_theme__semanticui.noty_type__alert,\n.noty_theme__semanticui.noty_type__notification {\n  background-color: #f8f8f9;\n  color: rgba(0,0,0,.87);\n}\n\n.noty_theme__semanticui.noty_type__warning {\n  background-color: #fffaf3;\n  color: #573a08;\n\n  box-shadow: 0 0 0 1px #c9ba9b inset, 0 0 0 0 transparent;\n}\n\n.noty_theme__semanticui.noty_type__error {\n  background-color: #fff6f6;\n  color: #9f3a38;\n\n  box-shadow: 0 0 0 1px #e0b4b4 inset, 0 0 0 0 transparent;\n}\n\n.noty_theme__semanticui.noty_type__info,\n.noty_theme__semanticui.noty_type__information {\n  background-color: #f8ffff;\n  color: #276f86;\n\n  box-shadow: 0 0 0 1px #a9d5de inset, 0 0 0 0 transparent;\n}\n\n.noty_theme__semanticui.noty_type__success {\n  background-color: #fcfff5;\n  color: #2c662d;\n\n  box-shadow: 0 0 0 1px #a3c293 inset, 0 0 0 0 transparent;\n}\n"
  },
  {
    "path": "src/themes/sunset.scss",
    "content": ".noty_theme__sunset.noty_bar {\n  margin: 4px 0;\n  overflow: hidden;\n  border-radius: 2px;\n  position: relative;\n\n  .noty_body {\n\tpadding: 10px;\n\tfont-size: 14px;\n\ttext-shadow: 1px 1px 1px rgba(0, 0, 0, .1);\n  }\n\n  .noty_buttons {\n\tpadding: 10px;\n  }\n}\n\n.noty_theme__sunset.noty_type__alert,\n.noty_theme__sunset.noty_type__notification {\n  background-color: #073B4C;\n  color: #fff;\n\n  .noty_progressbar {\n\tbackground-color: #fff;\n  }\n}\n\n.noty_theme__sunset.noty_type__warning {\n  background-color: #FFD166;\n  color: #fff;\n}\n\n.noty_theme__sunset.noty_type__error {\n  background-color: #EF476F;\n  color: #fff;\n\n  .noty_progressbar {\n\topacity: .4;\n  }\n}\n\n.noty_theme__sunset.noty_type__info,\n.noty_theme__sunset.noty_type__information {\n  background-color: #118AB2;\n  color: #fff;\n\n  .noty_progressbar {\n\topacity: .6;\n  }\n}\n\n.noty_theme__sunset.noty_type__success {\n  background-color: #06D6A0;\n  color: #fff;\n}\n"
  },
  {
    "path": "src/utils.js",
    "content": "import * as API from 'api'\n\nexport const animationEndEvents = 'webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend'\n\nexport function inArray (needle, haystack, argStrict) {\n  let key\n  let strict = !!argStrict\n\n  if (strict) {\n    for (key in haystack) {\n      if (haystack.hasOwnProperty(key) && haystack[key] === needle) {\n        return true\n      }\n    }\n  } else {\n    for (key in haystack) {\n      if (haystack.hasOwnProperty(key) && haystack[key] === needle) {\n        return true\n      }\n    }\n  }\n  return false\n}\n\nexport function stopPropagation (evt) {\n  evt = evt || window.event\n\n  if (typeof evt.stopPropagation !== 'undefined') {\n    evt.stopPropagation()\n  } else {\n    evt.cancelBubble = true\n  }\n}\n\nexport const deepExtend = function (out) {\n  out = out || {}\n\n  for (let i = 1; i < arguments.length; i++) {\n    let obj = arguments[i]\n\n    if (!obj) continue\n\n    for (let key in obj) {\n      if (obj.hasOwnProperty(key)) {\n        if (Array.isArray(obj[key])) {\n          out[key] = obj[key]\n        } else if (typeof obj[key] === 'object' && obj[key] !== null) {\n          out[key] = deepExtend(out[key], obj[key])\n        } else {\n          out[key] = obj[key]\n        }\n      }\n    }\n  }\n\n  return out\n}\n\nexport function generateID (prefix = '') {\n  let id = `noty_${prefix}_`\n\n  id += 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n    let r = Math.random() * 16 | 0\n    let v = c === 'x' ? r : r & 0x3 | 0x8\n    return v.toString(16)\n  })\n\n  return id\n}\n\nexport function outerHeight (el) {\n  let height = el.offsetHeight\n  let style = window.getComputedStyle(el)\n\n  height += parseInt(style.marginTop) + parseInt(style.marginBottom)\n  return height\n}\n\nexport let css = (function () {\n  let cssPrefixes = ['Webkit', 'O', 'Moz', 'ms']\n  let cssProps = {}\n\n  function camelCase (string) {\n    return string\n      .replace(/^-ms-/, 'ms-')\n      .replace(/-([\\da-z])/gi, function (match, letter) {\n        return letter.toUpperCase()\n      })\n  }\n\n  function getVendorProp (name) {\n    let style = document.body.style\n    if (name in style) return name\n\n    let i = cssPrefixes.length\n    let capName = name.charAt(0).toUpperCase() + name.slice(1)\n    let vendorName\n\n    while (i--) {\n      vendorName = cssPrefixes[i] + capName\n      if (vendorName in style) return vendorName\n    }\n\n    return name\n  }\n\n  function getStyleProp (name) {\n    name = camelCase(name)\n    return cssProps[name] || (cssProps[name] = getVendorProp(name))\n  }\n\n  function applyCss (element, prop, value) {\n    prop = getStyleProp(prop)\n    element.style[prop] = value\n  }\n\n  return function (element, properties) {\n    let args = arguments\n    let prop\n    let value\n\n    if (args.length === 2) {\n      for (prop in properties) {\n        if (properties.hasOwnProperty(prop)) {\n          value = properties[prop]\n          if (value !== undefined && properties.hasOwnProperty(prop)) {\n            applyCss(element, prop, value)\n          }\n        }\n      }\n    } else {\n      applyCss(element, args[1], args[2])\n    }\n  }\n})()\n\nexport function addListener (el, events, cb, useCapture = false) {\n  events = events.split(' ')\n  for (let i = 0; i < events.length; i++) {\n    if (document.addEventListener) {\n      el.addEventListener(events[i], cb, useCapture)\n    } else if (document.attachEvent) {\n      el.attachEvent('on' + events[i], cb)\n    }\n  }\n}\n\nexport function hasClass (element, name) {\n  let list = typeof element === 'string' ? element : classList(element)\n  return list.indexOf(' ' + name + ' ') >= 0\n}\n\nexport function addClass (element, name) {\n  let oldList = classList(element)\n  let newList = oldList + name\n\n  if (hasClass(oldList, name)) return\n\n  // Trim the opening space.\n  element.className = newList.substring(1)\n}\n\nexport function removeClass (element, name) {\n  let oldList = classList(element)\n  let newList\n\n  if (!hasClass(element, name)) return\n\n  // Replace the class name.\n  newList = oldList.replace(' ' + name + ' ', ' ')\n\n  // Trim the opening and closing spaces.\n  element.className = newList.substring(1, newList.length - 1)\n}\n\nexport function remove (element) {\n  if (element.parentNode) {\n    element.parentNode.removeChild(element)\n  }\n}\n\nexport function classList (element) {\n  return (' ' + ((element && element.className) || '') + ' ').replace(\n    /\\s+/gi,\n    ' '\n  )\n}\n\nexport function visibilityChangeFlow () {\n  let hidden\n  let visibilityChange\n  if (typeof document.hidden !== 'undefined') {\n    // Opera 12.10 and Firefox 18 and later support\n    hidden = 'hidden'\n    visibilityChange = 'visibilitychange'\n  } else if (typeof document.msHidden !== 'undefined') {\n    hidden = 'msHidden'\n    visibilityChange = 'msvisibilitychange'\n  } else if (typeof document.webkitHidden !== 'undefined') {\n    hidden = 'webkitHidden'\n    visibilityChange = 'webkitvisibilitychange'\n  }\n\n  function onVisibilityChange () {\n    API.PageHidden = document[hidden]\n    handleVisibilityChange()\n  }\n\n  function onBlur () {\n    API.PageHidden = true\n    handleVisibilityChange()\n  }\n\n  function onFocus () {\n    API.PageHidden = false\n    handleVisibilityChange()\n  }\n\n  function handleVisibilityChange () {\n    if (API.PageHidden) stopAll()\n    else resumeAll()\n  }\n\n  function stopAll () {\n    setTimeout(\n      function () {\n        Object.keys(API.Store).forEach(id => {\n          if (API.Store.hasOwnProperty(id)) {\n            if (API.Store[id].options.visibilityControl) {\n              API.Store[id].stop()\n            }\n          }\n        })\n      },\n      100\n    )\n  }\n\n  function resumeAll () {\n    setTimeout(\n      function () {\n        Object.keys(API.Store).forEach(id => {\n          if (API.Store.hasOwnProperty(id)) {\n            if (API.Store[id].options.visibilityControl) {\n              API.Store[id].resume()\n            }\n          }\n        })\n        API.queueRenderAll()\n      },\n      100\n    )\n  }\n\n  if (visibilityChange) {\n    addListener(document, visibilityChange, onVisibilityChange)\n  }\n\n  addListener(window, 'blur', onBlur)\n  addListener(window, 'focus', onFocus)\n}\n\nexport function createAudioElements (ref) {\n  if (ref.hasSound) {\n    const audioElement = document.createElement('audio')\n\n    ref.options.sounds.sources.forEach(s => {\n      const source = document.createElement('source')\n      source.src = s\n      source.type = `audio/${getExtension(s)}`\n      audioElement.appendChild(source)\n    })\n\n    if (ref.barDom) {\n      ref.barDom.appendChild(audioElement)\n    } else {\n      document.querySelector('body').appendChild(audioElement)\n    }\n\n    audioElement.volume = ref.options.sounds.volume\n\n    if (!ref.soundPlayed) {\n      audioElement.play()\n      ref.soundPlayed = true\n    }\n\n    audioElement.onended = function () {\n      remove(audioElement)\n    }\n  }\n}\n\nfunction getExtension (fileName) {\n  return fileName.match(/\\.([^.]+)$/)[1]\n}\n"
  },
  {
    "path": "test/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n    <title>Noty Test Suite</title>\n\n    <script src=\"vendor/jquery-slim.min.js\"></script>\n    <!-- QUnit -->\n    <link rel=\"stylesheet\" href=\"vendor/qunit-theme-ninja.css\" media=\"screen\">\n    <link rel=\"stylesheet\" href=\"../lib/noty.css\" media=\"screen\">\n    <script src=\"vendor/qunit.js\"></script>\n\n    <script>\n      // Require assert.expect in each test\n      QUnit.config.requireExpects = true\n\n      // See https://github.com/axemclion/grunt-saucelabs#test-result-details-with-qunit\n      var log = []\n      var testName\n\n      QUnit.done(function(testResults) {\n        var tests = []\n        for (var i = 0; i < log.length; i++) {\n          var details = log[i]\n          tests.push({\n            name: details.name,\n            result: details.result,\n            expected: details.expected,\n            actual: details.actual,\n            source: details.source\n          })\n        }\n        testResults.tests = tests\n\n        window.global_test_results = testResults\n      })\n\n      QUnit.testStart(function(testDetails) {\n        QUnit.log(function(details) {\n          if (!details.result) {\n            details.name = testDetails.name\n            log.push(details)\n          }\n        })\n      })\n\n      // Cleanup\n      QUnit.testDone(function () {\n        Noty.closeAll()\n        $(\"div[id^='noty_bar']\").remove()\n      })\n\n      // Display fixture on-screen on iOS to avoid false positives\n      // See https://github.com/twbs/bootstrap/pull/15955\n      if (/iPhone|iPad|iPod/.test(navigator.userAgent)) {\n        QUnit.begin(function() {\n          $('#qunit-fixture').css({ top: 0, left: 0 })\n        })\n\n        QUnit.done(function() {\n          $('#qunit-fixture').css({ top: '', left: '' })\n        })\n      }\n    </script>\n\n    <!-- Transpiled Plugins -->\n    <script src=\"../lib/noty.js\"></script>\n\n    <!-- Unit Tests -->\n    <script src=\"unit/init.test.js\"></script>\n  </head>\n  <body>\n    <div id=\"qunit-container\">\n      <div id=\"qunit\"></div>\n      <div id=\"qunit-fixture\"></div>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/unit/init.test.js",
    "content": "$(function () {\n  'use strict'\n\n  function fakeEvent (el, e) {\n    if (document.createEvent) {\n      var event = document.createEvent('HTMLEvents')\n      event.initEvent(e, true, false)\n      el.dispatchEvent(event)\n    } else {\n      el.fireEvent(e)\n    }\n  }\n\n  Noty.overrideDefaults({\n    text: 'Noty Test Suite'\n  })\n\n  QUnit.module('Initializing')\n  QUnit.test('should be defined', function (assert) {\n    assert.expect(1)\n    assert.ok(Noty, 'Noty is defined')\n  })\n\n  QUnit.test('should return a Noty object', function (assert) {\n    assert.expect(11)\n\n    var n = new Noty()\n    assert.ok(n instanceof Noty, 'returns Noty object')\n    assert.ok(n.options, 'has accessible properties')\n    assert.strictEqual(n.id.length, 45, 'has auto generated ID')\n    assert.strictEqual(n.closed, false, '.closed should be false')\n    assert.strictEqual(n.shown, false, '.shown should be false')\n    assert.strictEqual(n.closeTimer, -1, '.closeTimer should be -1')\n    assert.strictEqual(n.barDom, null, '.barDom should be null')\n    assert.strictEqual(n.layoutDom, null, '.layoutDom should be null')\n    assert.strictEqual(n.progressDom, null, '.progressDom should be null')\n    assert.strictEqual(n.hasSound, false, '.hasSound should be false')\n    assert.strictEqual(n.soundPlayed, false, '.soundPlayed should be false')\n  })\n\n  QUnit.module('Callbacks')\n  QUnit.test('beforeShow - should not be in the dom when beforeShow fired', function (assert) {\n    assert.expect(2)\n    var done = assert.async()\n\n    new Noty()\n      .on('beforeShow', function () {\n        assert.ok(true, 'beforeShow fired')\n        assert.strictEqual($('#' + this.id).length, 0, 'noty not in the document')\n        done()\n      }).show().close()\n  })\n\n  QUnit.test('onShow - should insert into dom when show method is called', function (assert) {\n    assert.expect(2)\n    var done = assert.async()\n\n    new Noty()\n      .on('onShow', function () {\n        assert.strictEqual($('#' + this.id).length, 1, 'noty inserted into dom')\n        assert.ok(true, 'onShow fired')\n        done()\n      }).show().close()\n  })\n\n  QUnit.test('afterShow - should fire event', function (assert) {\n    assert.expect(2)\n    var done = assert.async()\n\n    new Noty()\n      .on('afterShow', function () {\n        assert.ok(true, 'afterShow fired')\n        assert.strictEqual($('#' + this.id).length, 1, 'noty in the dom')\n        done()\n      }).show()\n  })\n\n  QUnit.test('preventing - should not fire afterShow when show was prevented', function (assert) {\n    assert.expect(1)\n    var done = assert.async()\n\n    new Noty()\n      .on('onShow', function () {\n        this.close()\n        assert.ok(true, 'onShow event fired')\n        done()\n      })\n      .on('afterShow', function () {\n        assert.ok(false, 'afterShow event fired')\n      }).show().close()\n  })\n\n  QUnit.test('onClose - should fire event', function (assert) {\n    assert.expect(2)\n    var done = assert.async()\n\n    new Noty()\n      .on('onClose', function () {\n        assert.ok(true, 'onClose fired')\n        assert.strictEqual($('#' + this.id).length, 1, 'noty in the dom')\n        done()\n      }).show().close()\n  })\n\n  QUnit.test('onTemplate - ', function (assert) {\n    assert.expect(2)\n    var done = assert.async()\n\n    new Noty().on('onTemplate', function () {\n      assert.ok(true, 'onTemplate fired')\n      this.barDom.innerHTML = 'changed'\n      assert.strictEqual(this.barDom.innerHTML, 'changed', 'noty.barDom can be modified')\n      done()\n    }).show().close()\n  })\n\n  QUnit.test('onHover', function (assert) {\n    assert.expect(1)\n    var done = assert.async()\n\n    new Noty()\n      .on('onHover', function () {\n        assert.ok(true, 'onHover fired')\n        done()\n      })\n      .on('afterShow', function () {\n        fakeEvent($('#' + this.id)[0], 'mouseenter')\n      }).show()\n  })\n\n  // @todo - [needim] - modal cases\n  // @todo - [needim] - Killer cases\n\n  QUnit.module('CloseWith')\n  QUnit.test('click', function (assert) {\n    assert.expect(1)\n    var done = assert.async()\n\n    new Noty({closeWith: ['click']})\n      .on('afterShow', function () {\n        fakeEvent($('#' + this.id)[0], 'click')\n      })\n      .on('afterClose', function () {\n        assert.ok(true, 'closed by clicking')\n        done()\n      }).show()\n  })\n\n  QUnit.test('button', function (assert) {\n    assert.expect(1)\n    var done = assert.async()\n\n    new Noty({closeWith: ['button']})\n      .on('afterShow', function () {\n        fakeEvent($('#' + this.id).find('.noty_close_button')[0], 'click')\n      })\n      .on('afterClose', function () {\n        assert.ok(true, 'closed by x button')\n        done()\n      }).show()\n  })\n\n  // @todo - [needim] - backdrop && modal\n\n  QUnit.module('API')\n  QUnit.test('stop() & resume()', function (assert) {\n    assert.expect(3)\n    var done = assert.async()\n\n    new Noty({timeout: 2000})\n      .on('afterShow', function () {\n        assert.ok(this.options.timeout === 2000, 'has correct timeout')\n        var t = this\n        setTimeout(function () {\n          t.stop()\n          assert.ok(t.closeTimer === -1, 'timer stopped')\n          t.resume()\n          setTimeout(function () {\n            assert.ok(t.closeTimer, 'timer started')\n            done()\n          }, 250)\n        }, 250)\n      }).show()\n  })\n  QUnit.test('setTimeout()', function (assert) {\n    assert.expect(2)\n    var done = assert.async()\n\n    new Noty({timeout: 2000})\n      .on('afterShow', function () {\n        this.setTimeout(3000)\n\n        assert.ok(this.options.timeout === 3000,\n          'timeout override after show() called')\n\n        done()\n      }).show()\n\n    assert.ok(new Noty().setTimeout(3000).options.timeout === 3000,\n      'timeout overrided before show()')\n\n  })\n  QUnit.test('setText()', function (assert) {\n    assert.expect(3)\n    var done = assert.async()\n\n    new Noty({text: 'Rick'})\n      .on('afterShow', function () {\n        this.setText('Morty', true)\n\n        assert.ok(this.options.text === 'Morty',\n          'text override after show() called')\n        assert.ok($('#' + this.id).find('.noty_body').text() === 'Morty',\n          'text changed correctly')\n\n        done()\n      }).show()\n\n    assert.ok(new Noty().setText('Morty', true).options.text === 'Morty',\n      'text override before show()')\n  })\n  QUnit.test('setType()', function (assert) {\n    assert.expect(4)\n    var done = assert.async()\n\n    new Noty()\n      .on('afterShow', function () {\n        this.setType('warning', true)\n        var $d = $('#' + this.id)\n\n        assert.equal(this.options.type, 'warning',\n          'type override after show() called')\n        assert.ok($d.hasClass('noty_type__warning'),\n          'new type changed correctly')\n        assert.notOk($d.hasClass('noty_type__alert'),\n          'old type removed correctly')\n\n        done()\n      }).show()\n\n    assert.ok(new Noty().setType('warning', true).options.type === 'warning', 'type override before show()')\n  })\n  QUnit.test('setTheme()', function (assert) {\n    assert.expect(4)\n    var done = assert.async()\n\n    new Noty({theme: 'mint'})\n      .on('afterShow', function () {\n        this.setTheme('relax', true)\n        var $d = $('#' + this.id)\n        assert.equal(this.options.theme, 'relax',\n          'theme override after show() called')\n        assert.ok($d.hasClass('noty_theme__relax'),\n          'new theme changed correctly')\n        assert.notOk($d.hasClass('noty_theme__mint'),\n          'old theme removed correctly')\n        done()\n      }).show()\n\n    assert.ok(new Noty({theme: 'mint'}).setTheme('relax', true).options.theme === 'relax', 'theme override before show()')\n  })\n  QUnit.test('close()', function (assert) {\n    assert.expect(2)\n    var done = assert.async()\n\n    new Noty()\n      .on('onClose', function () {\n        assert.ok(true, 'onClose fired')\n      })\n      .on('afterClose', function () {\n        assert.ok(true, 'afterClose fired')\n        done()\n      }).show().close()\n  })\n\n  QUnit.module('API Static')\n  QUnit.test('overrideDefaults()', function (assert) {\n    assert.expect(1)\n    var obj = {\n      timeout: 3000,\n      theme: 'relax',\n      layout: 'topCenter',\n      progressBar: false,\n      closeWith: ['button'],\n      animation: {\n        open: null,\n        close: null\n      },\n      force: true,\n      sounds: {\n        sources: ['audio_file.wav'],\n        volume: .3,\n        conditions: ['docHidden']\n      },\n      titleCount: {\n        conditions: ['docHidden']\n      }\n    }\n    Noty.overrideDefaults(obj)\n\n    var n = new Noty()\n    assert.deepEqual(obj, {\n      timeout: n.options.timeout,\n      theme: n.options.theme,\n      layout: n.options.layout,\n      progressBar: n.options.progressBar,\n      closeWith: n.options.closeWith,\n      animation: n.options.animation,\n      force: n.options.force,\n      sounds: n.options.sounds,\n      titleCount: n.options.titleCount\n    }, 'override ok')\n\n  })\n  QUnit.test('setMaxVisible()', function (assert) {\n    assert.expect(2)\n\n    var showed = 0\n    Noty.setMaxVisible(1)\n\n    new Noty().on('beforeShow', function () {\n      showed++\n    }).show()\n    new Noty().on('beforeShow', function () {\n      showed++\n    }).show()\n\n    assert.equal(showed, 1,\n      'global queue maxVisible 1 ok')\n\n    var customShowed = 0\n    Noty.setMaxVisible(1, 'customQueue')\n\n    new Noty({queue: 'customQueue'})\n      .on('beforeShow', function () {\n        customShowed++\n      }).show()\n    new Noty({queue: 'customQueue'})\n      .on('beforeShow', function () {\n        customShowed++\n      }).show()\n\n    assert.equal(customShowed, 1,\n      'custom queue maxVisible 1 ok')\n\n  })\n  QUnit.test('closeAll()', function (assert) {\n    assert.expect(4)\n\n    Noty.setMaxVisible(8)\n    Noty.setMaxVisible(8, 'customQueue')\n\n    var closed = 0\n\n    new Noty().on('onClose', function () {\n      closed++\n    }).show()\n    new Noty().on('onClose', function () {\n      closed++\n    }).show()\n\n    Noty.closeAll()\n\n    var closedCustom = 0\n    new Noty({queue: 'customQueueClose'}).on('onClose', function () {\n      closedCustom++\n    }).show()\n    new Noty({queue: 'customQueueClose'}).on('onClose', function () {\n      closedCustom++\n    }).show()\n    var notClose = true\n    var noClose = new Noty({queue: 'otherCustomQueueClose'}).on('onClose', function () {\n      notClose = false\n    }).show()\n\n    var notCloseTheNonKillable = true\n    var nonKillable = new Noty({queue: 'customQueueClose', closeWith: [], timeout: false}).on('onClose', function () {\n      notCloseTheNonKillable = false\n    }).show()\n\n    Noty.closeAll('customQueueClose')\n\n    assert.equal(closed, 2,\n      'closeAll closes all notifications')\n    assert.equal(closedCustom, 2,\n      'closeAll closes custom queue notifications')\n    assert.equal(notClose, true,\n      'closeAll should not close the other queue notifications')\n    assert.equal(notCloseTheNonKillable, true,\n      'closeAll should not close the non-Killable notifications')\n\n    nonKillable.close() // this needs individual close\n    noClose.close() // this needs individual close\n  })\n  QUnit.test('button()', function (assert) {\n    assert.expect(13)\n\n    var btn = Noty.button('buttonText')\n    assert.ok(btn.dom,\n      'button has dom object')\n    assert.ok(btn.dom.innerHTML === 'buttonText',\n      'button innerHTML is ok')\n    assert.equal(btn.id.length, 48,\n      'button has a generated ID')\n    assert.equal(btn.cb, undefined,\n      'button has a no cb function')\n    assert.ok($(btn.dom).hasClass('noty_btn'),\n      'button has a default class (noty_btn)')\n    assert.equal(btn.dom.attributes.length, 2,\n      'button has 2 default attributes (id, class)')\n\n    var btnCB = function () {}\n    var btn2 = Noty.button('buttonText', 'btn1 btn2', btnCB, {id: 'myButtonID', 'data-rick': 30})\n    assert.ok(btn2.dom,\n      'button2 has dom object')\n    assert.ok(btn2.dom.innerHTML === 'buttonText',\n      'button2 innerHTML is ok')\n    assert.equal(btn2.id, 'myButtonID',\n      'button2 has given ID')\n    assert.equal(btn2.cb, btnCB,\n      'button2 has given cb function')\n    assert.ok($(btn2.dom).hasClass('btn1 btn2'),\n      'button2 has given classes')\n    assert.notOk($(btn2.dom).hasClass('noty_btn'),\n      'button2 has no default class')\n    assert.equal(btn2.dom.attributes.length, 3,\n      'button2 has given attributes')\n  })\n  QUnit.test('version()', function (assert) {\n    assert.expect(1)\n    assert.equal(typeof Noty.version(), 'string',\n      'returns version string')\n  })\n\n  // @todo - [needim] - sounds\n  // @todo - [needim] - titleCount\n})\n"
  },
  {
    "path": "test/unit/phantom.js",
    "content": "/*\n * grunt-contrib-qunit\n * http://gruntjs.com/\n *\n * Copyright (c) 2014 \"Cowboy\" Ben Alman, contributors\n * Licensed under the MIT license.\n */\n\n(function () {\n  'use strict'\n\n  // Don't re-order tests.\n  QUnit.config.reorder = false\n  // Run tests serially, not in parallel.\n  QUnit.config.autorun = false\n\n  // Send messages to the parent PhantomJS process via alert! Good times!!\n  function sendMessage () {\n    var args = [].slice.call(arguments)\n    alert(JSON.stringify(args))\n  }\n\n  // These methods connect QUnit to PhantomJS.\n  QUnit.log(function (obj) {\n    // What is this I don’t even\n    if (obj.message === '[object Object], undefined:undefined') { return }\n\n    // Parse some stuff before sending it.\n    var actual\n    var expected\n    if (!obj.result) {\n      // Dumping large objects can be very slow, and the dump isn't used for\n      // passing tests, so only dump if the test failed.\n      actual = QUnit.dump.parse(obj.actual)\n      expected = QUnit.dump.parse(obj.expected)\n    }\n    // Send it.\n    sendMessage('qunit.log', obj.result, actual, expected, obj.message, obj.source)\n  })\n\n  QUnit.testStart(function (obj) {\n    sendMessage('qunit.testStart', obj.name)\n  })\n\n  QUnit.testDone(function (obj) {\n    sendMessage('qunit.testDone', obj.name, obj.failed, obj.passed, obj.total, obj.duration)\n  })\n\n  QUnit.moduleStart(function (obj) {\n    sendMessage('qunit.moduleStart', obj.name)\n  })\n\n  QUnit.moduleDone(function (obj) {\n    if (obj.failed === 0) {\n      console.log('\\r\\u221A All tests passed in \"' + obj.name + '\" module')\n    } else {\n      console.log('\\u00D7 ' + obj.failed + ' tests failed in \"' + obj.name + '\" module')\n    }\n    sendMessage('qunit.moduleDone', obj.name, obj.failed, obj.passed, obj.total)\n  })\n\n  QUnit.begin(function () {\n    sendMessage('qunit.begin')\n    console.log('\\n\\nStarting test suite')\n    console.log('================================================\\n')\n  })\n\n  QUnit.done(function (obj) {\n    sendMessage('qunit.done', obj.failed, obj.passed, obj.total, obj.runtime)\n  })\n\n}())\n"
  },
  {
    "path": "test/vendor/qunit-theme-ninja.css",
    "content": "/**\n * QUnit Ninja Theme by Jamie Hoover v1.1.0\n * Modified by Nedim Arabacı\n * https://github.com/Krinkle/qunit-theme-ninja\n *\n * Copyright 2013 jQuery Foundation and other contributors\n * Released under the MIT license.\n * https://jquery.org/license/\n */\nbody {\n  background: #313131;\n  color: #ccc;\n  font: 12px/16px \"Lucida Grande\", sans-serif;\n  margin: 0 auto;\n  max-width: 1024px;\n  min-width: 800px;\n  padding: 24px;\n  position: relative;\n}\n\n#qunit-header {\n  font-size: 24px;\n  line-height: 1;\n  margin: 0 520px 0 0;\n}\n\n#qunit-header > a {\n  color: #ccc;\n  text-decoration: none;\n}\n\n#qunit-header > a:hover {\n  color: #ccc;\n  text-decoration: underline;\n}\n\n#qunit-testresult {\n  font: 12px/12px \"Menlo\", monospace;\n  margin: 20px 0;\n  color: antiquewhite;\n}\n\n#qunit-testresult .module-name {\n  font-weight: bold;\n}\n\n#qunit-testresult br {\n  content: '';\n}\n\n#qunit-testresult span:before {\n  content: ' ';\n}\n\n#qunit-testresult span.failed {\n  color: #c33;\n}\n\n#qunit-testresult span.passed {\n  color: #6c6;\n}\n\ndiv#qunit-testrunner-toolbar {\n  overflow: auto;\n  margin-bottom: 30px;\n}\n\ndiv#qunit-modulefilter-dropdown {\n  display: block;\n  background: #545454;\n  padding: 10px 0;\n  margin-right: 5px;\n  margin-left: 50px;\n}\n\n#qunit-modulefilter-actions label.clickable {\n  display: block;\n  position: relative;\n}\n\nli.pass {\n  color: #8BC34A;\n}\n\nli.fail {\n  color: #c33;\n}\n\n\nform#qunit-modulefilter {\n  display: inline-block;\n  margin-left: 60px;\n  float: right;\n}\n\n#qunit-testrunner-toolbar label:first-child input {\n  margin-left: 0;\n}\n\nform.qunit-filter {\n  display: inline-block;\n  float: right;\n}\n\n#qunit-testrunner-toolbar input {\n  font: inherit;\n  margin: 0 6px 0 24px;\n}\n\n#qunit-testrunner-toolbar label {\n  display: inline-block;\n}\n\n#qunit-testrunner-toolbar select {\n  position: absolute;\n  right: 24px;\n  top: 22px;\n}\n\n#qunit-modulefilter-container label {\n  display: none;\n}\n\n#qunit-banner {\n  height: 1px;\n  margin: 24px 0;\n}\n\n#qunit-banner.qunit-fail {\n  background-color: #c33;\n}\n\n#qunit-banner.qunit-pass {\n  background-color: #6c6;\n}\n\n#qunit-tests {\n  color: #666;\n  font: 12px/24px \"Menlo\", monospace;\n  list-style-position: inside;\n  padding: 0;\n}\n\n#qunit-tests b.counts {\n  font-weight: normal;\n}\n\n#qunit-tests b.counts b {\n  font-weight: normal;\n}\n\n#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running {\n  display: none;\n}\n\n#qunit-tests li a {\n  color: #00BCD4;\n  padding: 0 6px;\n  text-decoration: none;\n}\n\np.qunit-source {\n  color: #8c8c8c;\n  font-size: 10px;\n}\n\n#qunit-tests li a:hover {\n  color: #ccc;\n}\n\n#qunit-tests li a:hover,\n#qunit-tests li strong:hover {\n  text-decoration: underline;\n}\n\n#qunit-tests li b.counts {\n  color: #666;\n}\n\n#qunit-tests li .runtime {\n  font-size: smaller;\n  margin-left: 15px;\n}\n\n#qunit-tests li.fail span.test-message {\n  color: #c33;\n}\n\n#qunit-tests li.fail strong {\n  color: #c33;\n}\n\n#qunit-tests li.fail strong b.counts b.failed {\n  color: #c33;\n}\n\n#qunit-tests li.pass b.passed {\n  color: #6c6;\n}\n\n#qunit-tests li.pass span.test-message {\n  color: #6c6;\n}\n\n#qunit-tests li.pass strong {\n  color: #ccc;\n}\n\n#qunit-tests li strong {\n  font-weight: normal;\n}\n\n#qunit-tests li strong:hover {\n  cursor: pointer;\n}\n\n#qunit-tests ol {\n  list-style-position: inside;\n  padding: 0 0 0 22px;\n}\n\n#qunit-tests ol li table {\n  border-collapse: collapse;\n}\n\n#qunit-tests ol li table td pre {\n  background-color: #222;\n  -webkit-border-radius: 4px;\n  border-radius: 4px;\n  color: #ccc;\n  font: inherit;\n  margin: 3px 0 3px 12px;\n  padding: 12px 24px;\n  white-space: pre-wrap;\n  word-wrap: break-word;\n}\n\n#qunit-tests ol li table th {\n  font-weight: normal;\n}\n\n#qunit-tests ol li table th, #qunit-tests ol li table td {\n  padding: 0;\n  vertical-align: middle;\n}\n\n#qunit-tests ol li table tr.test-actual {\n  color: #c33;\n}\n\n#qunit-tests ol li table tr.test-diff del {\n  color: #6c6;\n}\n\n#qunit-tests ol li table tr.test-diff del, #qunit-tests ol li table tr.test-diff ins {\n  text-decoration: none;\n}\n\n#qunit-tests ol li table tr.test-diff ins {\n  color: #c33;\n}\n\n#qunit-tests ol li table tr.test-expected {\n  color: #FFEB3B;\n}\n\n#qunit-tests ol li table tr.test-source pre {\n  padding: 12px 24px 12px 0;\n}\n\n#qunit-userAgent {\n  color: #666;\n  font: 9px/9px \"Menlo\", monospace;\n}\n\n#qunit-fixture {\n  position: absolute;\n  height: 768px;\n  left: -1024px;\n  top: -768px;\n  width: 1024px;\n}\n\n.qunit-collapsed {\n  display: none;\n}\n\nem.qunit-todo-label {\n  color: #795548;\n  margin-right: 10px;\n}\n\nem.qunit-todo-label:after,\nem.qunit-skipped-label:after {\n  content: \" -\";\n}\n\nem.qunit-skipped-label {\n  margin-right: 10px;\n}\n"
  },
  {
    "path": "test/vendor/qunit.js",
    "content": "/*!\n * QUnit 2.2.0\n * https://qunitjs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2017-03-11T16:19Z\n */\n(function (global$1) {\n  'use strict';\n\n  global$1 = 'default' in global$1 ? global$1['default'] : global$1;\n\n  var window = global$1.window;\n  var console = global$1.console;\n  var setTimeout = global$1.setTimeout;\n  var clearTimeout = global$1.clearTimeout;\n\n  var document = window && window.document;\n  var navigator = window && window.navigator;\n\n  var sessionStorage = function () {\n  \tvar x = \"qunit-test-string\";\n  \ttry {\n  \t\tsessionStorage.setItem(x, x);\n  \t\tsessionStorage.removeItem(x);\n  \t\treturn sessionStorage;\n  \t} catch (e) {\n  \t\treturn undefined;\n  \t}\n  }();\n\n  var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n    return typeof obj;\n  } : function (obj) {\n    return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n  };\n\n\n\n\n\n\n\n\n\n\n\n  var classCallCheck = function (instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  };\n\n  var createClass = function () {\n    function defineProperties(target, props) {\n      for (var i = 0; i < props.length; i++) {\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n        if (\"value\" in descriptor) descriptor.writable = true;\n        Object.defineProperty(target, descriptor.key, descriptor);\n      }\n    }\n\n    return function (Constructor, protoProps, staticProps) {\n      if (protoProps) defineProperties(Constructor.prototype, protoProps);\n      if (staticProps) defineProperties(Constructor, staticProps);\n      return Constructor;\n    };\n  }();\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n  var toConsumableArray = function (arr) {\n    if (Array.isArray(arr)) {\n      for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n      return arr2;\n    } else {\n      return Array.from(arr);\n    }\n  };\n\n  var toString = Object.prototype.toString;\n  var hasOwn = Object.prototype.hasOwnProperty;\n  var now = Date.now || function () {\n  \treturn new Date().getTime();\n  };\n\n  var defined = {\n  \tdocument: window && window.document !== undefined,\n  \tsetTimeout: setTimeout !== undefined\n  };\n\n  // Returns a new Array with the elements that are in a but not in b\n  function diff(a, b) {\n  \tvar i,\n  \t    j,\n  \t    result = a.slice();\n\n  \tfor (i = 0; i < result.length; i++) {\n  \t\tfor (j = 0; j < b.length; j++) {\n  \t\t\tif (result[i] === b[j]) {\n  \t\t\t\tresult.splice(i, 1);\n  \t\t\t\ti--;\n  \t\t\t\tbreak;\n  \t\t\t}\n  \t\t}\n  \t}\n  \treturn result;\n  }\n\n  /**\n   * Determines whether an element exists in a given array or not.\n   *\n   * @method inArray\n   * @param {Any} elem\n   * @param {Array} array\n   * @return {Boolean}\n   */\n  function inArray(elem, array) {\n  \treturn array.indexOf(elem) !== -1;\n  }\n\n  /**\n   * Makes a clone of an object using only Array or Object as base,\n   * and copies over the own enumerable properties.\n   *\n   * @param {Object} obj\n   * @return {Object} New object with only the own properties (recursively).\n   */\n  function objectValues(obj) {\n  \tvar key,\n  \t    val,\n  \t    vals = is(\"array\", obj) ? [] : {};\n  \tfor (key in obj) {\n  \t\tif (hasOwn.call(obj, key)) {\n  \t\t\tval = obj[key];\n  \t\t\tvals[key] = val === Object(val) ? objectValues(val) : val;\n  \t\t}\n  \t}\n  \treturn vals;\n  }\n\n  function extend(a, b, undefOnly) {\n  \tfor (var prop in b) {\n  \t\tif (hasOwn.call(b, prop)) {\n  \t\t\tif (b[prop] === undefined) {\n  \t\t\t\tdelete a[prop];\n  \t\t\t} else if (!(undefOnly && typeof a[prop] !== \"undefined\")) {\n  \t\t\t\ta[prop] = b[prop];\n  \t\t\t}\n  \t\t}\n  \t}\n\n  \treturn a;\n  }\n\n  function objectType(obj) {\n  \tif (typeof obj === \"undefined\") {\n  \t\treturn \"undefined\";\n  \t}\n\n  \t// Consider: typeof null === object\n  \tif (obj === null) {\n  \t\treturn \"null\";\n  \t}\n\n  \tvar match = toString.call(obj).match(/^\\[object\\s(.*)\\]$/),\n  \t    type = match && match[1];\n\n  \tswitch (type) {\n  \t\tcase \"Number\":\n  \t\t\tif (isNaN(obj)) {\n  \t\t\t\treturn \"nan\";\n  \t\t\t}\n  \t\t\treturn \"number\";\n  \t\tcase \"String\":\n  \t\tcase \"Boolean\":\n  \t\tcase \"Array\":\n  \t\tcase \"Set\":\n  \t\tcase \"Map\":\n  \t\tcase \"Date\":\n  \t\tcase \"RegExp\":\n  \t\tcase \"Function\":\n  \t\tcase \"Symbol\":\n  \t\t\treturn type.toLowerCase();\n  \t}\n\n  \tif ((typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj)) === \"object\") {\n  \t\treturn \"object\";\n  \t}\n  }\n\n  // Safe object type checking\n  function is(type, obj) {\n  \treturn objectType(obj) === type;\n  }\n\n  // Test for equality any JavaScript type.\n  // Authors: Philippe Rathé <prathe@gmail.com>, David Chan <david@troi.org>\n  var equiv = (function () {\n\n  \t// Value pairs queued for comparison. Used for breadth-first processing order, recursion\n  \t// detection and avoiding repeated comparison (see below for details).\n  \t// Elements are { a: val, b: val }.\n  \tvar pairs = [];\n\n  \tvar getProto = Object.getPrototypeOf || function (obj) {\n  \t\treturn obj.__proto__;\n  \t};\n\n  \tfunction useStrictEquality(a, b) {\n\n  \t\t// This only gets called if a and b are not strict equal, and is used to compare on\n  \t\t// the primitive values inside object wrappers. For example:\n  \t\t// `var i = 1;`\n  \t\t// `var j = new Number(1);`\n  \t\t// Neither a nor b can be null, as a !== b and they have the same type.\n  \t\tif ((typeof a === \"undefined\" ? \"undefined\" : _typeof(a)) === \"object\") {\n  \t\t\ta = a.valueOf();\n  \t\t}\n  \t\tif ((typeof b === \"undefined\" ? \"undefined\" : _typeof(b)) === \"object\") {\n  \t\t\tb = b.valueOf();\n  \t\t}\n\n  \t\treturn a === b;\n  \t}\n\n  \tfunction compareConstructors(a, b) {\n  \t\tvar protoA = getProto(a);\n  \t\tvar protoB = getProto(b);\n\n  \t\t// Comparing constructors is more strict than using `instanceof`\n  \t\tif (a.constructor === b.constructor) {\n  \t\t\treturn true;\n  \t\t}\n\n  \t\t// Ref #851\n  \t\t// If the obj prototype descends from a null constructor, treat it\n  \t\t// as a null prototype.\n  \t\tif (protoA && protoA.constructor === null) {\n  \t\t\tprotoA = null;\n  \t\t}\n  \t\tif (protoB && protoB.constructor === null) {\n  \t\t\tprotoB = null;\n  \t\t}\n\n  \t\t// Allow objects with no prototype to be equivalent to\n  \t\t// objects with Object as their constructor.\n  \t\tif (protoA === null && protoB === Object.prototype || protoB === null && protoA === Object.prototype) {\n  \t\t\treturn true;\n  \t\t}\n\n  \t\treturn false;\n  \t}\n\n  \tfunction getRegExpFlags(regexp) {\n  \t\treturn \"flags\" in regexp ? regexp.flags : regexp.toString().match(/[gimuy]*$/)[0];\n  \t}\n\n  \tfunction isContainer(val) {\n  \t\treturn [\"object\", \"array\", \"map\", \"set\"].indexOf(objectType(val)) !== -1;\n  \t}\n\n  \tfunction breadthFirstCompareChild(a, b) {\n\n  \t\t// If a is a container not reference-equal to b, postpone the comparison to the\n  \t\t// end of the pairs queue -- unless (a, b) has been seen before, in which case skip\n  \t\t// over the pair.\n  \t\tif (a === b) {\n  \t\t\treturn true;\n  \t\t}\n  \t\tif (!isContainer(a)) {\n  \t\t\treturn typeEquiv(a, b);\n  \t\t}\n  \t\tif (pairs.every(function (pair) {\n  \t\t\treturn pair.a !== a || pair.b !== b;\n  \t\t})) {\n\n  \t\t\t// Not yet started comparing this pair\n  \t\t\tpairs.push({ a: a, b: b });\n  \t\t}\n  \t\treturn true;\n  \t}\n\n  \tvar callbacks = {\n  \t\t\"string\": useStrictEquality,\n  \t\t\"boolean\": useStrictEquality,\n  \t\t\"number\": useStrictEquality,\n  \t\t\"null\": useStrictEquality,\n  \t\t\"undefined\": useStrictEquality,\n  \t\t\"symbol\": useStrictEquality,\n  \t\t\"date\": useStrictEquality,\n\n  \t\t\"nan\": function nan() {\n  \t\t\treturn true;\n  \t\t},\n\n  \t\t\"regexp\": function regexp(a, b) {\n  \t\t\treturn a.source === b.source &&\n\n  \t\t\t// Include flags in the comparison\n  \t\t\tgetRegExpFlags(a) === getRegExpFlags(b);\n  \t\t},\n\n  \t\t// abort (identical references / instance methods were skipped earlier)\n  \t\t\"function\": function _function() {\n  \t\t\treturn false;\n  \t\t},\n\n  \t\t\"array\": function array(a, b) {\n  \t\t\tvar i, len;\n\n  \t\t\tlen = a.length;\n  \t\t\tif (len !== b.length) {\n\n  \t\t\t\t// Safe and faster\n  \t\t\t\treturn false;\n  \t\t\t}\n\n  \t\t\tfor (i = 0; i < len; i++) {\n\n  \t\t\t\t// Compare non-containers; queue non-reference-equal containers\n  \t\t\t\tif (!breadthFirstCompareChild(a[i], b[i])) {\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// Define sets a and b to be equivalent if for each element aVal in a, there\n  \t\t// is some element bVal in b such that aVal and bVal are equivalent. Element\n  \t\t// repetitions are not counted, so these are equivalent:\n  \t\t// a = new Set( [ {}, [], [] ] );\n  \t\t// b = new Set( [ {}, {}, [] ] );\n  \t\t\"set\": function set$$1(a, b) {\n  \t\t\tvar innerEq,\n  \t\t\t    outerEq = true;\n\n  \t\t\tif (a.size !== b.size) {\n\n  \t\t\t\t// This optimization has certain quirks because of the lack of\n  \t\t\t\t// repetition counting. For instance, adding the same\n  \t\t\t\t// (reference-identical) element to two equivalent sets can\n  \t\t\t\t// make them non-equivalent.\n  \t\t\t\treturn false;\n  \t\t\t}\n\n  \t\t\ta.forEach(function (aVal) {\n\n  \t\t\t\t// Short-circuit if the result is already known. (Using for...of\n  \t\t\t\t// with a break clause would be cleaner here, but it would cause\n  \t\t\t\t// a syntax error on older Javascript implementations even if\n  \t\t\t\t// Set is unused)\n  \t\t\t\tif (!outerEq) {\n  \t\t\t\t\treturn;\n  \t\t\t\t}\n\n  \t\t\t\tinnerEq = false;\n\n  \t\t\t\tb.forEach(function (bVal) {\n  \t\t\t\t\tvar parentPairs;\n\n  \t\t\t\t\t// Likewise, short-circuit if the result is already known\n  \t\t\t\t\tif (innerEq) {\n  \t\t\t\t\t\treturn;\n  \t\t\t\t\t}\n\n  \t\t\t\t\t// Swap out the global pairs list, as the nested call to\n  \t\t\t\t\t// innerEquiv will clobber its contents\n  \t\t\t\t\tparentPairs = pairs;\n  \t\t\t\t\tif (innerEquiv(bVal, aVal)) {\n  \t\t\t\t\t\tinnerEq = true;\n  \t\t\t\t\t}\n\n  \t\t\t\t\t// Replace the global pairs list\n  \t\t\t\t\tpairs = parentPairs;\n  \t\t\t\t});\n\n  \t\t\t\tif (!innerEq) {\n  \t\t\t\t\touterEq = false;\n  \t\t\t\t}\n  \t\t\t});\n\n  \t\t\treturn outerEq;\n  \t\t},\n\n  \t\t// Define maps a and b to be equivalent if for each key-value pair (aKey, aVal)\n  \t\t// in a, there is some key-value pair (bKey, bVal) in b such that\n  \t\t// [ aKey, aVal ] and [ bKey, bVal ] are equivalent. Key repetitions are not\n  \t\t// counted, so these are equivalent:\n  \t\t// a = new Map( [ [ {}, 1 ], [ {}, 1 ], [ [], 1 ] ] );\n  \t\t// b = new Map( [ [ {}, 1 ], [ [], 1 ], [ [], 1 ] ] );\n  \t\t\"map\": function map(a, b) {\n  \t\t\tvar innerEq,\n  \t\t\t    outerEq = true;\n\n  \t\t\tif (a.size !== b.size) {\n\n  \t\t\t\t// This optimization has certain quirks because of the lack of\n  \t\t\t\t// repetition counting. For instance, adding the same\n  \t\t\t\t// (reference-identical) key-value pair to two equivalent maps\n  \t\t\t\t// can make them non-equivalent.\n  \t\t\t\treturn false;\n  \t\t\t}\n\n  \t\t\ta.forEach(function (aVal, aKey) {\n\n  \t\t\t\t// Short-circuit if the result is already known. (Using for...of\n  \t\t\t\t// with a break clause would be cleaner here, but it would cause\n  \t\t\t\t// a syntax error on older Javascript implementations even if\n  \t\t\t\t// Map is unused)\n  \t\t\t\tif (!outerEq) {\n  \t\t\t\t\treturn;\n  \t\t\t\t}\n\n  \t\t\t\tinnerEq = false;\n\n  \t\t\t\tb.forEach(function (bVal, bKey) {\n  \t\t\t\t\tvar parentPairs;\n\n  \t\t\t\t\t// Likewise, short-circuit if the result is already known\n  \t\t\t\t\tif (innerEq) {\n  \t\t\t\t\t\treturn;\n  \t\t\t\t\t}\n\n  \t\t\t\t\t// Swap out the global pairs list, as the nested call to\n  \t\t\t\t\t// innerEquiv will clobber its contents\n  \t\t\t\t\tparentPairs = pairs;\n  \t\t\t\t\tif (innerEquiv([bVal, bKey], [aVal, aKey])) {\n  \t\t\t\t\t\tinnerEq = true;\n  \t\t\t\t\t}\n\n  \t\t\t\t\t// Replace the global pairs list\n  \t\t\t\t\tpairs = parentPairs;\n  \t\t\t\t});\n\n  \t\t\t\tif (!innerEq) {\n  \t\t\t\t\touterEq = false;\n  \t\t\t\t}\n  \t\t\t});\n\n  \t\t\treturn outerEq;\n  \t\t},\n\n  \t\t\"object\": function object(a, b) {\n  \t\t\tvar i,\n  \t\t\t    aProperties = [],\n  \t\t\t    bProperties = [];\n\n  \t\t\tif (compareConstructors(a, b) === false) {\n  \t\t\t\treturn false;\n  \t\t\t}\n\n  \t\t\t// Be strict: don't ensure hasOwnProperty and go deep\n  \t\t\tfor (i in a) {\n\n  \t\t\t\t// Collect a's properties\n  \t\t\t\taProperties.push(i);\n\n  \t\t\t\t// Skip OOP methods that look the same\n  \t\t\t\tif (a.constructor !== Object && typeof a.constructor !== \"undefined\" && typeof a[i] === \"function\" && typeof b[i] === \"function\" && a[i].toString() === b[i].toString()) {\n  \t\t\t\t\tcontinue;\n  \t\t\t\t}\n\n  \t\t\t\t// Compare non-containers; queue non-reference-equal containers\n  \t\t\t\tif (!breadthFirstCompareChild(a[i], b[i])) {\n  \t\t\t\t\treturn false;\n  \t\t\t\t}\n  \t\t\t}\n\n  \t\t\tfor (i in b) {\n\n  \t\t\t\t// Collect b's properties\n  \t\t\t\tbProperties.push(i);\n  \t\t\t}\n\n  \t\t\t// Ensures identical properties name\n  \t\t\treturn typeEquiv(aProperties.sort(), bProperties.sort());\n  \t\t}\n  \t};\n\n  \tfunction typeEquiv(a, b) {\n  \t\tvar type = objectType(a);\n\n  \t\t// Callbacks for containers will append to the pairs queue to achieve breadth-first\n  \t\t// search order. The pairs queue is also used to avoid reprocessing any pair of\n  \t\t// containers that are reference-equal to a previously visited pair (a special case\n  \t\t// this being recursion detection).\n  \t\t//\n  \t\t// Because of this approach, once typeEquiv returns a false value, it should not be\n  \t\t// called again without clearing the pair queue else it may wrongly report a visited\n  \t\t// pair as being equivalent.\n  \t\treturn objectType(b) === type && callbacks[type](a, b);\n  \t}\n\n  \tfunction innerEquiv(a, b) {\n  \t\tvar i, pair;\n\n  \t\t// We're done when there's nothing more to compare\n  \t\tif (arguments.length < 2) {\n  \t\t\treturn true;\n  \t\t}\n\n  \t\t// Clear the global pair queue and add the top-level values being compared\n  \t\tpairs = [{ a: a, b: b }];\n\n  \t\tfor (i = 0; i < pairs.length; i++) {\n  \t\t\tpair = pairs[i];\n\n  \t\t\t// Perform type-specific comparison on any pairs that are not strictly\n  \t\t\t// equal. For container types, that comparison will postpone comparison\n  \t\t\t// of any sub-container pair to the end of the pair queue. This gives\n  \t\t\t// breadth-first search order. It also avoids the reprocessing of\n  \t\t\t// reference-equal siblings, cousins etc, which can have a significant speed\n  \t\t\t// impact when comparing a container of small objects each of which has a\n  \t\t\t// reference to the same (singleton) large object.\n  \t\t\tif (pair.a !== pair.b && !typeEquiv(pair.a, pair.b)) {\n  \t\t\t\treturn false;\n  \t\t\t}\n  \t\t}\n\n  \t\t// ...across all consecutive argument pairs\n  \t\treturn arguments.length === 2 || innerEquiv.apply(this, [].slice.call(arguments, 1));\n  \t}\n\n  \treturn innerEquiv;\n  })();\n\n  /**\n   * Config object: Maintain internal state\n   * Later exposed as QUnit.config\n   * `config` initialized at top of scope\n   */\n  var config = {\n\n  \t// The queue of tests to run\n  \tqueue: [],\n\n  \t// Block until document ready\n  \tblocking: true,\n\n  \t// By default, run previously failed tests first\n  \t// very useful in combination with \"Hide passed tests\" checked\n  \treorder: true,\n\n  \t// By default, modify document.title when suite is done\n  \taltertitle: true,\n\n  \t// HTML Reporter: collapse every test except the first failing test\n  \t// If false, all failing tests will be expanded\n  \tcollapse: true,\n\n  \t// By default, scroll to top of the page when suite is done\n  \tscrolltop: true,\n\n  \t// Depth up-to which object will be dumped\n  \tmaxDepth: 5,\n\n  \t// When enabled, all tests must call expect()\n  \trequireExpects: false,\n\n  \t// Placeholder for user-configurable form-exposed URL parameters\n  \turlConfig: [],\n\n  \t// Set of all modules.\n  \tmodules: [],\n\n  \t// Stack of nested modules\n  \tmoduleStack: [],\n\n  \t// The first unnamed module\n  \tcurrentModule: {\n  \t\tname: \"\",\n  \t\ttests: [],\n  \t\tchildModules: [],\n  \t\ttestsRun: 0\n  \t},\n\n  \tcallbacks: {},\n\n  \t// The storage module to use for reordering tests\n  \tstorage: sessionStorage\n  };\n\n  // take a predefined QUnit.config and extend the defaults\n  var globalConfig = window && window.QUnit && window.QUnit.config;\n\n  // only extend the global config if there is no QUnit overload\n  if (window && window.QUnit && !window.QUnit.version) {\n  \textend(config, globalConfig);\n  }\n\n  // Push a loose unnamed module to the modules collection\n  config.modules.push(config.currentModule);\n\n  // Based on jsDump by Ariel Flesler\n  // http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html\n  var dump = (function () {\n  \tfunction quote(str) {\n  \t\treturn \"\\\"\" + str.toString().replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, \"\\\\\\\"\") + \"\\\"\";\n  \t}\n  \tfunction literal(o) {\n  \t\treturn o + \"\";\n  \t}\n  \tfunction join(pre, arr, post) {\n  \t\tvar s = dump.separator(),\n  \t\t    base = dump.indent(),\n  \t\t    inner = dump.indent(1);\n  \t\tif (arr.join) {\n  \t\t\tarr = arr.join(\",\" + s + inner);\n  \t\t}\n  \t\tif (!arr) {\n  \t\t\treturn pre + post;\n  \t\t}\n  \t\treturn [pre, inner + arr, base + post].join(s);\n  \t}\n  \tfunction array(arr, stack) {\n  \t\tvar i = arr.length,\n  \t\t    ret = new Array(i);\n\n  \t\tif (dump.maxDepth && dump.depth > dump.maxDepth) {\n  \t\t\treturn \"[object Array]\";\n  \t\t}\n\n  \t\tthis.up();\n  \t\twhile (i--) {\n  \t\t\tret[i] = this.parse(arr[i], undefined, stack);\n  \t\t}\n  \t\tthis.down();\n  \t\treturn join(\"[\", ret, \"]\");\n  \t}\n\n  \tfunction isArray(obj) {\n  \t\treturn (\n\n  \t\t\t//Native Arrays\n  \t\t\ttoString.call(obj) === \"[object Array]\" ||\n\n  \t\t\t// NodeList objects\n  \t\t\ttypeof obj.length === \"number\" && obj.item !== undefined && (obj.length ? obj.item(0) === obj[0] : obj.item(0) === null && obj[0] === undefined)\n  \t\t);\n  \t}\n\n  \tvar reName = /^function (\\w+)/,\n  \t    dump = {\n\n  \t\t// The objType is used mostly internally, you can fix a (custom) type in advance\n  \t\tparse: function parse(obj, objType, stack) {\n  \t\t\tstack = stack || [];\n  \t\t\tvar res,\n  \t\t\t    parser,\n  \t\t\t    parserType,\n  \t\t\t    objIndex = stack.indexOf(obj);\n\n  \t\t\tif (objIndex !== -1) {\n  \t\t\t\treturn \"recursion(\" + (objIndex - stack.length) + \")\";\n  \t\t\t}\n\n  \t\t\tobjType = objType || this.typeOf(obj);\n  \t\t\tparser = this.parsers[objType];\n  \t\t\tparserType = typeof parser === \"undefined\" ? \"undefined\" : _typeof(parser);\n\n  \t\t\tif (parserType === \"function\") {\n  \t\t\t\tstack.push(obj);\n  \t\t\t\tres = parser.call(this, obj, stack);\n  \t\t\t\tstack.pop();\n  \t\t\t\treturn res;\n  \t\t\t}\n  \t\t\treturn parserType === \"string\" ? parser : this.parsers.error;\n  \t\t},\n  \t\ttypeOf: function typeOf(obj) {\n  \t\t\tvar type;\n\n  \t\t\tif (obj === null) {\n  \t\t\t\ttype = \"null\";\n  \t\t\t} else if (typeof obj === \"undefined\") {\n  \t\t\t\ttype = \"undefined\";\n  \t\t\t} else if (is(\"regexp\", obj)) {\n  \t\t\t\ttype = \"regexp\";\n  \t\t\t} else if (is(\"date\", obj)) {\n  \t\t\t\ttype = \"date\";\n  \t\t\t} else if (is(\"function\", obj)) {\n  \t\t\t\ttype = \"function\";\n  \t\t\t} else if (obj.setInterval !== undefined && obj.document !== undefined && obj.nodeType === undefined) {\n  \t\t\t\ttype = \"window\";\n  \t\t\t} else if (obj.nodeType === 9) {\n  \t\t\t\ttype = \"document\";\n  \t\t\t} else if (obj.nodeType) {\n  \t\t\t\ttype = \"node\";\n  \t\t\t} else if (isArray(obj)) {\n  \t\t\t\ttype = \"array\";\n  \t\t\t} else if (obj.constructor === Error.prototype.constructor) {\n  \t\t\t\ttype = \"error\";\n  \t\t\t} else {\n  \t\t\t\ttype = typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj);\n  \t\t\t}\n  \t\t\treturn type;\n  \t\t},\n\n  \t\tseparator: function separator() {\n  \t\t\tif (this.multiline) {\n  \t\t\t\treturn this.HTML ? \"<br />\" : \"\\n\";\n  \t\t\t} else {\n  \t\t\t\treturn this.HTML ? \"&#160;\" : \" \";\n  \t\t\t}\n  \t\t},\n\n  \t\t// Extra can be a number, shortcut for increasing-calling-decreasing\n  \t\tindent: function indent(extra) {\n  \t\t\tif (!this.multiline) {\n  \t\t\t\treturn \"\";\n  \t\t\t}\n  \t\t\tvar chr = this.indentChar;\n  \t\t\tif (this.HTML) {\n  \t\t\t\tchr = chr.replace(/\\t/g, \"   \").replace(/ /g, \"&#160;\");\n  \t\t\t}\n  \t\t\treturn new Array(this.depth + (extra || 0)).join(chr);\n  \t\t},\n  \t\tup: function up(a) {\n  \t\t\tthis.depth += a || 1;\n  \t\t},\n  \t\tdown: function down(a) {\n  \t\t\tthis.depth -= a || 1;\n  \t\t},\n  \t\tsetParser: function setParser(name, parser) {\n  \t\t\tthis.parsers[name] = parser;\n  \t\t},\n\n  \t\t// The next 3 are exposed so you can use them\n  \t\tquote: quote,\n  \t\tliteral: literal,\n  \t\tjoin: join,\n  \t\tdepth: 1,\n  \t\tmaxDepth: config.maxDepth,\n\n  \t\t// This is the list of parsers, to modify them, use dump.setParser\n  \t\tparsers: {\n  \t\t\twindow: \"[Window]\",\n  \t\t\tdocument: \"[Document]\",\n  \t\t\terror: function error(_error) {\n  \t\t\t\treturn \"Error(\\\"\" + _error.message + \"\\\")\";\n  \t\t\t},\n  \t\t\tunknown: \"[Unknown]\",\n  \t\t\t\"null\": \"null\",\n  \t\t\t\"undefined\": \"undefined\",\n  \t\t\t\"function\": function _function(fn) {\n  \t\t\t\tvar ret = \"function\",\n\n\n  \t\t\t\t// Functions never have name in IE\n  \t\t\t\tname = \"name\" in fn ? fn.name : (reName.exec(fn) || [])[1];\n\n  \t\t\t\tif (name) {\n  \t\t\t\t\tret += \" \" + name;\n  \t\t\t\t}\n  \t\t\t\tret += \"(\";\n\n  \t\t\t\tret = [ret, dump.parse(fn, \"functionArgs\"), \"){\"].join(\"\");\n  \t\t\t\treturn join(ret, dump.parse(fn, \"functionCode\"), \"}\");\n  \t\t\t},\n  \t\t\tarray: array,\n  \t\t\tnodelist: array,\n  \t\t\t\"arguments\": array,\n  \t\t\tobject: function object(map, stack) {\n  \t\t\t\tvar keys,\n  \t\t\t\t    key,\n  \t\t\t\t    val,\n  \t\t\t\t    i,\n  \t\t\t\t    nonEnumerableProperties,\n  \t\t\t\t    ret = [];\n\n  \t\t\t\tif (dump.maxDepth && dump.depth > dump.maxDepth) {\n  \t\t\t\t\treturn \"[object Object]\";\n  \t\t\t\t}\n\n  \t\t\t\tdump.up();\n  \t\t\t\tkeys = [];\n  \t\t\t\tfor (key in map) {\n  \t\t\t\t\tkeys.push(key);\n  \t\t\t\t}\n\n  \t\t\t\t// Some properties are not always enumerable on Error objects.\n  \t\t\t\tnonEnumerableProperties = [\"message\", \"name\"];\n  \t\t\t\tfor (i in nonEnumerableProperties) {\n  \t\t\t\t\tkey = nonEnumerableProperties[i];\n  \t\t\t\t\tif (key in map && !inArray(key, keys)) {\n  \t\t\t\t\t\tkeys.push(key);\n  \t\t\t\t\t}\n  \t\t\t\t}\n  \t\t\t\tkeys.sort();\n  \t\t\t\tfor (i = 0; i < keys.length; i++) {\n  \t\t\t\t\tkey = keys[i];\n  \t\t\t\t\tval = map[key];\n  \t\t\t\t\tret.push(dump.parse(key, \"key\") + \": \" + dump.parse(val, undefined, stack));\n  \t\t\t\t}\n  \t\t\t\tdump.down();\n  \t\t\t\treturn join(\"{\", ret, \"}\");\n  \t\t\t},\n  \t\t\tnode: function node(_node) {\n  \t\t\t\tvar len,\n  \t\t\t\t    i,\n  \t\t\t\t    val,\n  \t\t\t\t    open = dump.HTML ? \"&lt;\" : \"<\",\n  \t\t\t\t    close = dump.HTML ? \"&gt;\" : \">\",\n  \t\t\t\t    tag = _node.nodeName.toLowerCase(),\n  \t\t\t\t    ret = open + tag,\n  \t\t\t\t    attrs = _node.attributes;\n\n  \t\t\t\tif (attrs) {\n  \t\t\t\t\tfor (i = 0, len = attrs.length; i < len; i++) {\n  \t\t\t\t\t\tval = attrs[i].nodeValue;\n\n  \t\t\t\t\t\t// IE6 includes all attributes in .attributes, even ones not explicitly\n  \t\t\t\t\t\t// set. Those have values like undefined, null, 0, false, \"\" or\n  \t\t\t\t\t\t// \"inherit\".\n  \t\t\t\t\t\tif (val && val !== \"inherit\") {\n  \t\t\t\t\t\t\tret += \" \" + attrs[i].nodeName + \"=\" + dump.parse(val, \"attribute\");\n  \t\t\t\t\t\t}\n  \t\t\t\t\t}\n  \t\t\t\t}\n  \t\t\t\tret += close;\n\n  \t\t\t\t// Show content of TextNode or CDATASection\n  \t\t\t\tif (_node.nodeType === 3 || _node.nodeType === 4) {\n  \t\t\t\t\tret += _node.nodeValue;\n  \t\t\t\t}\n\n  \t\t\t\treturn ret + open + \"/\" + tag + close;\n  \t\t\t},\n\n  \t\t\t// Function calls it internally, it's the arguments part of the function\n  \t\t\tfunctionArgs: function functionArgs(fn) {\n  \t\t\t\tvar args,\n  \t\t\t\t    l = fn.length;\n\n  \t\t\t\tif (!l) {\n  \t\t\t\t\treturn \"\";\n  \t\t\t\t}\n\n  \t\t\t\targs = new Array(l);\n  \t\t\t\twhile (l--) {\n\n  \t\t\t\t\t// 97 is 'a'\n  \t\t\t\t\targs[l] = String.fromCharCode(97 + l);\n  \t\t\t\t}\n  \t\t\t\treturn \" \" + args.join(\", \") + \" \";\n  \t\t\t},\n\n  \t\t\t// Object calls it internally, the key part of an item in a map\n  \t\t\tkey: quote,\n\n  \t\t\t// Function calls it internally, it's the content of the function\n  \t\t\tfunctionCode: \"[code]\",\n\n  \t\t\t// Node calls it internally, it's a html attribute value\n  \t\t\tattribute: quote,\n  \t\t\tstring: quote,\n  \t\t\tdate: quote,\n  \t\t\tregexp: literal,\n  \t\t\tnumber: literal,\n  \t\t\t\"boolean\": literal,\n  \t\t\tsymbol: function symbol(sym) {\n  \t\t\t\treturn sym.toString();\n  \t\t\t}\n  \t\t},\n\n  \t\t// If true, entities are escaped ( <, >, \\t, space and \\n )\n  \t\tHTML: false,\n\n  \t\t// Indentation unit\n  \t\tindentChar: \"  \",\n\n  \t\t// If true, items in a collection, are separated by a \\n, else just a space.\n  \t\tmultiline: true\n  \t};\n\n  \treturn dump;\n  })();\n\n  var LISTENERS = Object.create(null);\n  var SUPPORTED_EVENTS = [\"runStart\", \"suiteStart\", \"testStart\", \"assertion\", \"testEnd\", \"suiteEnd\", \"runEnd\"];\n\n  /**\n   * Emits an event with the specified data to all currently registered listeners.\n   * Callbacks will fire in the order in which they are registered (FIFO). This\n   * function is not exposed publicly; it is used by QUnit internals to emit\n   * logging events.\n   *\n   * @private\n   * @method emit\n   * @param {String} eventName\n   * @param {Object} data\n   * @return {Void}\n   */\n  function emit(eventName, data) {\n  \tif (objectType(eventName) !== \"string\") {\n  \t\tthrow new TypeError(\"eventName must be a string when emitting an event\");\n  \t}\n\n  \t// Clone the callbacks in case one of them registers a new callback\n  \tvar originalCallbacks = LISTENERS[eventName];\n  \tvar callbacks = originalCallbacks ? [].concat(toConsumableArray(originalCallbacks)) : [];\n\n  \tfor (var i = 0; i < callbacks.length; i++) {\n  \t\tcallbacks[i](data);\n  \t}\n  }\n\n  /**\n   * Registers a callback as a listener to the specified event.\n   *\n   * @public\n   * @method on\n   * @param {String} eventName\n   * @param {Function} callback\n   * @return {Void}\n   */\n  function on(eventName, callback) {\n  \tif (objectType(eventName) !== \"string\") {\n  \t\tthrow new TypeError(\"eventName must be a string when registering a listener\");\n  \t} else if (!inArray(eventName, SUPPORTED_EVENTS)) {\n  \t\tvar events = SUPPORTED_EVENTS.join(\", \");\n  \t\tthrow new Error(\"\\\"\" + eventName + \"\\\" is not a valid event; must be one of: \" + events + \".\");\n  \t} else if (objectType(callback) !== \"function\") {\n  \t\tthrow new TypeError(\"callback must be a function when registering a listener\");\n  \t}\n\n  \tif (!LISTENERS[eventName]) {\n  \t\tLISTENERS[eventName] = [];\n  \t}\n\n  \t// Don't register the same callback more than once\n  \tif (!inArray(callback, LISTENERS[eventName])) {\n  \t\tLISTENERS[eventName].push(callback);\n  \t}\n  }\n\n  // Register logging callbacks\n  function registerLoggingCallbacks(obj) {\n  \tvar i,\n  \t    l,\n  \t    key,\n  \t    callbackNames = [\"begin\", \"done\", \"log\", \"testStart\", \"testDone\", \"moduleStart\", \"moduleDone\"];\n\n  \tfunction registerLoggingCallback(key) {\n  \t\tvar loggingCallback = function loggingCallback(callback) {\n  \t\t\tif (objectType(callback) !== \"function\") {\n  \t\t\t\tthrow new Error(\"QUnit logging methods require a callback function as their first parameters.\");\n  \t\t\t}\n\n  \t\t\tconfig.callbacks[key].push(callback);\n  \t\t};\n\n  \t\treturn loggingCallback;\n  \t}\n\n  \tfor (i = 0, l = callbackNames.length; i < l; i++) {\n  \t\tkey = callbackNames[i];\n\n  \t\t// Initialize key collection of logging callback\n  \t\tif (objectType(config.callbacks[key]) === \"undefined\") {\n  \t\t\tconfig.callbacks[key] = [];\n  \t\t}\n\n  \t\tobj[key] = registerLoggingCallback(key);\n  \t}\n  }\n\n  function runLoggingCallbacks(key, args) {\n  \tvar i, l, callbacks;\n\n  \tcallbacks = config.callbacks[key];\n  \tfor (i = 0, l = callbacks.length; i < l; i++) {\n  \t\tcallbacks[i](args);\n  \t}\n  }\n\n  // Doesn't support IE9, it will return undefined on these browsers\n  // See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack\n  var fileName = (sourceFromStacktrace(0) || \"\").replace(/(:\\d+)+\\)?/, \"\").replace(/.+\\//, \"\");\n\n  function extractStacktrace(e, offset) {\n  \toffset = offset === undefined ? 4 : offset;\n\n  \tvar stack, include, i;\n\n  \tif (e && e.stack) {\n  \t\tstack = e.stack.split(\"\\n\");\n  \t\tif (/^error$/i.test(stack[0])) {\n  \t\t\tstack.shift();\n  \t\t}\n  \t\tif (fileName) {\n  \t\t\tinclude = [];\n  \t\t\tfor (i = offset; i < stack.length; i++) {\n  \t\t\t\tif (stack[i].indexOf(fileName) !== -1) {\n  \t\t\t\t\tbreak;\n  \t\t\t\t}\n  \t\t\t\tinclude.push(stack[i]);\n  \t\t\t}\n  \t\t\tif (include.length) {\n  \t\t\t\treturn include.join(\"\\n\");\n  \t\t\t}\n  \t\t}\n  \t\treturn stack[offset];\n  \t}\n  }\n\n  function sourceFromStacktrace(offset) {\n  \tvar error = new Error();\n\n  \t// Support: Safari <=7 only, IE <=10 - 11 only\n  \t// Not all browsers generate the `stack` property for `new Error()`, see also #636\n  \tif (!error.stack) {\n  \t\ttry {\n  \t\t\tthrow error;\n  \t\t} catch (err) {\n  \t\t\terror = err;\n  \t\t}\n  \t}\n\n  \treturn extractStacktrace(error, offset);\n  }\n\n  var TestReport = function () {\n  \tfunction TestReport(name, suite, options) {\n  \t\tclassCallCheck(this, TestReport);\n\n  \t\tthis.name = name;\n  \t\tthis.suiteName = suite.name;\n  \t\tthis.fullName = suite.fullName.concat(name);\n  \t\tthis.runtime = 0;\n  \t\tthis.assertions = [];\n\n  \t\tthis.skipped = !!options.skip;\n  \t\tthis.todo = !!options.todo;\n\n  \t\tthis._startTime = 0;\n  \t\tthis._endTime = 0;\n\n  \t\tsuite.pushTest(this);\n  \t}\n\n  \tcreateClass(TestReport, [{\n  \t\tkey: \"start\",\n  \t\tvalue: function start(recordTime) {\n  \t\t\tif (recordTime) {\n  \t\t\t\tthis._startTime = Date.now();\n  \t\t\t}\n\n  \t\t\treturn {\n  \t\t\t\tname: this.name,\n  \t\t\t\tsuiteName: this.suiteName,\n  \t\t\t\tfullName: this.fullName.slice()\n  \t\t\t};\n  \t\t}\n  \t}, {\n  \t\tkey: \"end\",\n  \t\tvalue: function end(recordTime) {\n  \t\t\tif (recordTime) {\n  \t\t\t\tthis._endTime = Date.now();\n  \t\t\t}\n\n  \t\t\treturn extend(this.start(), {\n  \t\t\t\truntime: this.getRuntime(),\n  \t\t\t\tstatus: this.getStatus(),\n  \t\t\t\terrors: this.getFailedAssertions(),\n  \t\t\t\tassertions: this.getAssertions()\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"pushAssertion\",\n  \t\tvalue: function pushAssertion(assertion) {\n  \t\t\tthis.assertions.push(assertion);\n  \t\t}\n  \t}, {\n  \t\tkey: \"getRuntime\",\n  \t\tvalue: function getRuntime() {\n  \t\t\treturn this._endTime - this._startTime;\n  \t\t}\n  \t}, {\n  \t\tkey: \"getStatus\",\n  \t\tvalue: function getStatus() {\n  \t\t\tif (this.skipped) {\n  \t\t\t\treturn \"skipped\";\n  \t\t\t}\n\n  \t\t\tvar testPassed = this.getFailedAssertions().length > 0 ? this.todo : !this.todo;\n\n  \t\t\tif (!testPassed) {\n  \t\t\t\treturn \"failed\";\n  \t\t\t} else if (this.todo) {\n  \t\t\t\treturn \"todo\";\n  \t\t\t} else {\n  \t\t\t\treturn \"passed\";\n  \t\t\t}\n  \t\t}\n  \t}, {\n  \t\tkey: \"getFailedAssertions\",\n  \t\tvalue: function getFailedAssertions() {\n  \t\t\treturn this.assertions.filter(function (assertion) {\n  \t\t\t\treturn !assertion.passed;\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"getAssertions\",\n  \t\tvalue: function getAssertions() {\n  \t\t\treturn this.assertions.slice();\n  \t\t}\n  \t}]);\n  \treturn TestReport;\n  }();\n\n  var unitSampler;\n  var focused = false;\n  var priorityCount = 0;\n\n  function Test(settings) {\n  \tvar i, l;\n\n  \t++Test.count;\n\n  \tthis.expected = null;\n  \textend(this, settings);\n  \tthis.assertions = [];\n  \tthis.semaphore = 0;\n  \tthis.usedAsync = false;\n  \tthis.module = config.currentModule;\n  \tthis.stack = sourceFromStacktrace(3);\n  \tthis.steps = [];\n\n  \tthis.testReport = new TestReport(settings.testName, this.module.suiteReport, {\n  \t\ttodo: settings.todo,\n  \t\tskip: settings.skip\n  \t});\n\n  \t// Register unique strings\n  \tfor (i = 0, l = this.module.tests; i < l.length; i++) {\n  \t\tif (this.module.tests[i].name === this.testName) {\n  \t\t\tthis.testName += \" \";\n  \t\t}\n  \t}\n\n  \tthis.testId = generateHash(this.module.name, this.testName);\n\n  \tthis.module.tests.push({\n  \t\tname: this.testName,\n  \t\ttestId: this.testId\n  \t});\n\n  \tif (settings.skip) {\n\n  \t\t// Skipped tests will fully ignore any sent callback\n  \t\tthis.callback = function () {};\n  \t\tthis.async = false;\n  \t\tthis.expected = 0;\n  \t} else {\n  \t\tthis.assert = new Assert(this);\n  \t}\n  }\n\n  Test.count = 0;\n\n  function getNotStartedModules(startModule) {\n  \tvar module = startModule,\n  \t    modules = [];\n\n  \twhile (module && module.testsRun === 0) {\n  \t\tmodules.push(module);\n  \t\tmodule = module.parentModule;\n  \t}\n\n  \treturn modules;\n  }\n\n  Test.prototype = {\n  \tbefore: function before() {\n  \t\tvar i,\n  \t\t    startModule,\n  \t\t    module = this.module,\n  \t\t    notStartedModules = getNotStartedModules(module);\n\n  \t\tfor (i = notStartedModules.length - 1; i >= 0; i--) {\n  \t\t\tstartModule = notStartedModules[i];\n  \t\t\tstartModule.stats = { all: 0, bad: 0, started: now() };\n  \t\t\temit(\"suiteStart\", startModule.suiteReport.start(true));\n  \t\t\trunLoggingCallbacks(\"moduleStart\", {\n  \t\t\t\tname: startModule.name,\n  \t\t\t\ttests: startModule.tests\n  \t\t\t});\n  \t\t}\n\n  \t\tconfig.current = this;\n\n  \t\tif (module.testEnvironment) {\n  \t\t\tdelete module.testEnvironment.before;\n  \t\t\tdelete module.testEnvironment.beforeEach;\n  \t\t\tdelete module.testEnvironment.afterEach;\n  \t\t\tdelete module.testEnvironment.after;\n  \t\t}\n  \t\tthis.testEnvironment = extend({}, module.testEnvironment);\n\n  \t\tthis.started = now();\n  \t\temit(\"testStart\", this.testReport.start(true));\n  \t\trunLoggingCallbacks(\"testStart\", {\n  \t\t\tname: this.testName,\n  \t\t\tmodule: module.name,\n  \t\t\ttestId: this.testId,\n  \t\t\tpreviousFailure: this.previousFailure\n  \t\t});\n\n  \t\tif (!config.pollution) {\n  \t\t\tsaveGlobal();\n  \t\t}\n  \t},\n\n  \trun: function run() {\n  \t\tvar promise;\n\n  \t\tconfig.current = this;\n\n  \t\tthis.callbackStarted = now();\n\n  \t\tif (config.notrycatch) {\n  \t\t\trunTest(this);\n  \t\t\treturn;\n  \t\t}\n\n  \t\ttry {\n  \t\t\trunTest(this);\n  \t\t} catch (e) {\n  \t\t\tthis.pushFailure(\"Died on test #\" + (this.assertions.length + 1) + \" \" + this.stack + \": \" + (e.message || e), extractStacktrace(e, 0));\n\n  \t\t\t// Else next test will carry the responsibility\n  \t\t\tsaveGlobal();\n\n  \t\t\t// Restart the tests if they're blocking\n  \t\t\tif (config.blocking) {\n  \t\t\t\tinternalRecover(this);\n  \t\t\t}\n  \t\t}\n\n  \t\tfunction runTest(test) {\n  \t\t\tpromise = test.callback.call(test.testEnvironment, test.assert);\n  \t\t\ttest.resolvePromise(promise);\n  \t\t}\n  \t},\n\n  \tafter: function after() {\n  \t\tcheckPollution();\n  \t},\n\n  \tqueueHook: function queueHook(hook, hookName, hookOwner) {\n  \t\tvar promise,\n  \t\t    test = this;\n  \t\treturn function runHook() {\n  \t\t\tif (hookName === \"before\") {\n  \t\t\t\tif (hookOwner.testsRun !== 0) {\n  \t\t\t\t\treturn;\n  \t\t\t\t}\n\n  \t\t\t\ttest.preserveEnvironment = true;\n  \t\t\t}\n\n  \t\t\tif (hookName === \"after\" && hookOwner.testsRun !== numberOfTests(hookOwner) - 1) {\n  \t\t\t\treturn;\n  \t\t\t}\n\n  \t\t\tconfig.current = test;\n  \t\t\tif (config.notrycatch) {\n  \t\t\t\tcallHook();\n  \t\t\t\treturn;\n  \t\t\t}\n  \t\t\ttry {\n  \t\t\t\tcallHook();\n  \t\t\t} catch (error) {\n  \t\t\t\ttest.pushFailure(hookName + \" failed on \" + test.testName + \": \" + (error.message || error), extractStacktrace(error, 0));\n  \t\t\t}\n\n  \t\t\tfunction callHook() {\n  \t\t\t\tpromise = hook.call(test.testEnvironment, test.assert);\n  \t\t\t\ttest.resolvePromise(promise, hookName);\n  \t\t\t}\n  \t\t};\n  \t},\n\n  \t// Currently only used for module level hooks, can be used to add global level ones\n  \thooks: function hooks(handler) {\n  \t\tvar hooks = [];\n\n  \t\tfunction processHooks(test, module) {\n  \t\t\tif (module.parentModule) {\n  \t\t\t\tprocessHooks(test, module.parentModule);\n  \t\t\t}\n  \t\t\tif (module.testEnvironment && objectType(module.testEnvironment[handler]) === \"function\") {\n  \t\t\t\thooks.push(test.queueHook(module.testEnvironment[handler], handler, module));\n  \t\t\t}\n  \t\t}\n\n  \t\t// Hooks are ignored on skipped tests\n  \t\tif (!this.skip) {\n  \t\t\tprocessHooks(this, this.module);\n  \t\t}\n  \t\treturn hooks;\n  \t},\n\n  \tfinish: function finish() {\n  \t\tconfig.current = this;\n  \t\tif (config.requireExpects && this.expected === null) {\n  \t\t\tthis.pushFailure(\"Expected number of assertions to be defined, but expect() was \" + \"not called.\", this.stack);\n  \t\t} else if (this.expected !== null && this.expected !== this.assertions.length) {\n  \t\t\tthis.pushFailure(\"Expected \" + this.expected + \" assertions, but \" + this.assertions.length + \" were run\", this.stack);\n  \t\t} else if (this.expected === null && !this.assertions.length) {\n  \t\t\tthis.pushFailure(\"Expected at least one assertion, but none were run - call \" + \"expect(0) to accept zero assertions.\", this.stack);\n  \t\t}\n\n  \t\tvar i,\n  \t\t    module = this.module,\n  \t\t    moduleName = module.name,\n  \t\t    testName = this.testName,\n  \t\t    skipped = !!this.skip,\n  \t\t    todo = !!this.todo,\n  \t\t    bad = 0,\n  \t\t    storage = config.storage;\n\n  \t\tthis.runtime = now() - this.started;\n\n  \t\tconfig.stats.all += this.assertions.length;\n  \t\tmodule.stats.all += this.assertions.length;\n\n  \t\tfor (i = 0; i < this.assertions.length; i++) {\n  \t\t\tif (!this.assertions[i].result) {\n  \t\t\t\tbad++;\n  \t\t\t\tconfig.stats.bad++;\n  \t\t\t\tmodule.stats.bad++;\n  \t\t\t}\n  \t\t}\n\n  \t\tnotifyTestsRan(module);\n\n  \t\t// Store result when possible\n  \t\tif (storage) {\n  \t\t\tif (bad) {\n  \t\t\t\tstorage.setItem(\"qunit-test-\" + moduleName + \"-\" + testName, bad);\n  \t\t\t} else {\n  \t\t\t\tstorage.removeItem(\"qunit-test-\" + moduleName + \"-\" + testName);\n  \t\t\t}\n  \t\t}\n\n  \t\temit(\"testEnd\", this.testReport.end(true));\n  \t\trunLoggingCallbacks(\"testDone\", {\n  \t\t\tname: testName,\n  \t\t\tmodule: moduleName,\n  \t\t\tskipped: skipped,\n  \t\t\ttodo: todo,\n  \t\t\tfailed: bad,\n  \t\t\tpassed: this.assertions.length - bad,\n  \t\t\ttotal: this.assertions.length,\n  \t\t\truntime: skipped ? 0 : this.runtime,\n\n  \t\t\t// HTML Reporter use\n  \t\t\tassertions: this.assertions,\n  \t\t\ttestId: this.testId,\n\n  \t\t\t// Source of Test\n  \t\t\tsource: this.stack\n  \t\t});\n\n  \t\tif (module.testsRun === numberOfTests(module)) {\n  \t\t\temit(\"suiteEnd\", module.suiteReport.end(true));\n  \t\t\trunLoggingCallbacks(\"moduleDone\", {\n  \t\t\t\tname: module.name,\n  \t\t\t\ttests: module.tests,\n  \t\t\t\tfailed: module.stats.bad,\n  \t\t\t\tpassed: module.stats.all - module.stats.bad,\n  \t\t\t\ttotal: module.stats.all,\n  \t\t\t\truntime: now() - module.stats.started\n  \t\t\t});\n  \t\t}\n\n  \t\tconfig.current = undefined;\n  \t},\n\n  \tpreserveTestEnvironment: function preserveTestEnvironment() {\n  \t\tif (this.preserveEnvironment) {\n  \t\t\tthis.module.testEnvironment = this.testEnvironment;\n  \t\t\tthis.testEnvironment = extend({}, this.module.testEnvironment);\n  \t\t}\n  \t},\n\n  \tqueue: function queue() {\n  \t\tvar priority,\n  \t\t    previousFailCount,\n  \t\t    test = this;\n\n  \t\tif (!this.valid()) {\n  \t\t\treturn;\n  \t\t}\n\n  \t\tfunction run() {\n\n  \t\t\t// Each of these can by async\n  \t\t\tsynchronize([function () {\n  \t\t\t\ttest.before();\n  \t\t\t}, test.hooks(\"before\"), function () {\n  \t\t\t\ttest.preserveTestEnvironment();\n  \t\t\t}, test.hooks(\"beforeEach\"), function () {\n  \t\t\t\ttest.run();\n  \t\t\t}, test.hooks(\"afterEach\").reverse(), test.hooks(\"after\").reverse(), function () {\n  \t\t\t\ttest.after();\n  \t\t\t}, function () {\n  \t\t\t\ttest.finish();\n  \t\t\t}]);\n  \t\t}\n\n  \t\tpreviousFailCount = config.storage && +config.storage.getItem(\"qunit-test-\" + this.module.name + \"-\" + this.testName);\n\n  \t\t// Prioritize previously failed tests, detected from storage\n  \t\tpriority = config.reorder && previousFailCount;\n\n  \t\tthis.previousFailure = !!previousFailCount;\n\n  \t\treturn synchronize(run, priority, config.seed);\n  \t},\n\n  \tpushResult: function pushResult(resultInfo) {\n\n  \t\t// Destructure of resultInfo = { result, actual, expected, message, negative }\n  \t\tvar source,\n  \t\t    details = {\n  \t\t\tmodule: this.module.name,\n  \t\t\tname: this.testName,\n  \t\t\tresult: resultInfo.result,\n  \t\t\tmessage: resultInfo.message,\n  \t\t\tactual: resultInfo.actual,\n  \t\t\texpected: resultInfo.expected,\n  \t\t\ttestId: this.testId,\n  \t\t\tnegative: resultInfo.negative || false,\n  \t\t\truntime: now() - this.started,\n  \t\t\ttodo: !!this.todo\n  \t\t};\n\n  \t\tif (!resultInfo.result) {\n  \t\t\tsource = resultInfo.source || sourceFromStacktrace();\n\n  \t\t\tif (source) {\n  \t\t\t\tdetails.source = source;\n  \t\t\t}\n  \t\t}\n\n  \t\tthis.logAssertion(details);\n\n  \t\tthis.assertions.push({\n  \t\t\tresult: !!resultInfo.result,\n  \t\t\tmessage: resultInfo.message\n  \t\t});\n  \t},\n\n  \tpushFailure: function pushFailure(message, source, actual) {\n  \t\tif (!(this instanceof Test)) {\n  \t\t\tthrow new Error(\"pushFailure() assertion outside test context, was \" + sourceFromStacktrace(2));\n  \t\t}\n\n  \t\tthis.assert.pushResult({\n  \t\t\tresult: false,\n  \t\t\tmessage: message || \"error\",\n  \t\t\tactual: actual || null,\n  \t\t\texpected: null,\n  \t\t\tsource: source\n  \t\t});\n  \t},\n\n  \t/**\n    * Log assertion details using both the old QUnit.log interface and\n    * QUnit.on( \"assertion\" ) interface.\n    *\n    * @private\n    */\n  \tlogAssertion: function logAssertion(details) {\n  \t\trunLoggingCallbacks(\"log\", details);\n\n  \t\tvar assertion = {\n  \t\t\tpassed: details.result,\n  \t\t\tactual: details.actual,\n  \t\t\texpected: details.expected,\n  \t\t\tmessage: details.message,\n  \t\t\tstack: details.source,\n  \t\t\ttodo: details.todo\n  \t\t};\n  \t\tthis.testReport.pushAssertion(assertion);\n  \t\temit(\"assertion\", assertion);\n  \t},\n\n\n  \tresolvePromise: function resolvePromise(promise, phase) {\n  \t\tvar then,\n  \t\t    resume,\n  \t\t    message,\n  \t\t    test = this;\n  \t\tif (promise != null) {\n  \t\t\tthen = promise.then;\n  \t\t\tif (objectType(then) === \"function\") {\n  \t\t\t\tresume = internalStop(test);\n  \t\t\t\tthen.call(promise, function () {\n  \t\t\t\t\tresume();\n  \t\t\t\t}, function (error) {\n  \t\t\t\t\tmessage = \"Promise rejected \" + (!phase ? \"during\" : phase.replace(/Each$/, \"\")) + \" \\\"\" + test.testName + \"\\\": \" + (error && error.message || error);\n  \t\t\t\t\ttest.pushFailure(message, extractStacktrace(error, 0));\n\n  \t\t\t\t\t// Else next test will carry the responsibility\n  \t\t\t\t\tsaveGlobal();\n\n  \t\t\t\t\t// Unblock\n  \t\t\t\t\tresume();\n  \t\t\t\t});\n  \t\t\t}\n  \t\t}\n  \t},\n\n  \tvalid: function valid() {\n  \t\tvar filter = config.filter,\n  \t\t    regexFilter = /^(!?)\\/([\\w\\W]*)\\/(i?$)/.exec(filter),\n  \t\t    module = config.module && config.module.toLowerCase(),\n  \t\t    fullName = this.module.name + \": \" + this.testName;\n\n  \t\tfunction moduleChainNameMatch(testModule) {\n  \t\t\tvar testModuleName = testModule.name ? testModule.name.toLowerCase() : null;\n  \t\t\tif (testModuleName === module) {\n  \t\t\t\treturn true;\n  \t\t\t} else if (testModule.parentModule) {\n  \t\t\t\treturn moduleChainNameMatch(testModule.parentModule);\n  \t\t\t} else {\n  \t\t\t\treturn false;\n  \t\t\t}\n  \t\t}\n\n  \t\tfunction moduleChainIdMatch(testModule) {\n  \t\t\treturn inArray(testModule.moduleId, config.moduleId) || testModule.parentModule && moduleChainIdMatch(testModule.parentModule);\n  \t\t}\n\n  \t\t// Internally-generated tests are always valid\n  \t\tif (this.callback && this.callback.validTest) {\n  \t\t\treturn true;\n  \t\t}\n\n  \t\tif (config.moduleId && config.moduleId.length > 0 && !moduleChainIdMatch(this.module)) {\n\n  \t\t\treturn false;\n  \t\t}\n\n  \t\tif (config.testId && config.testId.length > 0 && !inArray(this.testId, config.testId)) {\n\n  \t\t\treturn false;\n  \t\t}\n\n  \t\tif (module && !moduleChainNameMatch(this.module)) {\n  \t\t\treturn false;\n  \t\t}\n\n  \t\tif (!filter) {\n  \t\t\treturn true;\n  \t\t}\n\n  \t\treturn regexFilter ? this.regexFilter(!!regexFilter[1], regexFilter[2], regexFilter[3], fullName) : this.stringFilter(filter, fullName);\n  \t},\n\n  \tregexFilter: function regexFilter(exclude, pattern, flags, fullName) {\n  \t\tvar regex = new RegExp(pattern, flags);\n  \t\tvar match = regex.test(fullName);\n\n  \t\treturn match !== exclude;\n  \t},\n\n  \tstringFilter: function stringFilter(filter, fullName) {\n  \t\tfilter = filter.toLowerCase();\n  \t\tfullName = fullName.toLowerCase();\n\n  \t\tvar include = filter.charAt(0) !== \"!\";\n  \t\tif (!include) {\n  \t\t\tfilter = filter.slice(1);\n  \t\t}\n\n  \t\t// If the filter matches, we need to honour include\n  \t\tif (fullName.indexOf(filter) !== -1) {\n  \t\t\treturn include;\n  \t\t}\n\n  \t\t// Otherwise, do the opposite\n  \t\treturn !include;\n  \t}\n  };\n\n  function pushFailure() {\n  \tif (!config.current) {\n  \t\tthrow new Error(\"pushFailure() assertion outside test context, in \" + sourceFromStacktrace(2));\n  \t}\n\n  \t// Gets current test obj\n  \tvar currentTest = config.current;\n\n  \treturn currentTest.pushFailure.apply(currentTest, arguments);\n  }\n\n  // Based on Java's String.hashCode, a simple but not\n  // rigorously collision resistant hashing function\n  function generateHash(module, testName) {\n  \tvar hex,\n  \t    i = 0,\n  \t    hash = 0,\n  \t    str = module + \"\\x1C\" + testName,\n  \t    len = str.length;\n\n  \tfor (; i < len; i++) {\n  \t\thash = (hash << 5) - hash + str.charCodeAt(i);\n  \t\thash |= 0;\n  \t}\n\n  \t// Convert the possibly negative integer hash code into an 8 character hex string, which isn't\n  \t// strictly necessary but increases user understanding that the id is a SHA-like hash\n  \thex = (0x100000000 + hash).toString(16);\n  \tif (hex.length < 8) {\n  \t\thex = \"0000000\" + hex;\n  \t}\n\n  \treturn hex.slice(-8);\n  }\n\n  function synchronize(callback, priority, seed) {\n  \tvar last = !priority,\n  \t    index;\n\n  \tif (objectType(callback) === \"array\") {\n  \t\twhile (callback.length) {\n  \t\t\tsynchronize(callback.shift());\n  \t\t}\n  \t\treturn;\n  \t}\n\n  \tif (priority) {\n  \t\tconfig.queue.splice(priorityCount++, 0, callback);\n  \t} else if (seed) {\n  \t\tif (!unitSampler) {\n  \t\t\tunitSampler = unitSamplerGenerator(seed);\n  \t\t}\n\n  \t\t// Insert into a random position after all priority items\n  \t\tindex = Math.floor(unitSampler() * (config.queue.length - priorityCount + 1));\n  \t\tconfig.queue.splice(priorityCount + index, 0, callback);\n  \t} else {\n  \t\tconfig.queue.push(callback);\n  \t}\n\n  \tif (internalState.autorun && !config.blocking) {\n  \t\tprocess(last);\n  \t}\n  }\n\n  function unitSamplerGenerator(seed) {\n\n  \t// 32-bit xorshift, requires only a nonzero seed\n  \t// http://excamera.com/sphinx/article-xorshift.html\n  \tvar sample = parseInt(generateHash(seed), 16) || -1;\n  \treturn function () {\n  \t\tsample ^= sample << 13;\n  \t\tsample ^= sample >>> 17;\n  \t\tsample ^= sample << 5;\n\n  \t\t// ECMAScript has no unsigned number type\n  \t\tif (sample < 0) {\n  \t\t\tsample += 0x100000000;\n  \t\t}\n\n  \t\treturn sample / 0x100000000;\n  \t};\n  }\n\n  function saveGlobal() {\n  \tconfig.pollution = [];\n\n  \tif (config.noglobals) {\n  \t\tfor (var key in global$1) {\n  \t\t\tif (hasOwn.call(global$1, key)) {\n\n  \t\t\t\t// In Opera sometimes DOM element ids show up here, ignore them\n  \t\t\t\tif (/^qunit-test-output/.test(key)) {\n  \t\t\t\t\tcontinue;\n  \t\t\t\t}\n  \t\t\t\tconfig.pollution.push(key);\n  \t\t\t}\n  \t\t}\n  \t}\n  }\n\n  function checkPollution() {\n  \tvar newGlobals,\n  \t    deletedGlobals,\n  \t    old = config.pollution;\n\n  \tsaveGlobal();\n\n  \tnewGlobals = diff(config.pollution, old);\n  \tif (newGlobals.length > 0) {\n  \t\tpushFailure(\"Introduced global variable(s): \" + newGlobals.join(\", \"));\n  \t}\n\n  \tdeletedGlobals = diff(old, config.pollution);\n  \tif (deletedGlobals.length > 0) {\n  \t\tpushFailure(\"Deleted global variable(s): \" + deletedGlobals.join(\", \"));\n  \t}\n  }\n\n  // Will be exposed as QUnit.test\n  function test(testName, callback) {\n  \tif (focused) {\n  \t\treturn;\n  \t}\n\n  \tvar newTest = new Test({\n  \t\ttestName: testName,\n  \t\tcallback: callback\n  \t});\n\n  \tnewTest.queue();\n  }\n\n  function todo(testName, callback) {\n  \tif (focused) {\n  \t\treturn;\n  \t}\n\n  \tvar newTest = new Test({\n  \t\ttestName: testName,\n  \t\tcallback: callback,\n  \t\ttodo: true\n  \t});\n\n  \tnewTest.queue();\n  }\n\n  // Will be exposed as QUnit.skip\n  function skip(testName) {\n  \tif (focused) {\n  \t\treturn;\n  \t}\n\n  \tvar test = new Test({\n  \t\ttestName: testName,\n  \t\tskip: true\n  \t});\n\n  \ttest.queue();\n  }\n\n  // Will be exposed as QUnit.only\n  function only(testName, callback) {\n  \tif (focused) {\n  \t\treturn;\n  \t}\n\n  \tconfig.queue.length = 0;\n  \tfocused = true;\n\n  \tvar newTest = new Test({\n  \t\ttestName: testName,\n  \t\tcallback: callback\n  \t});\n\n  \tnewTest.queue();\n  }\n\n  // Put a hold on processing and return a function that will release it.\n  function internalStop(test) {\n  \tvar released = false;\n\n  \ttest.semaphore += 1;\n  \tconfig.blocking = true;\n\n  \t// Set a recovery timeout, if so configured.\n  \tif (config.testTimeout && defined.setTimeout) {\n  \t\tclearTimeout(config.timeout);\n  \t\tconfig.timeout = setTimeout(function () {\n  \t\t\tpushFailure(\"Test timed out\", sourceFromStacktrace(2));\n  \t\t\tinternalRecover(test);\n  \t\t}, config.testTimeout);\n  \t}\n\n  \treturn function resume() {\n  \t\tif (released) {\n  \t\t\treturn;\n  \t\t}\n\n  \t\treleased = true;\n  \t\ttest.semaphore -= 1;\n  \t\tinternalStart(test);\n  \t};\n  }\n\n  // Forcefully release all processing holds.\n  function internalRecover(test) {\n  \ttest.semaphore = 0;\n  \tinternalStart(test);\n  }\n\n  // Release a processing hold, scheduling a resumption attempt if no holds remain.\n  function internalStart(test) {\n\n  \t// If semaphore is non-numeric, throw error\n  \tif (isNaN(test.semaphore)) {\n  \t\ttest.semaphore = 0;\n\n  \t\tpushFailure(\"Invalid value on test.semaphore\", sourceFromStacktrace(2));\n  \t\treturn;\n  \t}\n\n  \t// Don't start until equal number of stop-calls\n  \tif (test.semaphore > 0) {\n  \t\treturn;\n  \t}\n\n  \t// Throw an Error if start is called more often than stop\n  \tif (test.semaphore < 0) {\n  \t\ttest.semaphore = 0;\n\n  \t\tpushFailure(\"Tried to restart test while already started (test's semaphore was 0 already)\", sourceFromStacktrace(2));\n  \t\treturn;\n  \t}\n\n  \t// Add a slight delay to allow more assertions etc.\n  \tif (defined.setTimeout) {\n  \t\tif (config.timeout) {\n  \t\t\tclearTimeout(config.timeout);\n  \t\t}\n  \t\tconfig.timeout = setTimeout(function () {\n  \t\t\tif (test.semaphore > 0) {\n  \t\t\t\treturn;\n  \t\t\t}\n\n  \t\t\tif (config.timeout) {\n  \t\t\t\tclearTimeout(config.timeout);\n  \t\t\t}\n\n  \t\t\tbegin();\n  \t\t}, 13);\n  \t} else {\n  \t\tbegin();\n  \t}\n  }\n\n  function numberOfTests(module) {\n  \tvar count = module.tests.length,\n  \t    modules = [].concat(toConsumableArray(module.childModules));\n\n  \t// Do a breadth-first traversal of the child modules\n  \twhile (modules.length) {\n  \t\tvar nextModule = modules.shift();\n  \t\tcount += nextModule.tests.length;\n  \t\tmodules.push.apply(modules, toConsumableArray(nextModule.childModules));\n  \t}\n\n  \treturn count;\n  }\n\n  function notifyTestsRan(module) {\n  \tmodule.testsRun++;\n  \twhile (module = module.parentModule) {\n  \t\tmodule.testsRun++;\n  \t}\n  }\n\n  /**\n   * Returns a function that proxies to the given method name on the globals\n   * console object. The proxy will also detect if the console doesn't exist and\n   * will appropriately no-op. This allows support for IE9, which doesn't have a\n   * console if the developer tools are not open.\n   */\n  function consoleProxy(method) {\n  \treturn function () {\n  \t\tif (console) {\n  \t\t\tconsole[method].apply(console, arguments);\n  \t\t}\n  \t};\n  }\n\n  var Logger = {\n  \twarn: consoleProxy(\"warn\")\n  };\n\n  var Assert = function () {\n  \tfunction Assert(testContext) {\n  \t\tclassCallCheck(this, Assert);\n\n  \t\tthis.test = testContext;\n  \t}\n\n  \t// Assert helpers\n\n  \t// Documents a \"step\", which is a string value, in a test as a passing assertion\n\n\n  \tcreateClass(Assert, [{\n  \t\tkey: \"step\",\n  \t\tvalue: function step(message) {\n  \t\t\tvar result = !!message;\n\n  \t\t\tthis.test.steps.push(message);\n\n  \t\t\treturn this.pushResult({\n  \t\t\t\tresult: result,\n  \t\t\t\tmessage: message || \"You must provide a message to assert.step\"\n  \t\t\t});\n  \t\t}\n\n  \t\t// Verifies the steps in a test match a given array of string values\n\n  \t}, {\n  \t\tkey: \"verifySteps\",\n  \t\tvalue: function verifySteps(steps, message) {\n  \t\t\tthis.deepEqual(this.test.steps, steps, message);\n  \t\t}\n\n  \t\t// Specify the number of expected assertions to guarantee that failed test\n  \t\t// (no assertions are run at all) don't slip through.\n\n  \t}, {\n  \t\tkey: \"expect\",\n  \t\tvalue: function expect(asserts) {\n  \t\t\tif (arguments.length === 1) {\n  \t\t\t\tthis.test.expected = asserts;\n  \t\t\t} else {\n  \t\t\t\treturn this.test.expected;\n  \t\t\t}\n  \t\t}\n\n  \t\t// Put a hold on processing and return a function that will release it a maximum of once.\n\n  \t}, {\n  \t\tkey: \"async\",\n  \t\tvalue: function async(count) {\n  \t\t\tvar test$$1 = this.test,\n  \t\t\t    popped = false,\n  \t\t\t    acceptCallCount = count;\n\n  \t\t\tif (typeof acceptCallCount === \"undefined\") {\n  \t\t\t\tacceptCallCount = 1;\n  \t\t\t}\n\n  \t\t\ttest$$1.usedAsync = true;\n  \t\t\tvar resume = internalStop(test$$1);\n\n  \t\t\treturn function done() {\n  \t\t\t\tif (popped) {\n  \t\t\t\t\ttest$$1.pushFailure(\"Too many calls to the `assert.async` callback\", sourceFromStacktrace(2));\n  \t\t\t\t\treturn;\n  \t\t\t\t}\n\n  \t\t\t\tacceptCallCount -= 1;\n  \t\t\t\tif (acceptCallCount > 0) {\n  \t\t\t\t\treturn;\n  \t\t\t\t}\n\n  \t\t\t\tpopped = true;\n  \t\t\t\tresume();\n  \t\t\t};\n  \t\t}\n\n  \t\t// Exports test.push() to the user API\n  \t\t// Alias of pushResult.\n\n  \t}, {\n  \t\tkey: \"push\",\n  \t\tvalue: function push(result, actual, expected, message, negative) {\n  \t\t\tLogger.warn(\"assert.push is deprecated and will be removed in QUnit 3.0.\" + \" Please use assert.pushResult instead (http://api.qunitjs.com/pushResult/).\");\n\n  \t\t\tvar currentAssert = this instanceof Assert ? this : config.current.assert;\n  \t\t\treturn currentAssert.pushResult({\n  \t\t\t\tresult: result,\n  \t\t\t\tactual: actual,\n  \t\t\t\texpected: expected,\n  \t\t\t\tmessage: message,\n  \t\t\t\tnegative: negative\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"pushResult\",\n  \t\tvalue: function pushResult(resultInfo) {\n\n  \t\t\t// Destructure of resultInfo = { result, actual, expected, message, negative }\n  \t\t\tvar assert = this,\n  \t\t\t    currentTest = assert instanceof Assert && assert.test || config.current;\n\n  \t\t\t// Backwards compatibility fix.\n  \t\t\t// Allows the direct use of global exported assertions and QUnit.assert.*\n  \t\t\t// Although, it's use is not recommended as it can leak assertions\n  \t\t\t// to other tests from async tests, because we only get a reference to the current test,\n  \t\t\t// not exactly the test where assertion were intended to be called.\n  \t\t\tif (!currentTest) {\n  \t\t\t\tthrow new Error(\"assertion outside test context, in \" + sourceFromStacktrace(2));\n  \t\t\t}\n\n  \t\t\tif (currentTest.usedAsync === true && currentTest.semaphore === 0) {\n  \t\t\t\tcurrentTest.pushFailure(\"Assertion after the final `assert.async` was resolved\", sourceFromStacktrace(2));\n\n  \t\t\t\t// Allow this assertion to continue running anyway...\n  \t\t\t}\n\n  \t\t\tif (!(assert instanceof Assert)) {\n  \t\t\t\tassert = currentTest.assert;\n  \t\t\t}\n\n  \t\t\treturn assert.test.pushResult(resultInfo);\n  \t\t}\n  \t}, {\n  \t\tkey: \"ok\",\n  \t\tvalue: function ok(result, message) {\n  \t\t\tif (!message) {\n  \t\t\t\tmessage = result ? \"okay\" : \"failed, expected argument to be truthy, was: \" + dump.parse(result);\n  \t\t\t}\n\n  \t\t\tthis.pushResult({\n  \t\t\t\tresult: !!result,\n  \t\t\t\tactual: result,\n  \t\t\t\texpected: true,\n  \t\t\t\tmessage: message\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"notOk\",\n  \t\tvalue: function notOk(result, message) {\n  \t\t\tif (!message) {\n  \t\t\t\tmessage = !result ? \"okay\" : \"failed, expected argument to be falsy, was: \" + dump.parse(result);\n  \t\t\t}\n\n  \t\t\tthis.pushResult({\n  \t\t\t\tresult: !result,\n  \t\t\t\tactual: result,\n  \t\t\t\texpected: false,\n  \t\t\t\tmessage: message\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"equal\",\n  \t\tvalue: function equal(actual, expected, message) {\n\n  \t\t\t// eslint-disable-next-line eqeqeq\n  \t\t\tvar result = expected == actual;\n\n  \t\t\tthis.pushResult({\n  \t\t\t\tresult: result,\n  \t\t\t\tactual: actual,\n  \t\t\t\texpected: expected,\n  \t\t\t\tmessage: message\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"notEqual\",\n  \t\tvalue: function notEqual(actual, expected, message) {\n\n  \t\t\t// eslint-disable-next-line eqeqeq\n  \t\t\tvar result = expected != actual;\n\n  \t\t\tthis.pushResult({\n  \t\t\t\tresult: result,\n  \t\t\t\tactual: actual,\n  \t\t\t\texpected: expected,\n  \t\t\t\tmessage: message,\n  \t\t\t\tnegative: true\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"propEqual\",\n  \t\tvalue: function propEqual(actual, expected, message) {\n  \t\t\tactual = objectValues(actual);\n  \t\t\texpected = objectValues(expected);\n\n  \t\t\tthis.pushResult({\n  \t\t\t\tresult: equiv(actual, expected),\n  \t\t\t\tactual: actual,\n  \t\t\t\texpected: expected,\n  \t\t\t\tmessage: message\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"notPropEqual\",\n  \t\tvalue: function notPropEqual(actual, expected, message) {\n  \t\t\tactual = objectValues(actual);\n  \t\t\texpected = objectValues(expected);\n\n  \t\t\tthis.pushResult({\n  \t\t\t\tresult: !equiv(actual, expected),\n  \t\t\t\tactual: actual,\n  \t\t\t\texpected: expected,\n  \t\t\t\tmessage: message,\n  \t\t\t\tnegative: true\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"deepEqual\",\n  \t\tvalue: function deepEqual(actual, expected, message) {\n  \t\t\tthis.pushResult({\n  \t\t\t\tresult: equiv(actual, expected),\n  \t\t\t\tactual: actual,\n  \t\t\t\texpected: expected,\n  \t\t\t\tmessage: message\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"notDeepEqual\",\n  \t\tvalue: function notDeepEqual(actual, expected, message) {\n  \t\t\tthis.pushResult({\n  \t\t\t\tresult: !equiv(actual, expected),\n  \t\t\t\tactual: actual,\n  \t\t\t\texpected: expected,\n  \t\t\t\tmessage: message,\n  \t\t\t\tnegative: true\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"strictEqual\",\n  \t\tvalue: function strictEqual(actual, expected, message) {\n  \t\t\tthis.pushResult({\n  \t\t\t\tresult: expected === actual,\n  \t\t\t\tactual: actual,\n  \t\t\t\texpected: expected,\n  \t\t\t\tmessage: message\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"notStrictEqual\",\n  \t\tvalue: function notStrictEqual(actual, expected, message) {\n  \t\t\tthis.pushResult({\n  \t\t\t\tresult: expected !== actual,\n  \t\t\t\tactual: actual,\n  \t\t\t\texpected: expected,\n  \t\t\t\tmessage: message,\n  \t\t\t\tnegative: true\n  \t\t\t});\n  \t\t}\n  \t}, {\n  \t\tkey: \"throws\",\n  \t\tvalue: function throws(block, expected, message) {\n  \t\t\tvar actual = void 0,\n  \t\t\t    result = false,\n  \t\t\t    currentTest = this instanceof Assert && this.test || config.current;\n\n  \t\t\t// 'expected' is optional unless doing string comparison\n  \t\t\tif (objectType(expected) === \"string\") {\n  \t\t\t\tif (message == null) {\n  \t\t\t\t\tmessage = expected;\n  \t\t\t\t\texpected = null;\n  \t\t\t\t} else {\n  \t\t\t\t\tthrow new Error(\"throws/raises does not accept a string value for the expected argument.\\n\" + \"Use a non-string object value (e.g. regExp) instead if it's necessary.\");\n  \t\t\t\t}\n  \t\t\t}\n\n  \t\t\tcurrentTest.ignoreGlobalErrors = true;\n  \t\t\ttry {\n  \t\t\t\tblock.call(currentTest.testEnvironment);\n  \t\t\t} catch (e) {\n  \t\t\t\tactual = e;\n  \t\t\t}\n  \t\t\tcurrentTest.ignoreGlobalErrors = false;\n\n  \t\t\tif (actual) {\n  \t\t\t\tvar expectedType = objectType(expected);\n\n  \t\t\t\t// We don't want to validate thrown error\n  \t\t\t\tif (!expected) {\n  \t\t\t\t\tresult = true;\n  \t\t\t\t\texpected = null;\n\n  \t\t\t\t\t// Expected is a regexp\n  \t\t\t\t} else if (expectedType === \"regexp\") {\n  \t\t\t\t\tresult = expected.test(errorString(actual));\n\n  \t\t\t\t\t// Expected is a constructor, maybe an Error constructor\n  \t\t\t\t} else if (expectedType === \"function\" && actual instanceof expected) {\n  \t\t\t\t\tresult = true;\n\n  \t\t\t\t\t// Expected is an Error object\n  \t\t\t\t} else if (expectedType === \"object\") {\n  \t\t\t\t\tresult = actual instanceof expected.constructor && actual.name === expected.name && actual.message === expected.message;\n\n  \t\t\t\t\t// Expected is a validation function which returns true if validation passed\n  \t\t\t\t} else if (expectedType === \"function\" && expected.call({}, actual) === true) {\n  \t\t\t\t\texpected = null;\n  \t\t\t\t\tresult = true;\n  \t\t\t\t}\n  \t\t\t}\n\n  \t\t\tcurrentTest.assert.pushResult({\n  \t\t\t\tresult: result,\n  \t\t\t\tactual: actual,\n  \t\t\t\texpected: expected,\n  \t\t\t\tmessage: message\n  \t\t\t});\n  \t\t}\n  \t}]);\n  \treturn Assert;\n  }();\n\n  // Provide an alternative to assert.throws(), for environments that consider throws a reserved word\n  // Known to us are: Closure Compiler, Narwhal\n  // eslint-disable-next-line dot-notation\n\n\n  Assert.prototype.raises = Assert.prototype[\"throws\"];\n\n  /**\n   * Converts an error into a simple string for comparisons.\n   *\n   * @param {Error} error\n   * @return {String}\n   */\n  function errorString(error) {\n  \tvar resultErrorString = error.toString();\n\n  \tif (resultErrorString.substring(0, 7) === \"[object\") {\n  \t\tvar name = error.name ? error.name.toString() : \"Error\";\n  \t\tvar message = error.message ? error.message.toString() : \"\";\n\n  \t\tif (name && message) {\n  \t\t\treturn name + \": \" + message;\n  \t\t} else if (name) {\n  \t\t\treturn name;\n  \t\t} else if (message) {\n  \t\t\treturn message;\n  \t\t} else {\n  \t\t\treturn \"Error\";\n  \t\t}\n  \t} else {\n  \t\treturn resultErrorString;\n  \t}\n  }\n\n  /* global module, exports, define */\n  function exportQUnit(QUnit) {\n\n  \tif (defined.document) {\n\n  \t\t// QUnit may be defined when it is preconfigured but then only QUnit and QUnit.config may be defined.\n  \t\tif (window.QUnit && window.QUnit.version) {\n  \t\t\tthrow new Error(\"QUnit has already been defined.\");\n  \t\t}\n\n  \t\twindow.QUnit = QUnit;\n  \t}\n\n  \t// For nodejs\n  \tif (typeof module !== \"undefined\" && module && module.exports) {\n  \t\tmodule.exports = QUnit;\n\n  \t\t// For consistency with CommonJS environments' exports\n  \t\tmodule.exports.QUnit = QUnit;\n  \t}\n\n  \t// For CommonJS with exports, but without module.exports, like Rhino\n  \tif (typeof exports !== \"undefined\" && exports) {\n  \t\texports.QUnit = QUnit;\n  \t}\n\n  \tif (typeof define === \"function\" && define.amd) {\n  \t\tdefine(function () {\n  \t\t\treturn QUnit;\n  \t\t});\n  \t\tQUnit.config.autostart = false;\n  \t}\n  }\n\n  var SuiteReport = function () {\n  \tfunction SuiteReport(name, parentSuite) {\n  \t\tclassCallCheck(this, SuiteReport);\n\n  \t\tthis.name = name;\n  \t\tthis.fullName = parentSuite ? parentSuite.fullName.concat(name) : [];\n\n  \t\tthis.tests = [];\n  \t\tthis.childSuites = [];\n\n  \t\tif (parentSuite) {\n  \t\t\tparentSuite.pushChildSuite(this);\n  \t\t}\n  \t}\n\n  \tcreateClass(SuiteReport, [{\n  \t\tkey: \"start\",\n  \t\tvalue: function start(recordTime) {\n  \t\t\tif (recordTime) {\n  \t\t\t\tthis._startTime = Date.now();\n  \t\t\t}\n\n  \t\t\treturn {\n  \t\t\t\tname: this.name,\n  \t\t\t\tfullName: this.fullName.slice(),\n  \t\t\t\ttests: this.tests.map(function (test) {\n  \t\t\t\t\treturn test.start();\n  \t\t\t\t}),\n  \t\t\t\tchildSuites: this.childSuites.map(function (suite) {\n  \t\t\t\t\treturn suite.start();\n  \t\t\t\t}),\n  \t\t\t\ttestCounts: {\n  \t\t\t\t\ttotal: this.getTestCounts().total\n  \t\t\t\t}\n  \t\t\t};\n  \t\t}\n  \t}, {\n  \t\tkey: \"end\",\n  \t\tvalue: function end(recordTime) {\n  \t\t\tif (recordTime) {\n  \t\t\t\tthis._endTime = Date.now();\n  \t\t\t}\n\n  \t\t\treturn {\n  \t\t\t\tname: this.name,\n  \t\t\t\tfullName: this.fullName.slice(),\n  \t\t\t\ttests: this.tests.map(function (test) {\n  \t\t\t\t\treturn test.end();\n  \t\t\t\t}),\n  \t\t\t\tchildSuites: this.childSuites.map(function (suite) {\n  \t\t\t\t\treturn suite.end();\n  \t\t\t\t}),\n  \t\t\t\ttestCounts: this.getTestCounts(),\n  \t\t\t\truntime: this.getRuntime(),\n  \t\t\t\tstatus: this.getStatus()\n  \t\t\t};\n  \t\t}\n  \t}, {\n  \t\tkey: \"pushChildSuite\",\n  \t\tvalue: function pushChildSuite(suite) {\n  \t\t\tthis.childSuites.push(suite);\n  \t\t}\n  \t}, {\n  \t\tkey: \"pushTest\",\n  \t\tvalue: function pushTest(test) {\n  \t\t\tthis.tests.push(test);\n  \t\t}\n  \t}, {\n  \t\tkey: \"getRuntime\",\n  \t\tvalue: function getRuntime() {\n  \t\t\treturn this._endTime - this._startTime;\n  \t\t}\n  \t}, {\n  \t\tkey: \"getTestCounts\",\n  \t\tvalue: function getTestCounts() {\n  \t\t\tvar counts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { passed: 0, failed: 0, skipped: 0, todo: 0, total: 0 };\n\n  \t\t\tcounts = this.tests.reduce(function (counts, test) {\n  \t\t\t\tcounts[test.getStatus()]++;\n  \t\t\t\tcounts.total++;\n  \t\t\t\treturn counts;\n  \t\t\t}, counts);\n\n  \t\t\treturn this.childSuites.reduce(function (counts, suite) {\n  \t\t\t\treturn suite.getTestCounts(counts);\n  \t\t\t}, counts);\n  \t\t}\n  \t}, {\n  \t\tkey: \"getStatus\",\n  \t\tvalue: function getStatus() {\n  \t\t\tvar _getTestCounts = this.getTestCounts(),\n  \t\t\t    total = _getTestCounts.total,\n  \t\t\t    failed = _getTestCounts.failed,\n  \t\t\t    skipped = _getTestCounts.skipped,\n  \t\t\t    todo = _getTestCounts.todo;\n\n  \t\t\tif (failed) {\n  \t\t\t\treturn \"failed\";\n  \t\t\t} else {\n  \t\t\t\tif (skipped === total) {\n  \t\t\t\t\treturn \"skipped\";\n  \t\t\t\t} else if (todo === total) {\n  \t\t\t\t\treturn \"todo\";\n  \t\t\t\t} else {\n  \t\t\t\t\treturn \"passed\";\n  \t\t\t\t}\n  \t\t\t}\n  \t\t}\n  \t}]);\n  \treturn SuiteReport;\n  }();\n\n  // Handle an unhandled exception. By convention, returns true if further\n  // error handling should be suppressed and false otherwise.\n  // In this case, we will only suppress further error handling if the\n  // \"ignoreGlobalErrors\" configuration option is enabled.\n  function onError(error) {\n  \tfor (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n  \t\targs[_key - 1] = arguments[_key];\n  \t}\n\n  \tif (config.current) {\n  \t\tif (config.current.ignoreGlobalErrors) {\n  \t\t\treturn true;\n  \t\t}\n  \t\tpushFailure.apply(undefined, [error.message, error.fileName + \":\" + error.lineNumber].concat(args));\n  \t} else {\n  \t\ttest(\"global failure\", extend(function () {\n  \t\t\tpushFailure.apply(undefined, [error.message, error.fileName + \":\" + error.lineNumber].concat(args));\n  \t\t}, { validTest: true }));\n  \t}\n\n  \treturn false;\n  }\n\n  var QUnit = {};\n  var globalSuite = new SuiteReport();\n\n  // The initial \"currentModule\" represents the global (or top-level) module that\n  // is not explicitly defined by the user, therefore we add the \"globalSuite\" to\n  // it since each module has a suiteReport associated with it.\n  config.currentModule.suiteReport = globalSuite;\n\n  var globalStartCalled = false;\n  var runStarted = false;\n\n  var internalState = {\n  \tautorun: false\n  };\n\n  // Figure out if we're running the tests from a server or not\n  QUnit.isLocal = !(defined.document && window.location.protocol !== \"file:\");\n\n  // Expose the current QUnit version\n  QUnit.version = \"2.2.0\";\n\n  extend(QUnit, {\n  \ton: on,\n\n  \t// Call on start of module test to prepend name to all tests\n  \tmodule: function module(name, testEnvironment, executeNow) {\n  \t\tvar module, moduleFns;\n  \t\tvar currentModule = config.currentModule;\n\n  \t\tif (arguments.length === 2) {\n  \t\t\tif (objectType(testEnvironment) === \"function\") {\n  \t\t\t\texecuteNow = testEnvironment;\n  \t\t\t\ttestEnvironment = undefined;\n  \t\t\t}\n  \t\t}\n\n  \t\tmodule = createModule();\n\n  \t\tmoduleFns = {\n  \t\t\tbefore: setHook(module, \"before\"),\n  \t\t\tbeforeEach: setHook(module, \"beforeEach\"),\n  \t\t\tafterEach: setHook(module, \"afterEach\"),\n  \t\t\tafter: setHook(module, \"after\")\n  \t\t};\n\n  \t\tif (objectType(executeNow) === \"function\") {\n  \t\t\tconfig.moduleStack.push(module);\n  \t\t\tsetCurrentModule(module);\n  \t\t\texecuteNow.call(module.testEnvironment, moduleFns);\n  \t\t\tconfig.moduleStack.pop();\n  \t\t\tmodule = module.parentModule || currentModule;\n  \t\t}\n\n  \t\tsetCurrentModule(module);\n\n  \t\tfunction createModule() {\n  \t\t\tvar parentModule = config.moduleStack.length ? config.moduleStack.slice(-1)[0] : null;\n  \t\t\tvar moduleName = parentModule !== null ? [parentModule.name, name].join(\" > \") : name;\n  \t\t\tvar parentSuite = parentModule ? parentModule.suiteReport : globalSuite;\n\n  \t\t\tvar module = {\n  \t\t\t\tname: moduleName,\n  \t\t\t\tparentModule: parentModule,\n  \t\t\t\ttests: [],\n  \t\t\t\tmoduleId: generateHash(moduleName),\n  \t\t\t\ttestsRun: 0,\n  \t\t\t\tchildModules: [],\n  \t\t\t\tsuiteReport: new SuiteReport(name, parentSuite)\n  \t\t\t};\n\n  \t\t\tvar env = {};\n  \t\t\tif (parentModule) {\n  \t\t\t\tparentModule.childModules.push(module);\n  \t\t\t\textend(env, parentModule.testEnvironment);\n  \t\t\t\tdelete env.beforeEach;\n  \t\t\t\tdelete env.afterEach;\n  \t\t\t}\n  \t\t\textend(env, testEnvironment);\n  \t\t\tmodule.testEnvironment = env;\n\n  \t\t\tconfig.modules.push(module);\n  \t\t\treturn module;\n  \t\t}\n\n  \t\tfunction setCurrentModule(module) {\n  \t\t\tconfig.currentModule = module;\n  \t\t}\n  \t},\n\n  \ttest: test,\n\n  \ttodo: todo,\n\n  \tskip: skip,\n\n  \tonly: only,\n\n  \tstart: function start(count) {\n  \t\tvar globalStartAlreadyCalled = globalStartCalled;\n\n  \t\tif (!config.current) {\n  \t\t\tglobalStartCalled = true;\n\n  \t\t\tif (runStarted) {\n  \t\t\t\tthrow new Error(\"Called start() while test already started running\");\n  \t\t\t} else if (globalStartAlreadyCalled || count > 1) {\n  \t\t\t\tthrow new Error(\"Called start() outside of a test context too many times\");\n  \t\t\t} else if (config.autostart) {\n  \t\t\t\tthrow new Error(\"Called start() outside of a test context when \" + \"QUnit.config.autostart was true\");\n  \t\t\t} else if (!config.pageLoaded) {\n\n  \t\t\t\t// The page isn't completely loaded yet, so we set autostart and then\n  \t\t\t\t// load if we're in Node or wait for the browser's load event.\n  \t\t\t\tconfig.autostart = true;\n\n  \t\t\t\t// Starts from Node even if .load was not previously called. We still return\n  \t\t\t\t// early otherwise we'll wind up \"beginning\" twice.\n  \t\t\t\tif (!defined.document) {\n  \t\t\t\t\tQUnit.load();\n  \t\t\t\t}\n\n  \t\t\t\treturn;\n  \t\t\t}\n  \t\t} else {\n  \t\t\tthrow new Error(\"QUnit.start cannot be called inside a test context.\");\n  \t\t}\n\n  \t\tscheduleBegin();\n  \t},\n\n  \tconfig: config,\n\n  \tis: is,\n\n  \tobjectType: objectType,\n\n  \textend: extend,\n\n  \tload: function load() {\n  \t\tconfig.pageLoaded = true;\n\n  \t\t// Initialize the configuration options\n  \t\textend(config, {\n  \t\t\tstats: { all: 0, bad: 0 },\n  \t\t\tstarted: 0,\n  \t\t\tupdateRate: 1000,\n  \t\t\tautostart: true,\n  \t\t\tfilter: \"\"\n  \t\t}, true);\n\n  \t\tif (!runStarted) {\n  \t\t\tconfig.blocking = false;\n\n  \t\t\tif (config.autostart) {\n  \t\t\t\tscheduleBegin();\n  \t\t\t}\n  \t\t}\n  \t},\n\n  \tstack: function stack(offset) {\n  \t\toffset = (offset || 0) + 2;\n  \t\treturn sourceFromStacktrace(offset);\n  \t},\n\n  \tonError: onError\n  });\n\n  QUnit.pushFailure = pushFailure;\n  QUnit.assert = Assert.prototype;\n  QUnit.equiv = equiv;\n  QUnit.dump = dump;\n\n  registerLoggingCallbacks(QUnit);\n\n  function scheduleBegin() {\n\n  \trunStarted = true;\n\n  \t// Add a slight delay to allow definition of more modules and tests.\n  \tif (defined.setTimeout) {\n  \t\tsetTimeout(function () {\n  \t\t\tbegin();\n  \t\t}, 13);\n  \t} else {\n  \t\tbegin();\n  \t}\n  }\n\n  function begin() {\n  \tvar i,\n  \t    l,\n  \t    modulesLog = [];\n\n  \t// If the test run hasn't officially begun yet\n  \tif (!config.started) {\n\n  \t\t// Record the time of the test run's beginning\n  \t\tconfig.started = now();\n\n  \t\t// Delete the loose unnamed module if unused.\n  \t\tif (config.modules[0].name === \"\" && config.modules[0].tests.length === 0) {\n  \t\t\tconfig.modules.shift();\n  \t\t}\n\n  \t\t// Avoid unnecessary information by not logging modules' test environments\n  \t\tfor (i = 0, l = config.modules.length; i < l; i++) {\n  \t\t\tmodulesLog.push({\n  \t\t\t\tname: config.modules[i].name,\n  \t\t\t\ttests: config.modules[i].tests\n  \t\t\t});\n  \t\t}\n\n  \t\t// The test run is officially beginning now\n  \t\temit(\"runStart\", globalSuite.start(true));\n  \t\trunLoggingCallbacks(\"begin\", {\n  \t\t\ttotalTests: Test.count,\n  \t\t\tmodules: modulesLog\n  \t\t});\n  \t}\n\n  \tconfig.blocking = false;\n  \tprocess(true);\n  }\n\n  function process(last) {\n  \tfunction next() {\n  \t\tprocess(last);\n  \t}\n  \tvar start = now();\n  \tconfig.depth = (config.depth || 0) + 1;\n\n  \twhile (config.queue.length && !config.blocking) {\n  \t\tif (!defined.setTimeout || config.updateRate <= 0 || now() - start < config.updateRate) {\n  \t\t\tif (config.current) {\n\n  \t\t\t\t// Reset async tracking for each phase of the Test lifecycle\n  \t\t\t\tconfig.current.usedAsync = false;\n  \t\t\t}\n  \t\t\tconfig.queue.shift()();\n  \t\t} else {\n  \t\t\tsetTimeout(next, 13);\n  \t\t\tbreak;\n  \t\t}\n  \t}\n  \tconfig.depth--;\n  \tif (last && !config.blocking && !config.queue.length && config.depth === 0) {\n  \t\tdone();\n  \t}\n  }\n\n  function done() {\n  \tvar runtime,\n  \t    passed,\n  \t    i,\n  \t    key,\n  \t    storage = config.storage;\n\n  \tinternalState.autorun = true;\n\n  \truntime = now() - config.started;\n  \tpassed = config.stats.all - config.stats.bad;\n\n  \temit(\"runEnd\", globalSuite.end(true));\n  \trunLoggingCallbacks(\"done\", {\n  \t\tfailed: config.stats.bad,\n  \t\tpassed: passed,\n  \t\ttotal: config.stats.all,\n  \t\truntime: runtime\n  \t});\n\n  \t// Clear own storage items if all tests passed\n  \tif (storage && config.stats.bad === 0) {\n  \t\tfor (i = storage.length - 1; i >= 0; i--) {\n  \t\t\tkey = storage.key(i);\n  \t\t\tif (key.indexOf(\"qunit-test-\") === 0) {\n  \t\t\t\tstorage.removeItem(key);\n  \t\t\t}\n  \t\t}\n  \t}\n  }\n\n  function setHook(module, hookName) {\n  \tif (module.testEnvironment === undefined) {\n  \t\tmodule.testEnvironment = {};\n  \t}\n\n  \treturn function (callback) {\n  \t\tmodule.testEnvironment[hookName] = callback;\n  \t};\n  }\n\n  exportQUnit(QUnit);\n\n  (function () {\n\n  \tif (typeof window === \"undefined\" || typeof document === \"undefined\") {\n  \t\treturn;\n  \t}\n\n  \tvar config = QUnit.config,\n  \t    hasOwn = Object.prototype.hasOwnProperty;\n\n  \t// Stores fixture HTML for resetting later\n  \tfunction storeFixture() {\n\n  \t\t// Avoid overwriting user-defined values\n  \t\tif (hasOwn.call(config, \"fixture\")) {\n  \t\t\treturn;\n  \t\t}\n\n  \t\tvar fixture = document.getElementById(\"qunit-fixture\");\n  \t\tif (fixture) {\n  \t\t\tconfig.fixture = fixture.innerHTML;\n  \t\t}\n  \t}\n\n  \tQUnit.begin(storeFixture);\n\n  \t// Resets the fixture DOM element if available.\n  \tfunction resetFixture() {\n  \t\tif (config.fixture == null) {\n  \t\t\treturn;\n  \t\t}\n\n  \t\tvar fixture = document.getElementById(\"qunit-fixture\");\n  \t\tif (fixture) {\n  \t\t\tfixture.innerHTML = config.fixture;\n  \t\t}\n  \t}\n\n  \tQUnit.testStart(resetFixture);\n  })();\n\n  (function () {\n\n  \t// Only interact with URLs via window.location\n  \tvar location = typeof window !== \"undefined\" && window.location;\n  \tif (!location) {\n  \t\treturn;\n  \t}\n\n  \tvar urlParams = getUrlParams();\n\n  \tQUnit.urlParams = urlParams;\n\n  \t// Match module/test by inclusion in an array\n  \tQUnit.config.moduleId = [].concat(urlParams.moduleId || []);\n  \tQUnit.config.testId = [].concat(urlParams.testId || []);\n\n  \t// Exact case-insensitive match of the module name\n  \tQUnit.config.module = urlParams.module;\n\n  \t// Regular expression or case-insenstive substring match against \"moduleName: testName\"\n  \tQUnit.config.filter = urlParams.filter;\n\n  \t// Test order randomization\n  \tif (urlParams.seed === true) {\n\n  \t\t// Generate a random seed if the option is specified without a value\n  \t\tQUnit.config.seed = Math.random().toString(36).slice(2);\n  \t} else if (urlParams.seed) {\n  \t\tQUnit.config.seed = urlParams.seed;\n  \t}\n\n  \t// Add URL-parameter-mapped config values with UI form rendering data\n  \tQUnit.config.urlConfig.push({\n  \t\tid: \"hidepassed\",\n  \t\tlabel: \"Hide passed tests\",\n  \t\ttooltip: \"Only show tests and assertions that fail. Stored as query-strings.\"\n  \t}, {\n  \t\tid: \"noglobals\",\n  \t\tlabel: \"Check for Globals\",\n  \t\ttooltip: \"Enabling this will test if any test introduces new properties on the \" + \"global object (`window` in Browsers). Stored as query-strings.\"\n  \t}, {\n  \t\tid: \"notrycatch\",\n  \t\tlabel: \"No try-catch\",\n  \t\ttooltip: \"Enabling this will run tests outside of a try-catch block. Makes debugging \" + \"exceptions in IE reasonable. Stored as query-strings.\"\n  \t});\n\n  \tQUnit.begin(function () {\n  \t\tvar i,\n  \t\t    option,\n  \t\t    urlConfig = QUnit.config.urlConfig;\n\n  \t\tfor (i = 0; i < urlConfig.length; i++) {\n\n  \t\t\t// Options can be either strings or objects with nonempty \"id\" properties\n  \t\t\toption = QUnit.config.urlConfig[i];\n  \t\t\tif (typeof option !== \"string\") {\n  \t\t\t\toption = option.id;\n  \t\t\t}\n\n  \t\t\tif (QUnit.config[option] === undefined) {\n  \t\t\t\tQUnit.config[option] = urlParams[option];\n  \t\t\t}\n  \t\t}\n  \t});\n\n  \tfunction getUrlParams() {\n  \t\tvar i, param, name, value;\n  \t\tvar urlParams = Object.create(null);\n  \t\tvar params = location.search.slice(1).split(\"&\");\n  \t\tvar length = params.length;\n\n  \t\tfor (i = 0; i < length; i++) {\n  \t\t\tif (params[i]) {\n  \t\t\t\tparam = params[i].split(\"=\");\n  \t\t\t\tname = decodeQueryParam(param[0]);\n\n  \t\t\t\t// Allow just a key to turn on a flag, e.g., test.html?noglobals\n  \t\t\t\tvalue = param.length === 1 || decodeQueryParam(param.slice(1).join(\"=\"));\n  \t\t\t\tif (name in urlParams) {\n  \t\t\t\t\turlParams[name] = [].concat(urlParams[name], value);\n  \t\t\t\t} else {\n  \t\t\t\t\turlParams[name] = value;\n  \t\t\t\t}\n  \t\t\t}\n  \t\t}\n\n  \t\treturn urlParams;\n  \t}\n\n  \tfunction decodeQueryParam(param) {\n  \t\treturn decodeURIComponent(param.replace(/\\+/g, \"%20\"));\n  \t}\n  })();\n\n  var stats = {\n  \tpassedTests: 0,\n  \tfailedTests: 0,\n  \tskippedTests: 0,\n  \ttodoTests: 0\n  };\n\n  // Escape text for attribute or text content.\n  function escapeText(s) {\n  \tif (!s) {\n  \t\treturn \"\";\n  \t}\n  \ts = s + \"\";\n\n  \t// Both single quotes and double quotes (for attributes)\n  \treturn s.replace(/['\"<>&]/g, function (s) {\n  \t\tswitch (s) {\n  \t\t\tcase \"'\":\n  \t\t\t\treturn \"&#039;\";\n  \t\t\tcase \"\\\"\":\n  \t\t\t\treturn \"&quot;\";\n  \t\t\tcase \"<\":\n  \t\t\t\treturn \"&lt;\";\n  \t\t\tcase \">\":\n  \t\t\t\treturn \"&gt;\";\n  \t\t\tcase \"&\":\n  \t\t\t\treturn \"&amp;\";\n  \t\t}\n  \t});\n  }\n\n  (function () {\n\n  \t// Don't load the HTML Reporter on non-browser environments\n  \tif (typeof window === \"undefined\" || !window.document) {\n  \t\treturn;\n  \t}\n\n  \tvar config = QUnit.config,\n  \t    document$$1 = window.document,\n  \t    collapseNext = false,\n  \t    hasOwn = Object.prototype.hasOwnProperty,\n  \t    unfilteredUrl = setUrl({ filter: undefined, module: undefined,\n  \t\tmoduleId: undefined, testId: undefined }),\n  \t    modulesList = [];\n\n  \tfunction addEvent(elem, type, fn) {\n  \t\telem.addEventListener(type, fn, false);\n  \t}\n\n  \tfunction removeEvent(elem, type, fn) {\n  \t\telem.removeEventListener(type, fn, false);\n  \t}\n\n  \tfunction addEvents(elems, type, fn) {\n  \t\tvar i = elems.length;\n  \t\twhile (i--) {\n  \t\t\taddEvent(elems[i], type, fn);\n  \t\t}\n  \t}\n\n  \tfunction hasClass(elem, name) {\n  \t\treturn (\" \" + elem.className + \" \").indexOf(\" \" + name + \" \") >= 0;\n  \t}\n\n  \tfunction addClass(elem, name) {\n  \t\tif (!hasClass(elem, name)) {\n  \t\t\telem.className += (elem.className ? \" \" : \"\") + name;\n  \t\t}\n  \t}\n\n  \tfunction toggleClass(elem, name, force) {\n  \t\tif (force || typeof force === \"undefined\" && !hasClass(elem, name)) {\n  \t\t\taddClass(elem, name);\n  \t\t} else {\n  \t\t\tremoveClass(elem, name);\n  \t\t}\n  \t}\n\n  \tfunction removeClass(elem, name) {\n  \t\tvar set = \" \" + elem.className + \" \";\n\n  \t\t// Class name may appear multiple times\n  \t\twhile (set.indexOf(\" \" + name + \" \") >= 0) {\n  \t\t\tset = set.replace(\" \" + name + \" \", \" \");\n  \t\t}\n\n  \t\t// Trim for prettiness\n  \t\telem.className = typeof set.trim === \"function\" ? set.trim() : set.replace(/^\\s+|\\s+$/g, \"\");\n  \t}\n\n  \tfunction id(name) {\n  \t\treturn document$$1.getElementById && document$$1.getElementById(name);\n  \t}\n\n  \tfunction abortTests() {\n  \t\tvar abortButton = id(\"qunit-abort-tests-button\");\n  \t\tif (abortButton) {\n  \t\t\tabortButton.disabled = true;\n  \t\t\tabortButton.innerHTML = \"Aborting...\";\n  \t\t}\n  \t\tQUnit.config.queue.length = 0;\n  \t\treturn false;\n  \t}\n\n  \tfunction interceptNavigation(ev) {\n  \t\tapplyUrlParams();\n\n  \t\tif (ev && ev.preventDefault) {\n  \t\t\tev.preventDefault();\n  \t\t}\n\n  \t\treturn false;\n  \t}\n\n  \tfunction getUrlConfigHtml() {\n  \t\tvar i,\n  \t\t    j,\n  \t\t    val,\n  \t\t    escaped,\n  \t\t    escapedTooltip,\n  \t\t    selection = false,\n  \t\t    urlConfig = config.urlConfig,\n  \t\t    urlConfigHtml = \"\";\n\n  \t\tfor (i = 0; i < urlConfig.length; i++) {\n\n  \t\t\t// Options can be either strings or objects with nonempty \"id\" properties\n  \t\t\tval = config.urlConfig[i];\n  \t\t\tif (typeof val === \"string\") {\n  \t\t\t\tval = {\n  \t\t\t\t\tid: val,\n  \t\t\t\t\tlabel: val\n  \t\t\t\t};\n  \t\t\t}\n\n  \t\t\tescaped = escapeText(val.id);\n  \t\t\tescapedTooltip = escapeText(val.tooltip);\n\n  \t\t\tif (!val.value || typeof val.value === \"string\") {\n  \t\t\t\turlConfigHtml += \"<label for='qunit-urlconfig-\" + escaped + \"' title='\" + escapedTooltip + \"'><input id='qunit-urlconfig-\" + escaped + \"' name='\" + escaped + \"' type='checkbox'\" + (val.value ? \" value='\" + escapeText(val.value) + \"'\" : \"\") + (config[val.id] ? \" checked='checked'\" : \"\") + \" title='\" + escapedTooltip + \"' />\" + escapeText(val.label) + \"</label>\";\n  \t\t\t} else {\n  \t\t\t\turlConfigHtml += \"<label for='qunit-urlconfig-\" + escaped + \"' title='\" + escapedTooltip + \"'>\" + val.label + \": </label><select id='qunit-urlconfig-\" + escaped + \"' name='\" + escaped + \"' title='\" + escapedTooltip + \"'><option></option>\";\n\n  \t\t\t\tif (QUnit.is(\"array\", val.value)) {\n  \t\t\t\t\tfor (j = 0; j < val.value.length; j++) {\n  \t\t\t\t\t\tescaped = escapeText(val.value[j]);\n  \t\t\t\t\t\turlConfigHtml += \"<option value='\" + escaped + \"'\" + (config[val.id] === val.value[j] ? (selection = true) && \" selected='selected'\" : \"\") + \">\" + escaped + \"</option>\";\n  \t\t\t\t\t}\n  \t\t\t\t} else {\n  \t\t\t\t\tfor (j in val.value) {\n  \t\t\t\t\t\tif (hasOwn.call(val.value, j)) {\n  \t\t\t\t\t\t\turlConfigHtml += \"<option value='\" + escapeText(j) + \"'\" + (config[val.id] === j ? (selection = true) && \" selected='selected'\" : \"\") + \">\" + escapeText(val.value[j]) + \"</option>\";\n  \t\t\t\t\t\t}\n  \t\t\t\t\t}\n  \t\t\t\t}\n  \t\t\t\tif (config[val.id] && !selection) {\n  \t\t\t\t\tescaped = escapeText(config[val.id]);\n  \t\t\t\t\turlConfigHtml += \"<option value='\" + escaped + \"' selected='selected' disabled='disabled'>\" + escaped + \"</option>\";\n  \t\t\t\t}\n  \t\t\t\turlConfigHtml += \"</select>\";\n  \t\t\t}\n  \t\t}\n\n  \t\treturn urlConfigHtml;\n  \t}\n\n  \t// Handle \"click\" events on toolbar checkboxes and \"change\" for select menus.\n  \t// Updates the URL with the new state of `config.urlConfig` values.\n  \tfunction toolbarChanged() {\n  \t\tvar updatedUrl,\n  \t\t    value,\n  \t\t    tests,\n  \t\t    field = this,\n  \t\t    params = {};\n\n  \t\t// Detect if field is a select menu or a checkbox\n  \t\tif (\"selectedIndex\" in field) {\n  \t\t\tvalue = field.options[field.selectedIndex].value || undefined;\n  \t\t} else {\n  \t\t\tvalue = field.checked ? field.defaultValue || true : undefined;\n  \t\t}\n\n  \t\tparams[field.name] = value;\n  \t\tupdatedUrl = setUrl(params);\n\n  \t\t// Check if we can apply the change without a page refresh\n  \t\tif (\"hidepassed\" === field.name && \"replaceState\" in window.history) {\n  \t\t\tQUnit.urlParams[field.name] = value;\n  \t\t\tconfig[field.name] = value || false;\n  \t\t\ttests = id(\"qunit-tests\");\n  \t\t\tif (tests) {\n  \t\t\t\ttoggleClass(tests, \"hidepass\", value || false);\n  \t\t\t}\n  \t\t\twindow.history.replaceState(null, \"\", updatedUrl);\n  \t\t} else {\n  \t\t\twindow.location = updatedUrl;\n  \t\t}\n  \t}\n\n  \tfunction setUrl(params) {\n  \t\tvar key,\n  \t\t    arrValue,\n  \t\t    i,\n  \t\t    querystring = \"?\",\n  \t\t    location = window.location;\n\n  \t\tparams = QUnit.extend(QUnit.extend({}, QUnit.urlParams), params);\n\n  \t\tfor (key in params) {\n\n  \t\t\t// Skip inherited or undefined properties\n  \t\t\tif (hasOwn.call(params, key) && params[key] !== undefined) {\n\n  \t\t\t\t// Output a parameter for each value of this key (but usually just one)\n  \t\t\t\tarrValue = [].concat(params[key]);\n  \t\t\t\tfor (i = 0; i < arrValue.length; i++) {\n  \t\t\t\t\tquerystring += encodeURIComponent(key);\n  \t\t\t\t\tif (arrValue[i] !== true) {\n  \t\t\t\t\t\tquerystring += \"=\" + encodeURIComponent(arrValue[i]);\n  \t\t\t\t\t}\n  \t\t\t\t\tquerystring += \"&\";\n  \t\t\t\t}\n  \t\t\t}\n  \t\t}\n  \t\treturn location.protocol + \"//\" + location.host + location.pathname + querystring.slice(0, -1);\n  \t}\n\n  \tfunction applyUrlParams() {\n  \t\tvar i,\n  \t\t    selectedModules = [],\n  \t\t    modulesList = id(\"qunit-modulefilter-dropdown-list\").getElementsByTagName(\"input\"),\n  \t\t    filter = id(\"qunit-filter-input\").value;\n\n  \t\tfor (i = 0; i < modulesList.length; i++) {\n  \t\t\tif (modulesList[i].checked) {\n  \t\t\t\tselectedModules.push(modulesList[i].value);\n  \t\t\t}\n  \t\t}\n\n  \t\twindow.location = setUrl({\n  \t\t\tfilter: filter === \"\" ? undefined : filter,\n  \t\t\tmoduleId: selectedModules.length === 0 ? undefined : selectedModules,\n\n  \t\t\t// Remove module and testId filter\n  \t\t\tmodule: undefined,\n  \t\t\ttestId: undefined\n  \t\t});\n  \t}\n\n  \tfunction toolbarUrlConfigContainer() {\n  \t\tvar urlConfigContainer = document$$1.createElement(\"span\");\n\n  \t\turlConfigContainer.innerHTML = getUrlConfigHtml();\n  \t\taddClass(urlConfigContainer, \"qunit-url-config\");\n\n  \t\taddEvents(urlConfigContainer.getElementsByTagName(\"input\"), \"change\", toolbarChanged);\n  \t\taddEvents(urlConfigContainer.getElementsByTagName(\"select\"), \"change\", toolbarChanged);\n\n  \t\treturn urlConfigContainer;\n  \t}\n\n  \tfunction abortTestsButton() {\n  \t\tvar button = document$$1.createElement(\"button\");\n  \t\tbutton.id = \"qunit-abort-tests-button\";\n  \t\tbutton.innerHTML = \"Abort\";\n  \t\taddEvent(button, \"click\", abortTests);\n  \t\treturn button;\n  \t}\n\n  \tfunction toolbarLooseFilter() {\n  \t\tvar filter = document$$1.createElement(\"form\"),\n  \t\t    label = document$$1.createElement(\"label\"),\n  \t\t    input = document$$1.createElement(\"input\"),\n  \t\t    button = document$$1.createElement(\"button\");\n\n  \t\taddClass(filter, \"qunit-filter\");\n\n  \t\tlabel.innerHTML = \"Filter: \";\n\n  \t\tinput.type = \"text\";\n  \t\tinput.value = config.filter || \"\";\n  \t\tinput.name = \"filter\";\n  \t\tinput.id = \"qunit-filter-input\";\n\n  \t\tbutton.innerHTML = \"Go\";\n\n  \t\tlabel.appendChild(input);\n\n  \t\tfilter.appendChild(label);\n  \t\tfilter.appendChild(document$$1.createTextNode(\" \"));\n  \t\tfilter.appendChild(button);\n  \t\taddEvent(filter, \"submit\", interceptNavigation);\n\n  \t\treturn filter;\n  \t}\n\n  \tfunction moduleListHtml() {\n  \t\tvar i,\n  \t\t    checked,\n  \t\t    html = \"\";\n\n  \t\tfor (i = 0; i < config.modules.length; i++) {\n  \t\t\tif (config.modules[i].name !== \"\") {\n  \t\t\t\tchecked = config.moduleId.indexOf(config.modules[i].moduleId) > -1;\n  \t\t\t\thtml += \"<li><label class='clickable\" + (checked ? \" checked\" : \"\") + \"'><input type='checkbox' \" + \"value='\" + config.modules[i].moduleId + \"'\" + (checked ? \" checked='checked'\" : \"\") + \" />\" + escapeText(config.modules[i].name) + \"</label></li>\";\n  \t\t\t}\n  \t\t}\n\n  \t\treturn html;\n  \t}\n\n  \tfunction toolbarModuleFilter() {\n  \t\tvar allCheckbox,\n  \t\t    commit,\n  \t\t    reset,\n  \t\t    moduleFilter = document$$1.createElement(\"form\"),\n  \t\t    label = document$$1.createElement(\"label\"),\n  \t\t    moduleSearch = document$$1.createElement(\"input\"),\n  \t\t    dropDown = document$$1.createElement(\"div\"),\n  \t\t    actions = document$$1.createElement(\"span\"),\n  \t\t    dropDownList = document$$1.createElement(\"ul\"),\n  \t\t    dirty = false;\n\n  \t\tmoduleSearch.id = \"qunit-modulefilter-search\";\n  \t\taddEvent(moduleSearch, \"input\", searchInput);\n  \t\taddEvent(moduleSearch, \"input\", searchFocus);\n  \t\taddEvent(moduleSearch, \"focus\", searchFocus);\n  \t\taddEvent(moduleSearch, \"click\", searchFocus);\n\n  \t\tlabel.id = \"qunit-modulefilter-search-container\";\n  \t\tlabel.innerHTML = \"Module: \";\n  \t\tlabel.appendChild(moduleSearch);\n\n  \t\tactions.id = \"qunit-modulefilter-actions\";\n  \t\tactions.innerHTML = \"<button style='display:none'>Apply</button>\" + \"<button type='reset' style='display:none'>Reset</button>\" + \"<label class='clickable\" + (config.moduleId.length ? \"\" : \" checked\") + \"'><input type='checkbox'\" + (config.moduleId.length ? \"\" : \" checked='checked'\") + \">All modules</label>\";\n  \t\tallCheckbox = actions.lastChild.firstChild;\n  \t\tcommit = actions.firstChild;\n  \t\treset = commit.nextSibling;\n  \t\taddEvent(commit, \"click\", applyUrlParams);\n\n  \t\tdropDownList.id = \"qunit-modulefilter-dropdown-list\";\n  \t\tdropDownList.innerHTML = moduleListHtml();\n\n  \t\tdropDown.id = \"qunit-modulefilter-dropdown\";\n  \t\tdropDown.style.display = \"none\";\n  \t\tdropDown.appendChild(actions);\n  \t\tdropDown.appendChild(dropDownList);\n  \t\taddEvent(dropDown, \"change\", selectionChange);\n  \t\tselectionChange();\n\n  \t\tmoduleFilter.id = \"qunit-modulefilter\";\n  \t\tmoduleFilter.appendChild(label);\n  \t\tmoduleFilter.appendChild(dropDown);\n  \t\taddEvent(moduleFilter, \"submit\", interceptNavigation);\n  \t\taddEvent(moduleFilter, \"reset\", function () {\n\n  \t\t\t// Let the reset happen, then update styles\n  \t\t\twindow.setTimeout(selectionChange);\n  \t\t});\n\n  \t\t// Enables show/hide for the dropdown\n  \t\tfunction searchFocus() {\n  \t\t\tif (dropDown.style.display !== \"none\") {\n  \t\t\t\treturn;\n  \t\t\t}\n\n  \t\t\tdropDown.style.display = \"block\";\n  \t\t\taddEvent(document$$1, \"click\", hideHandler);\n  \t\t\taddEvent(document$$1, \"keydown\", hideHandler);\n\n  \t\t\t// Hide on Escape keydown or outside-container click\n  \t\t\tfunction hideHandler(e) {\n  \t\t\t\tvar inContainer = moduleFilter.contains(e.target);\n\n  \t\t\t\tif (e.keyCode === 27 || !inContainer) {\n  \t\t\t\t\tif (e.keyCode === 27 && inContainer) {\n  \t\t\t\t\t\tmoduleSearch.focus();\n  \t\t\t\t\t}\n  \t\t\t\t\tdropDown.style.display = \"none\";\n  \t\t\t\t\tremoveEvent(document$$1, \"click\", hideHandler);\n  \t\t\t\t\tremoveEvent(document$$1, \"keydown\", hideHandler);\n  \t\t\t\t\tmoduleSearch.value = \"\";\n  \t\t\t\t\tsearchInput();\n  \t\t\t\t}\n  \t\t\t}\n  \t\t}\n\n  \t\t// Processes module search box input\n  \t\tfunction searchInput() {\n  \t\t\tvar i,\n  \t\t\t    item,\n  \t\t\t    searchText = moduleSearch.value.toLowerCase(),\n  \t\t\t    listItems = dropDownList.children;\n\n  \t\t\tfor (i = 0; i < listItems.length; i++) {\n  \t\t\t\titem = listItems[i];\n  \t\t\t\tif (!searchText || item.textContent.toLowerCase().indexOf(searchText) > -1) {\n  \t\t\t\t\titem.style.display = \"\";\n  \t\t\t\t} else {\n  \t\t\t\t\titem.style.display = \"none\";\n  \t\t\t\t}\n  \t\t\t}\n  \t\t}\n\n  \t\t// Processes selection changes\n  \t\tfunction selectionChange(evt) {\n  \t\t\tvar i,\n  \t\t\t    item,\n  \t\t\t    checkbox = evt && evt.target || allCheckbox,\n  \t\t\t    modulesList = dropDownList.getElementsByTagName(\"input\"),\n  \t\t\t    selectedNames = [];\n\n  \t\t\ttoggleClass(checkbox.parentNode, \"checked\", checkbox.checked);\n\n  \t\t\tdirty = false;\n  \t\t\tif (checkbox.checked && checkbox !== allCheckbox) {\n  \t\t\t\tallCheckbox.checked = false;\n  \t\t\t\tremoveClass(allCheckbox.parentNode, \"checked\");\n  \t\t\t}\n  \t\t\tfor (i = 0; i < modulesList.length; i++) {\n  \t\t\t\titem = modulesList[i];\n  \t\t\t\tif (!evt) {\n  \t\t\t\t\ttoggleClass(item.parentNode, \"checked\", item.checked);\n  \t\t\t\t} else if (checkbox === allCheckbox && checkbox.checked) {\n  \t\t\t\t\titem.checked = false;\n  \t\t\t\t\tremoveClass(item.parentNode, \"checked\");\n  \t\t\t\t}\n  \t\t\t\tdirty = dirty || item.checked !== item.defaultChecked;\n  \t\t\t\tif (item.checked) {\n  \t\t\t\t\tselectedNames.push(item.parentNode.textContent);\n  \t\t\t\t}\n  \t\t\t}\n\n  \t\t\tcommit.style.display = reset.style.display = dirty ? \"\" : \"none\";\n  \t\t\tmoduleSearch.placeholder = selectedNames.join(\", \") || allCheckbox.parentNode.textContent;\n  \t\t\tmoduleSearch.title = \"Type to filter list. Current selection:\\n\" + (selectedNames.join(\"\\n\") || allCheckbox.parentNode.textContent);\n  \t\t}\n\n  \t\treturn moduleFilter;\n  \t}\n\n  \tfunction appendToolbar() {\n  \t\tvar toolbar = id(\"qunit-testrunner-toolbar\");\n\n  \t\tif (toolbar) {\n  \t\t\ttoolbar.appendChild(toolbarUrlConfigContainer());\n  \t\t\ttoolbar.appendChild(toolbarModuleFilter());\n  \t\t\ttoolbar.appendChild(toolbarLooseFilter());\n  \t\t\ttoolbar.appendChild(document$$1.createElement(\"div\")).className = \"clearfix\";\n  \t\t}\n  \t}\n\n  \tfunction appendHeader() {\n  \t\tvar header = id(\"qunit-header\");\n\n  \t\tif (header) {\n  \t\t\theader.innerHTML = \"<a href='\" + escapeText(unfilteredUrl) + \"'>\" + header.innerHTML + \"</a> \";\n  \t\t}\n  \t}\n\n  \tfunction appendBanner() {\n  \t\tvar banner = id(\"qunit-banner\");\n\n  \t\tif (banner) {\n  \t\t\tbanner.className = \"\";\n  \t\t}\n  \t}\n\n  \tfunction appendTestResults() {\n  \t\tvar tests = id(\"qunit-tests\"),\n  \t\t    result = id(\"qunit-testresult\"),\n  \t\t    controls;\n\n  \t\tif (result) {\n  \t\t\tresult.parentNode.removeChild(result);\n  \t\t}\n\n  \t\tif (tests) {\n  \t\t\ttests.innerHTML = \"\";\n  \t\t\tresult = document$$1.createElement(\"p\");\n  \t\t\tresult.id = \"qunit-testresult\";\n  \t\t\tresult.className = \"result\";\n  \t\t\ttests.parentNode.insertBefore(result, tests);\n  \t\t\tresult.innerHTML = \"<div id=\\\"qunit-testresult-display\\\">Running...<br />&#160;</div>\" + \"<div id=\\\"qunit-testresult-controls\\\"></div>\" + \"<div class=\\\"clearfix\\\"></div>\";\n  \t\t\tcontrols = id(\"qunit-testresult-controls\");\n  \t\t}\n\n  \t\tif (controls) {\n  \t\t\tcontrols.appendChild(abortTestsButton());\n  \t\t}\n  \t}\n\n  \tfunction appendFilteredTest() {\n  \t\tvar testId = QUnit.config.testId;\n  \t\tif (!testId || testId.length <= 0) {\n  \t\t\treturn \"\";\n  \t\t}\n  \t\treturn \"<div id='qunit-filteredTest'>Rerunning selected tests: \" + escapeText(testId.join(\", \")) + \" <a id='qunit-clearFilter' href='\" + escapeText(unfilteredUrl) + \"'>Run all tests</a></div>\";\n  \t}\n\n  \tfunction appendUserAgent() {\n  \t\tvar userAgent = id(\"qunit-userAgent\");\n\n  \t\tif (userAgent) {\n  \t\t\tuserAgent.innerHTML = \"\";\n  \t\t\tuserAgent.appendChild(document$$1.createTextNode(\"QUnit \" + QUnit.version + \"; \" + navigator.userAgent));\n  \t\t}\n  \t}\n\n  \tfunction appendInterface() {\n  \t\tvar qunit = id(\"qunit\");\n\n  \t\tif (qunit) {\n  \t\t\tqunit.innerHTML = \"<h1 id='qunit-header'>\" + escapeText(document$$1.title) + \"</h1>\" + \"<h2 id='qunit-banner'></h2>\" + \"<div id='qunit-testrunner-toolbar'></div>\" + appendFilteredTest() + \"<h2 id='qunit-userAgent'></h2>\" + \"<ol id='qunit-tests'></ol>\";\n  \t\t}\n\n  \t\tappendHeader();\n  \t\tappendBanner();\n  \t\tappendTestResults();\n  \t\tappendUserAgent();\n  \t\tappendToolbar();\n  \t}\n\n  \tfunction appendTestsList(modules) {\n  \t\tvar i, l, x, z, test, moduleObj;\n\n  \t\tfor (i = 0, l = modules.length; i < l; i++) {\n  \t\t\tmoduleObj = modules[i];\n\n  \t\t\tfor (x = 0, z = moduleObj.tests.length; x < z; x++) {\n  \t\t\t\ttest = moduleObj.tests[x];\n\n  \t\t\t\tappendTest(test.name, test.testId, moduleObj.name);\n  \t\t\t}\n  \t\t}\n  \t}\n\n  \tfunction appendTest(name, testId, moduleName) {\n  \t\tvar title,\n  \t\t    rerunTrigger,\n  \t\t    testBlock,\n  \t\t    assertList,\n  \t\t    tests = id(\"qunit-tests\");\n\n  \t\tif (!tests) {\n  \t\t\treturn;\n  \t\t}\n\n  \t\ttitle = document$$1.createElement(\"strong\");\n  \t\ttitle.innerHTML = getNameHtml(name, moduleName);\n\n  \t\trerunTrigger = document$$1.createElement(\"a\");\n  \t\trerunTrigger.innerHTML = \"Rerun\";\n  \t\trerunTrigger.href = setUrl({ testId: testId });\n\n  \t\ttestBlock = document$$1.createElement(\"li\");\n  \t\ttestBlock.appendChild(title);\n  \t\ttestBlock.appendChild(rerunTrigger);\n  \t\ttestBlock.id = \"qunit-test-output-\" + testId;\n\n  \t\tassertList = document$$1.createElement(\"ol\");\n  \t\tassertList.className = \"qunit-assert-list\";\n\n  \t\ttestBlock.appendChild(assertList);\n\n  \t\ttests.appendChild(testBlock);\n  \t}\n\n  \t// HTML Reporter initialization and load\n  \tQUnit.begin(function (details) {\n  \t\tvar i, moduleObj, tests;\n\n  \t\t// Sort modules by name for the picker\n  \t\tfor (i = 0; i < details.modules.length; i++) {\n  \t\t\tmoduleObj = details.modules[i];\n  \t\t\tif (moduleObj.name) {\n  \t\t\t\tmodulesList.push(moduleObj.name);\n  \t\t\t}\n  \t\t}\n  \t\tmodulesList.sort(function (a, b) {\n  \t\t\treturn a.localeCompare(b);\n  \t\t});\n\n  \t\t// Initialize QUnit elements\n  \t\tappendInterface();\n  \t\tappendTestsList(details.modules);\n  \t\ttests = id(\"qunit-tests\");\n  \t\tif (tests && config.hidepassed) {\n  \t\t\taddClass(tests, \"hidepass\");\n  \t\t}\n  \t});\n\n  \tQUnit.done(function (details) {\n  \t\tvar banner = id(\"qunit-banner\"),\n  \t\t    tests = id(\"qunit-tests\"),\n  \t\t    abortButton = id(\"qunit-abort-tests-button\"),\n  \t\t    totalTests = stats.passedTests + stats.skippedTests + stats.todoTests + stats.failedTests,\n  \t\t    html = [totalTests, \" tests completed in \", details.runtime, \" milliseconds, with \", stats.failedTests, \" failed, \", stats.skippedTests, \" skipped, and \", stats.todoTests, \" todo.<br />\", \"<span class='passed'>\", details.passed, \"</span> assertions of <span class='total'>\", details.total, \"</span> passed, <span class='failed'>\", details.failed, \"</span> failed.\"].join(\"\"),\n  \t\t    test,\n  \t\t    assertLi,\n  \t\t    assertList;\n\n  \t\t// Update remaing tests to aborted\n  \t\tif (abortButton && abortButton.disabled) {\n  \t\t\thtml = \"Tests aborted after \" + details.runtime + \" milliseconds.\";\n\n  \t\t\tfor (var i = 0; i < tests.children.length; i++) {\n  \t\t\t\ttest = tests.children[i];\n  \t\t\t\tif (test.className === \"\" || test.className === \"running\") {\n  \t\t\t\t\ttest.className = \"aborted\";\n  \t\t\t\t\tassertList = test.getElementsByTagName(\"ol\")[0];\n  \t\t\t\t\tassertLi = document$$1.createElement(\"li\");\n  \t\t\t\t\tassertLi.className = \"fail\";\n  \t\t\t\t\tassertLi.innerHTML = \"Test aborted.\";\n  \t\t\t\t\tassertList.appendChild(assertLi);\n  \t\t\t\t}\n  \t\t\t}\n  \t\t}\n\n  \t\tif (banner && (!abortButton || abortButton.disabled === false)) {\n  \t\t\tbanner.className = stats.failedTests ? \"qunit-fail\" : \"qunit-pass\";\n  \t\t}\n\n  \t\tif (abortButton) {\n  \t\t\tabortButton.parentNode.removeChild(abortButton);\n  \t\t}\n\n  \t\tif (tests) {\n  \t\t\tid(\"qunit-testresult-display\").innerHTML = html;\n  \t\t}\n\n  \t\tif (config.altertitle && document$$1.title) {\n\n  \t\t\t// Show ✖ for good, ✔ for bad suite result in title\n  \t\t\t// use escape sequences in case file gets loaded with non-utf-8-charset\n  \t\t\tdocument$$1.title = [stats.failedTests ? \"\\u2716\" : \"\\u2714\", document$$1.title.replace(/^[\\u2714\\u2716] /i, \"\")].join(\" \");\n  \t\t}\n\n  \t\t// Scroll back to top to show results\n  \t\tif (config.scrolltop && window.scrollTo) {\n  \t\t\twindow.scrollTo(0, 0);\n  \t\t}\n  \t});\n\n  \tfunction getNameHtml(name, module) {\n  \t\tvar nameHtml = \"\";\n\n  \t\tif (module) {\n  \t\t\tnameHtml = \"<span class='module-name'>\" + escapeText(module) + \"</span>: \";\n  \t\t}\n\n  \t\tnameHtml += \"<span class='test-name'>\" + escapeText(name) + \"</span>\";\n\n  \t\treturn nameHtml;\n  \t}\n\n  \tQUnit.testStart(function (details) {\n  \t\tvar running, testBlock, bad;\n\n  \t\ttestBlock = id(\"qunit-test-output-\" + details.testId);\n  \t\tif (testBlock) {\n  \t\t\ttestBlock.className = \"running\";\n  \t\t} else {\n\n  \t\t\t// Report later registered tests\n  \t\t\tappendTest(details.name, details.testId, details.module);\n  \t\t}\n\n  \t\trunning = id(\"qunit-testresult-display\");\n  \t\tif (running) {\n  \t\t\tbad = QUnit.config.reorder && details.previousFailure;\n\n  \t\t\trunning.innerHTML = (bad ? \"Rerunning previously failed test: <br />\" : \"Running: <br />\") + getNameHtml(details.name, details.module);\n  \t\t}\n  \t});\n\n  \tfunction stripHtml(string) {\n\n  \t\t// Strip tags, html entity and whitespaces\n  \t\treturn string.replace(/<\\/?[^>]+(>|$)/g, \"\").replace(/\\&quot;/g, \"\").replace(/\\s+/g, \"\");\n  \t}\n\n  \tQUnit.log(function (details) {\n  \t\tvar assertList,\n  \t\t    assertLi,\n  \t\t    message,\n  \t\t    expected,\n  \t\t    actual,\n  \t\t    diff,\n  \t\t    showDiff = false,\n  \t\t    testItem = id(\"qunit-test-output-\" + details.testId);\n\n  \t\tif (!testItem) {\n  \t\t\treturn;\n  \t\t}\n\n  \t\tmessage = escapeText(details.message) || (details.result ? \"okay\" : \"failed\");\n  \t\tmessage = \"<span class='test-message'>\" + message + \"</span>\";\n  \t\tmessage += \"<span class='runtime'>@ \" + details.runtime + \" ms</span>\";\n\n  \t\t// The pushFailure doesn't provide details.expected\n  \t\t// when it calls, it's implicit to also not show expected and diff stuff\n  \t\t// Also, we need to check details.expected existence, as it can exist and be undefined\n  \t\tif (!details.result && hasOwn.call(details, \"expected\")) {\n  \t\t\tif (details.negative) {\n  \t\t\t\texpected = \"NOT \" + QUnit.dump.parse(details.expected);\n  \t\t\t} else {\n  \t\t\t\texpected = QUnit.dump.parse(details.expected);\n  \t\t\t}\n\n  \t\t\tactual = QUnit.dump.parse(details.actual);\n  \t\t\tmessage += \"<table><tr class='test-expected'><th>Expected: </th><td><pre>\" + escapeText(expected) + \"</pre></td></tr>\";\n\n  \t\t\tif (actual !== expected) {\n\n  \t\t\t\tmessage += \"<tr class='test-actual'><th>Result: </th><td><pre>\" + escapeText(actual) + \"</pre></td></tr>\";\n\n  \t\t\t\t// Don't show diff if actual or expected are booleans\n  \t\t\t\tif (!/^(true|false)$/.test(actual) && !/^(true|false)$/.test(expected)) {\n  \t\t\t\t\tdiff = QUnit.diff(expected, actual);\n  \t\t\t\t\tshowDiff = stripHtml(diff).length !== stripHtml(expected).length + stripHtml(actual).length;\n  \t\t\t\t}\n\n  \t\t\t\t// Don't show diff if expected and actual are totally different\n  \t\t\t\tif (showDiff) {\n  \t\t\t\t\tmessage += \"<tr class='test-diff'><th>Diff: </th><td><pre>\" + diff + \"</pre></td></tr>\";\n  \t\t\t\t}\n  \t\t\t} else if (expected.indexOf(\"[object Array]\") !== -1 || expected.indexOf(\"[object Object]\") !== -1) {\n  \t\t\t\tmessage += \"<tr class='test-message'><th>Message: </th><td>\" + \"Diff suppressed as the depth of object is more than current max depth (\" + QUnit.config.maxDepth + \").<p>Hint: Use <code>QUnit.dump.maxDepth</code> to \" + \" run with a higher max depth or <a href='\" + escapeText(setUrl({ maxDepth: -1 })) + \"'>\" + \"Rerun</a> without max depth.</p></td></tr>\";\n  \t\t\t} else {\n  \t\t\t\tmessage += \"<tr class='test-message'><th>Message: </th><td>\" + \"Diff suppressed as the expected and actual results have an equivalent\" + \" serialization</td></tr>\";\n  \t\t\t}\n\n  \t\t\tif (details.source) {\n  \t\t\t\tmessage += \"<tr class='test-source'><th>Source: </th><td><pre>\" + escapeText(details.source) + \"</pre></td></tr>\";\n  \t\t\t}\n\n  \t\t\tmessage += \"</table>\";\n\n  \t\t\t// This occurs when pushFailure is set and we have an extracted stack trace\n  \t\t} else if (!details.result && details.source) {\n  \t\t\tmessage += \"<table>\" + \"<tr class='test-source'><th>Source: </th><td><pre>\" + escapeText(details.source) + \"</pre></td></tr>\" + \"</table>\";\n  \t\t}\n\n  \t\tassertList = testItem.getElementsByTagName(\"ol\")[0];\n\n  \t\tassertLi = document$$1.createElement(\"li\");\n  \t\tassertLi.className = details.result ? \"pass\" : \"fail\";\n  \t\tassertLi.innerHTML = message;\n  \t\tassertList.appendChild(assertLi);\n  \t});\n\n  \tQUnit.testDone(function (details) {\n  \t\tvar testTitle,\n  \t\t    time,\n  \t\t    testItem,\n  \t\t    assertList,\n  \t\t    good,\n  \t\t    bad,\n  \t\t    testCounts,\n  \t\t    skipped,\n  \t\t    sourceName,\n  \t\t    tests = id(\"qunit-tests\");\n\n  \t\tif (!tests) {\n  \t\t\treturn;\n  \t\t}\n\n  \t\ttestItem = id(\"qunit-test-output-\" + details.testId);\n\n  \t\tassertList = testItem.getElementsByTagName(\"ol\")[0];\n\n  \t\tgood = details.passed;\n  \t\tbad = details.failed;\n\n  \t\t// This test passed if it has no unexpected failed assertions\n  \t\tvar testPassed = details.failed > 0 ? details.todo : !details.todo;\n\n  \t\tif (testPassed) {\n\n  \t\t\t// Collapse the passing tests\n  \t\t\taddClass(assertList, \"qunit-collapsed\");\n  \t\t} else if (config.collapse) {\n  \t\t\tif (!collapseNext) {\n\n  \t\t\t\t// Skip collapsing the first failing test\n  \t\t\t\tcollapseNext = true;\n  \t\t\t} else {\n\n  \t\t\t\t// Collapse remaining tests\n  \t\t\t\taddClass(assertList, \"qunit-collapsed\");\n  \t\t\t}\n  \t\t}\n\n  \t\t// The testItem.firstChild is the test name\n  \t\ttestTitle = testItem.firstChild;\n\n  \t\ttestCounts = bad ? \"<b class='failed'>\" + bad + \"</b>, \" + \"<b class='passed'>\" + good + \"</b>, \" : \"\";\n\n  \t\ttestTitle.innerHTML += \" <b class='counts'>(\" + testCounts + details.assertions.length + \")</b>\";\n\n  \t\tif (details.skipped) {\n  \t\t\tstats.skippedTests++;\n\n  \t\t\ttestItem.className = \"skipped\";\n  \t\t\tskipped = document$$1.createElement(\"em\");\n  \t\t\tskipped.className = \"qunit-skipped-label\";\n  \t\t\tskipped.innerHTML = \"skipped\";\n  \t\t\ttestItem.insertBefore(skipped, testTitle);\n  \t\t} else {\n  \t\t\taddEvent(testTitle, \"click\", function () {\n  \t\t\t\ttoggleClass(assertList, \"qunit-collapsed\");\n  \t\t\t});\n\n  \t\t\ttestItem.className = testPassed ? \"pass\" : \"fail\";\n\n  \t\t\tif (details.todo) {\n  \t\t\t\tvar todoLabel = document$$1.createElement(\"em\");\n  \t\t\t\ttodoLabel.className = \"qunit-todo-label\";\n  \t\t\t\ttodoLabel.innerHTML = \"todo\";\n  \t\t\t\ttestItem.insertBefore(todoLabel, testTitle);\n  \t\t\t}\n\n  \t\t\ttime = document$$1.createElement(\"span\");\n  \t\t\ttime.className = \"runtime\";\n  \t\t\ttime.innerHTML = details.runtime + \" ms\";\n  \t\t\ttestItem.insertBefore(time, assertList);\n\n  \t\t\tif (!testPassed) {\n  \t\t\t\tstats.failedTests++;\n  \t\t\t} else if (details.todo) {\n  \t\t\t\tstats.todoTests++;\n  \t\t\t} else {\n  \t\t\t\tstats.passedTests++;\n  \t\t\t}\n  \t\t}\n\n  \t\t// Show the source of the test when showing assertions\n  \t\tif (details.source) {\n  \t\t\tsourceName = document$$1.createElement(\"p\");\n  \t\t\tsourceName.innerHTML = \"<strong>Source: </strong>\" + details.source;\n  \t\t\taddClass(sourceName, \"qunit-source\");\n  \t\t\tif (testPassed) {\n  \t\t\t\taddClass(sourceName, \"qunit-collapsed\");\n  \t\t\t}\n  \t\t\taddEvent(testTitle, \"click\", function () {\n  \t\t\t\ttoggleClass(sourceName, \"qunit-collapsed\");\n  \t\t\t});\n  \t\t\ttestItem.appendChild(sourceName);\n  \t\t}\n  \t});\n\n  \t// Avoid readyState issue with phantomjs\n  \t// Ref: #818\n  \tvar notPhantom = function (p) {\n  \t\treturn !(p && p.version && p.version.major > 0);\n  \t}(window.phantom);\n\n  \tif (notPhantom && document$$1.readyState === \"complete\") {\n  \t\tQUnit.load();\n  \t} else {\n  \t\taddEvent(window, \"load\", QUnit.load);\n  \t}\n\n  \t// Wrap window.onerror. We will call the original window.onerror to see if\n  \t// the existing handler fully handles the error; if not, we will call the\n  \t// QUnit.onError function.\n  \tvar originalWindowOnError = window.onerror;\n\n  \t// Cover uncaught exceptions\n  \t// Returning true will suppress the default browser handler,\n  \t// returning false will let it run.\n  \twindow.onerror = function (message, fileName, lineNumber) {\n  \t\tvar ret = false;\n  \t\tif (originalWindowOnError) {\n  \t\t\tfor (var _len = arguments.length, args = Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {\n  \t\t\t\targs[_key - 3] = arguments[_key];\n  \t\t\t}\n\n  \t\t\tret = originalWindowOnError.call.apply(originalWindowOnError, [this, message, fileName, lineNumber].concat(args));\n  \t\t}\n\n  \t\t// Treat return value as window.onerror itself does,\n  \t\t// Only do our handling if not suppressed.\n  \t\tif (ret !== true) {\n  \t\t\tvar error = {\n  \t\t\t\tmessage: message,\n  \t\t\t\tfileName: fileName,\n  \t\t\t\tlineNumber: lineNumber\n  \t\t\t};\n\n  \t\t\tret = QUnit.onError(error);\n  \t\t}\n\n  \t\treturn ret;\n  \t};\n  })();\n\n  /*\n   * This file is a modified version of google-diff-match-patch's JavaScript implementation\n   * (https://code.google.com/p/google-diff-match-patch/source/browse/trunk/javascript/diff_match_patch_uncompressed.js),\n   * modifications are licensed as more fully set forth in LICENSE.txt.\n   *\n   * The original source of google-diff-match-patch is attributable and licensed as follows:\n   *\n   * Copyright 2006 Google Inc.\n   * https://code.google.com/p/google-diff-match-patch/\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   * https://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   * More Info:\n   *  https://code.google.com/p/google-diff-match-patch/\n   *\n   * Usage: QUnit.diff(expected, actual)\n   *\n   */\n  QUnit.diff = function () {\n  \tfunction DiffMatchPatch() {}\n\n  \t//  DIFF FUNCTIONS\n\n  \t/**\n    * The data structure representing a diff is an array of tuples:\n    * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n    * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n    */\n  \tvar DIFF_DELETE = -1,\n  \t    DIFF_INSERT = 1,\n  \t    DIFF_EQUAL = 0;\n\n  \t/**\n    * Find the differences between two texts.  Simplifies the problem by stripping\n    * any common prefix or suffix off the texts before diffing.\n    * @param {string} text1 Old string to be diffed.\n    * @param {string} text2 New string to be diffed.\n    * @param {boolean=} optChecklines Optional speedup flag. If present and false,\n    *     then don't run a line-level diff first to identify the changed areas.\n    *     Defaults to true, which does a faster, slightly less optimal diff.\n    * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n    */\n  \tDiffMatchPatch.prototype.DiffMain = function (text1, text2, optChecklines) {\n  \t\tvar deadline, checklines, commonlength, commonprefix, commonsuffix, diffs;\n\n  \t\t// The diff must be complete in up to 1 second.\n  \t\tdeadline = new Date().getTime() + 1000;\n\n  \t\t// Check for null inputs.\n  \t\tif (text1 === null || text2 === null) {\n  \t\t\tthrow new Error(\"Null input. (DiffMain)\");\n  \t\t}\n\n  \t\t// Check for equality (speedup).\n  \t\tif (text1 === text2) {\n  \t\t\tif (text1) {\n  \t\t\t\treturn [[DIFF_EQUAL, text1]];\n  \t\t\t}\n  \t\t\treturn [];\n  \t\t}\n\n  \t\tif (typeof optChecklines === \"undefined\") {\n  \t\t\toptChecklines = true;\n  \t\t}\n\n  \t\tchecklines = optChecklines;\n\n  \t\t// Trim off common prefix (speedup).\n  \t\tcommonlength = this.diffCommonPrefix(text1, text2);\n  \t\tcommonprefix = text1.substring(0, commonlength);\n  \t\ttext1 = text1.substring(commonlength);\n  \t\ttext2 = text2.substring(commonlength);\n\n  \t\t// Trim off common suffix (speedup).\n  \t\tcommonlength = this.diffCommonSuffix(text1, text2);\n  \t\tcommonsuffix = text1.substring(text1.length - commonlength);\n  \t\ttext1 = text1.substring(0, text1.length - commonlength);\n  \t\ttext2 = text2.substring(0, text2.length - commonlength);\n\n  \t\t// Compute the diff on the middle block.\n  \t\tdiffs = this.diffCompute(text1, text2, checklines, deadline);\n\n  \t\t// Restore the prefix and suffix.\n  \t\tif (commonprefix) {\n  \t\t\tdiffs.unshift([DIFF_EQUAL, commonprefix]);\n  \t\t}\n  \t\tif (commonsuffix) {\n  \t\t\tdiffs.push([DIFF_EQUAL, commonsuffix]);\n  \t\t}\n  \t\tthis.diffCleanupMerge(diffs);\n  \t\treturn diffs;\n  \t};\n\n  \t/**\n    * Reduce the number of edits by eliminating operationally trivial equalities.\n    * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n    */\n  \tDiffMatchPatch.prototype.diffCleanupEfficiency = function (diffs) {\n  \t\tvar changes, equalities, equalitiesLength, lastequality, pointer, preIns, preDel, postIns, postDel;\n  \t\tchanges = false;\n  \t\tequalities = []; // Stack of indices where equalities are found.\n  \t\tequalitiesLength = 0; // Keeping our own length var is faster in JS.\n  \t\t/** @type {?string} */\n  \t\tlastequality = null;\n\n  \t\t// Always equal to diffs[equalities[equalitiesLength - 1]][1]\n  \t\tpointer = 0; // Index of current position.\n\n  \t\t// Is there an insertion operation before the last equality.\n  \t\tpreIns = false;\n\n  \t\t// Is there a deletion operation before the last equality.\n  \t\tpreDel = false;\n\n  \t\t// Is there an insertion operation after the last equality.\n  \t\tpostIns = false;\n\n  \t\t// Is there a deletion operation after the last equality.\n  \t\tpostDel = false;\n  \t\twhile (pointer < diffs.length) {\n\n  \t\t\t// Equality found.\n  \t\t\tif (diffs[pointer][0] === DIFF_EQUAL) {\n  \t\t\t\tif (diffs[pointer][1].length < 4 && (postIns || postDel)) {\n\n  \t\t\t\t\t// Candidate found.\n  \t\t\t\t\tequalities[equalitiesLength++] = pointer;\n  \t\t\t\t\tpreIns = postIns;\n  \t\t\t\t\tpreDel = postDel;\n  \t\t\t\t\tlastequality = diffs[pointer][1];\n  \t\t\t\t} else {\n\n  \t\t\t\t\t// Not a candidate, and can never become one.\n  \t\t\t\t\tequalitiesLength = 0;\n  \t\t\t\t\tlastequality = null;\n  \t\t\t\t}\n  \t\t\t\tpostIns = postDel = false;\n\n  \t\t\t\t// An insertion or deletion.\n  \t\t\t} else {\n\n  \t\t\t\tif (diffs[pointer][0] === DIFF_DELETE) {\n  \t\t\t\t\tpostDel = true;\n  \t\t\t\t} else {\n  \t\t\t\t\tpostIns = true;\n  \t\t\t\t}\n\n  \t\t\t\t/*\n       * Five types to be split:\n       * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>\n       * <ins>A</ins>X<ins>C</ins><del>D</del>\n       * <ins>A</ins><del>B</del>X<ins>C</ins>\n       * <ins>A</del>X<ins>C</ins><del>D</del>\n       * <ins>A</ins><del>B</del>X<del>C</del>\n       */\n  \t\t\t\tif (lastequality && (preIns && preDel && postIns && postDel || lastequality.length < 2 && preIns + preDel + postIns + postDel === 3)) {\n\n  \t\t\t\t\t// Duplicate record.\n  \t\t\t\t\tdiffs.splice(equalities[equalitiesLength - 1], 0, [DIFF_DELETE, lastequality]);\n\n  \t\t\t\t\t// Change second copy to insert.\n  \t\t\t\t\tdiffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n  \t\t\t\t\tequalitiesLength--; // Throw away the equality we just deleted;\n  \t\t\t\t\tlastequality = null;\n  \t\t\t\t\tif (preIns && preDel) {\n\n  \t\t\t\t\t\t// No changes made which could affect previous entry, keep going.\n  \t\t\t\t\t\tpostIns = postDel = true;\n  \t\t\t\t\t\tequalitiesLength = 0;\n  \t\t\t\t\t} else {\n  \t\t\t\t\t\tequalitiesLength--; // Throw away the previous equality.\n  \t\t\t\t\t\tpointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n  \t\t\t\t\t\tpostIns = postDel = false;\n  \t\t\t\t\t}\n  \t\t\t\t\tchanges = true;\n  \t\t\t\t}\n  \t\t\t}\n  \t\t\tpointer++;\n  \t\t}\n\n  \t\tif (changes) {\n  \t\t\tthis.diffCleanupMerge(diffs);\n  \t\t}\n  \t};\n\n  \t/**\n    * Convert a diff array into a pretty HTML report.\n    * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n    * @param {integer} string to be beautified.\n    * @return {string} HTML representation.\n    */\n  \tDiffMatchPatch.prototype.diffPrettyHtml = function (diffs) {\n  \t\tvar op,\n  \t\t    data,\n  \t\t    x,\n  \t\t    html = [];\n  \t\tfor (x = 0; x < diffs.length; x++) {\n  \t\t\top = diffs[x][0]; // Operation (insert, delete, equal)\n  \t\t\tdata = diffs[x][1]; // Text of change.\n  \t\t\tswitch (op) {\n  \t\t\t\tcase DIFF_INSERT:\n  \t\t\t\t\thtml[x] = \"<ins>\" + escapeText(data) + \"</ins>\";\n  \t\t\t\t\tbreak;\n  \t\t\t\tcase DIFF_DELETE:\n  \t\t\t\t\thtml[x] = \"<del>\" + escapeText(data) + \"</del>\";\n  \t\t\t\t\tbreak;\n  \t\t\t\tcase DIFF_EQUAL:\n  \t\t\t\t\thtml[x] = \"<span>\" + escapeText(data) + \"</span>\";\n  \t\t\t\t\tbreak;\n  \t\t\t}\n  \t\t}\n  \t\treturn html.join(\"\");\n  \t};\n\n  \t/**\n    * Determine the common prefix of two strings.\n    * @param {string} text1 First string.\n    * @param {string} text2 Second string.\n    * @return {number} The number of characters common to the start of each\n    *     string.\n    */\n  \tDiffMatchPatch.prototype.diffCommonPrefix = function (text1, text2) {\n  \t\tvar pointermid, pointermax, pointermin, pointerstart;\n\n  \t\t// Quick check for common null cases.\n  \t\tif (!text1 || !text2 || text1.charAt(0) !== text2.charAt(0)) {\n  \t\t\treturn 0;\n  \t\t}\n\n  \t\t// Binary search.\n  \t\t// Performance analysis: https://neil.fraser.name/news/2007/10/09/\n  \t\tpointermin = 0;\n  \t\tpointermax = Math.min(text1.length, text2.length);\n  \t\tpointermid = pointermax;\n  \t\tpointerstart = 0;\n  \t\twhile (pointermin < pointermid) {\n  \t\t\tif (text1.substring(pointerstart, pointermid) === text2.substring(pointerstart, pointermid)) {\n  \t\t\t\tpointermin = pointermid;\n  \t\t\t\tpointerstart = pointermin;\n  \t\t\t} else {\n  \t\t\t\tpointermax = pointermid;\n  \t\t\t}\n  \t\t\tpointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n  \t\t}\n  \t\treturn pointermid;\n  \t};\n\n  \t/**\n    * Determine the common suffix of two strings.\n    * @param {string} text1 First string.\n    * @param {string} text2 Second string.\n    * @return {number} The number of characters common to the end of each string.\n    */\n  \tDiffMatchPatch.prototype.diffCommonSuffix = function (text1, text2) {\n  \t\tvar pointermid, pointermax, pointermin, pointerend;\n\n  \t\t// Quick check for common null cases.\n  \t\tif (!text1 || !text2 || text1.charAt(text1.length - 1) !== text2.charAt(text2.length - 1)) {\n  \t\t\treturn 0;\n  \t\t}\n\n  \t\t// Binary search.\n  \t\t// Performance analysis: https://neil.fraser.name/news/2007/10/09/\n  \t\tpointermin = 0;\n  \t\tpointermax = Math.min(text1.length, text2.length);\n  \t\tpointermid = pointermax;\n  \t\tpointerend = 0;\n  \t\twhile (pointermin < pointermid) {\n  \t\t\tif (text1.substring(text1.length - pointermid, text1.length - pointerend) === text2.substring(text2.length - pointermid, text2.length - pointerend)) {\n  \t\t\t\tpointermin = pointermid;\n  \t\t\t\tpointerend = pointermin;\n  \t\t\t} else {\n  \t\t\t\tpointermax = pointermid;\n  \t\t\t}\n  \t\t\tpointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n  \t\t}\n  \t\treturn pointermid;\n  \t};\n\n  \t/**\n    * Find the differences between two texts.  Assumes that the texts do not\n    * have any common prefix or suffix.\n    * @param {string} text1 Old string to be diffed.\n    * @param {string} text2 New string to be diffed.\n    * @param {boolean} checklines Speedup flag.  If false, then don't run a\n    *     line-level diff first to identify the changed areas.\n    *     If true, then run a faster, slightly less optimal diff.\n    * @param {number} deadline Time when the diff should be complete by.\n    * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n    * @private\n    */\n  \tDiffMatchPatch.prototype.diffCompute = function (text1, text2, checklines, deadline) {\n  \t\tvar diffs, longtext, shorttext, i, hm, text1A, text2A, text1B, text2B, midCommon, diffsA, diffsB;\n\n  \t\tif (!text1) {\n\n  \t\t\t// Just add some text (speedup).\n  \t\t\treturn [[DIFF_INSERT, text2]];\n  \t\t}\n\n  \t\tif (!text2) {\n\n  \t\t\t// Just delete some text (speedup).\n  \t\t\treturn [[DIFF_DELETE, text1]];\n  \t\t}\n\n  \t\tlongtext = text1.length > text2.length ? text1 : text2;\n  \t\tshorttext = text1.length > text2.length ? text2 : text1;\n  \t\ti = longtext.indexOf(shorttext);\n  \t\tif (i !== -1) {\n\n  \t\t\t// Shorter text is inside the longer text (speedup).\n  \t\t\tdiffs = [[DIFF_INSERT, longtext.substring(0, i)], [DIFF_EQUAL, shorttext], [DIFF_INSERT, longtext.substring(i + shorttext.length)]];\n\n  \t\t\t// Swap insertions for deletions if diff is reversed.\n  \t\t\tif (text1.length > text2.length) {\n  \t\t\t\tdiffs[0][0] = diffs[2][0] = DIFF_DELETE;\n  \t\t\t}\n  \t\t\treturn diffs;\n  \t\t}\n\n  \t\tif (shorttext.length === 1) {\n\n  \t\t\t// Single character string.\n  \t\t\t// After the previous speedup, the character can't be an equality.\n  \t\t\treturn [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];\n  \t\t}\n\n  \t\t// Check to see if the problem can be split in two.\n  \t\thm = this.diffHalfMatch(text1, text2);\n  \t\tif (hm) {\n\n  \t\t\t// A half-match was found, sort out the return data.\n  \t\t\ttext1A = hm[0];\n  \t\t\ttext1B = hm[1];\n  \t\t\ttext2A = hm[2];\n  \t\t\ttext2B = hm[3];\n  \t\t\tmidCommon = hm[4];\n\n  \t\t\t// Send both pairs off for separate processing.\n  \t\t\tdiffsA = this.DiffMain(text1A, text2A, checklines, deadline);\n  \t\t\tdiffsB = this.DiffMain(text1B, text2B, checklines, deadline);\n\n  \t\t\t// Merge the results.\n  \t\t\treturn diffsA.concat([[DIFF_EQUAL, midCommon]], diffsB);\n  \t\t}\n\n  \t\tif (checklines && text1.length > 100 && text2.length > 100) {\n  \t\t\treturn this.diffLineMode(text1, text2, deadline);\n  \t\t}\n\n  \t\treturn this.diffBisect(text1, text2, deadline);\n  \t};\n\n  \t/**\n    * Do the two texts share a substring which is at least half the length of the\n    * longer text?\n    * This speedup can produce non-minimal diffs.\n    * @param {string} text1 First string.\n    * @param {string} text2 Second string.\n    * @return {Array.<string>} Five element Array, containing the prefix of\n    *     text1, the suffix of text1, the prefix of text2, the suffix of\n    *     text2 and the common middle.  Or null if there was no match.\n    * @private\n    */\n  \tDiffMatchPatch.prototype.diffHalfMatch = function (text1, text2) {\n  \t\tvar longtext, shorttext, dmp, text1A, text2B, text2A, text1B, midCommon, hm1, hm2, hm;\n\n  \t\tlongtext = text1.length > text2.length ? text1 : text2;\n  \t\tshorttext = text1.length > text2.length ? text2 : text1;\n  \t\tif (longtext.length < 4 || shorttext.length * 2 < longtext.length) {\n  \t\t\treturn null; // Pointless.\n  \t\t}\n  \t\tdmp = this; // 'this' becomes 'window' in a closure.\n\n  \t\t/**\n     * Does a substring of shorttext exist within longtext such that the substring\n     * is at least half the length of longtext?\n     * Closure, but does not reference any external variables.\n     * @param {string} longtext Longer string.\n     * @param {string} shorttext Shorter string.\n     * @param {number} i Start index of quarter length substring within longtext.\n     * @return {Array.<string>} Five element Array, containing the prefix of\n     *     longtext, the suffix of longtext, the prefix of shorttext, the suffix\n     *     of shorttext and the common middle.  Or null if there was no match.\n     * @private\n     */\n  \t\tfunction diffHalfMatchI(longtext, shorttext, i) {\n  \t\t\tvar seed, j, bestCommon, prefixLength, suffixLength, bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB;\n\n  \t\t\t// Start with a 1/4 length substring at position i as a seed.\n  \t\t\tseed = longtext.substring(i, i + Math.floor(longtext.length / 4));\n  \t\t\tj = -1;\n  \t\t\tbestCommon = \"\";\n  \t\t\twhile ((j = shorttext.indexOf(seed, j + 1)) !== -1) {\n  \t\t\t\tprefixLength = dmp.diffCommonPrefix(longtext.substring(i), shorttext.substring(j));\n  \t\t\t\tsuffixLength = dmp.diffCommonSuffix(longtext.substring(0, i), shorttext.substring(0, j));\n  \t\t\t\tif (bestCommon.length < suffixLength + prefixLength) {\n  \t\t\t\t\tbestCommon = shorttext.substring(j - suffixLength, j) + shorttext.substring(j, j + prefixLength);\n  \t\t\t\t\tbestLongtextA = longtext.substring(0, i - suffixLength);\n  \t\t\t\t\tbestLongtextB = longtext.substring(i + prefixLength);\n  \t\t\t\t\tbestShorttextA = shorttext.substring(0, j - suffixLength);\n  \t\t\t\t\tbestShorttextB = shorttext.substring(j + prefixLength);\n  \t\t\t\t}\n  \t\t\t}\n  \t\t\tif (bestCommon.length * 2 >= longtext.length) {\n  \t\t\t\treturn [bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB, bestCommon];\n  \t\t\t} else {\n  \t\t\t\treturn null;\n  \t\t\t}\n  \t\t}\n\n  \t\t// First check if the second quarter is the seed for a half-match.\n  \t\thm1 = diffHalfMatchI(longtext, shorttext, Math.ceil(longtext.length / 4));\n\n  \t\t// Check again based on the third quarter.\n  \t\thm2 = diffHalfMatchI(longtext, shorttext, Math.ceil(longtext.length / 2));\n  \t\tif (!hm1 && !hm2) {\n  \t\t\treturn null;\n  \t\t} else if (!hm2) {\n  \t\t\thm = hm1;\n  \t\t} else if (!hm1) {\n  \t\t\thm = hm2;\n  \t\t} else {\n\n  \t\t\t// Both matched.  Select the longest.\n  \t\t\thm = hm1[4].length > hm2[4].length ? hm1 : hm2;\n  \t\t}\n\n  \t\t// A half-match was found, sort out the return data.\n  \t\tif (text1.length > text2.length) {\n  \t\t\ttext1A = hm[0];\n  \t\t\ttext1B = hm[1];\n  \t\t\ttext2A = hm[2];\n  \t\t\ttext2B = hm[3];\n  \t\t} else {\n  \t\t\ttext2A = hm[0];\n  \t\t\ttext2B = hm[1];\n  \t\t\ttext1A = hm[2];\n  \t\t\ttext1B = hm[3];\n  \t\t}\n  \t\tmidCommon = hm[4];\n  \t\treturn [text1A, text1B, text2A, text2B, midCommon];\n  \t};\n\n  \t/**\n    * Do a quick line-level diff on both strings, then rediff the parts for\n    * greater accuracy.\n    * This speedup can produce non-minimal diffs.\n    * @param {string} text1 Old string to be diffed.\n    * @param {string} text2 New string to be diffed.\n    * @param {number} deadline Time when the diff should be complete by.\n    * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n    * @private\n    */\n  \tDiffMatchPatch.prototype.diffLineMode = function (text1, text2, deadline) {\n  \t\tvar a, diffs, linearray, pointer, countInsert, countDelete, textInsert, textDelete, j;\n\n  \t\t// Scan the text on a line-by-line basis first.\n  \t\ta = this.diffLinesToChars(text1, text2);\n  \t\ttext1 = a.chars1;\n  \t\ttext2 = a.chars2;\n  \t\tlinearray = a.lineArray;\n\n  \t\tdiffs = this.DiffMain(text1, text2, false, deadline);\n\n  \t\t// Convert the diff back to original text.\n  \t\tthis.diffCharsToLines(diffs, linearray);\n\n  \t\t// Eliminate freak matches (e.g. blank lines)\n  \t\tthis.diffCleanupSemantic(diffs);\n\n  \t\t// Rediff any replacement blocks, this time character-by-character.\n  \t\t// Add a dummy entry at the end.\n  \t\tdiffs.push([DIFF_EQUAL, \"\"]);\n  \t\tpointer = 0;\n  \t\tcountDelete = 0;\n  \t\tcountInsert = 0;\n  \t\ttextDelete = \"\";\n  \t\ttextInsert = \"\";\n  \t\twhile (pointer < diffs.length) {\n  \t\t\tswitch (diffs[pointer][0]) {\n  \t\t\t\tcase DIFF_INSERT:\n  \t\t\t\t\tcountInsert++;\n  \t\t\t\t\ttextInsert += diffs[pointer][1];\n  \t\t\t\t\tbreak;\n  \t\t\t\tcase DIFF_DELETE:\n  \t\t\t\t\tcountDelete++;\n  \t\t\t\t\ttextDelete += diffs[pointer][1];\n  \t\t\t\t\tbreak;\n  \t\t\t\tcase DIFF_EQUAL:\n\n  \t\t\t\t\t// Upon reaching an equality, check for prior redundancies.\n  \t\t\t\t\tif (countDelete >= 1 && countInsert >= 1) {\n\n  \t\t\t\t\t\t// Delete the offending records and add the merged ones.\n  \t\t\t\t\t\tdiffs.splice(pointer - countDelete - countInsert, countDelete + countInsert);\n  \t\t\t\t\t\tpointer = pointer - countDelete - countInsert;\n  \t\t\t\t\t\ta = this.DiffMain(textDelete, textInsert, false, deadline);\n  \t\t\t\t\t\tfor (j = a.length - 1; j >= 0; j--) {\n  \t\t\t\t\t\t\tdiffs.splice(pointer, 0, a[j]);\n  \t\t\t\t\t\t}\n  \t\t\t\t\t\tpointer = pointer + a.length;\n  \t\t\t\t\t}\n  \t\t\t\t\tcountInsert = 0;\n  \t\t\t\t\tcountDelete = 0;\n  \t\t\t\t\ttextDelete = \"\";\n  \t\t\t\t\ttextInsert = \"\";\n  \t\t\t\t\tbreak;\n  \t\t\t}\n  \t\t\tpointer++;\n  \t\t}\n  \t\tdiffs.pop(); // Remove the dummy entry at the end.\n\n  \t\treturn diffs;\n  \t};\n\n  \t/**\n    * Find the 'middle snake' of a diff, split the problem in two\n    * and return the recursively constructed diff.\n    * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n    * @param {string} text1 Old string to be diffed.\n    * @param {string} text2 New string to be diffed.\n    * @param {number} deadline Time at which to bail if not yet complete.\n    * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n    * @private\n    */\n  \tDiffMatchPatch.prototype.diffBisect = function (text1, text2, deadline) {\n  \t\tvar text1Length, text2Length, maxD, vOffset, vLength, v1, v2, x, delta, front, k1start, k1end, k2start, k2end, k2Offset, k1Offset, x1, x2, y1, y2, d, k1, k2;\n\n  \t\t// Cache the text lengths to prevent multiple calls.\n  \t\ttext1Length = text1.length;\n  \t\ttext2Length = text2.length;\n  \t\tmaxD = Math.ceil((text1Length + text2Length) / 2);\n  \t\tvOffset = maxD;\n  \t\tvLength = 2 * maxD;\n  \t\tv1 = new Array(vLength);\n  \t\tv2 = new Array(vLength);\n\n  \t\t// Setting all elements to -1 is faster in Chrome & Firefox than mixing\n  \t\t// integers and undefined.\n  \t\tfor (x = 0; x < vLength; x++) {\n  \t\t\tv1[x] = -1;\n  \t\t\tv2[x] = -1;\n  \t\t}\n  \t\tv1[vOffset + 1] = 0;\n  \t\tv2[vOffset + 1] = 0;\n  \t\tdelta = text1Length - text2Length;\n\n  \t\t// If the total number of characters is odd, then the front path will collide\n  \t\t// with the reverse path.\n  \t\tfront = delta % 2 !== 0;\n\n  \t\t// Offsets for start and end of k loop.\n  \t\t// Prevents mapping of space beyond the grid.\n  \t\tk1start = 0;\n  \t\tk1end = 0;\n  \t\tk2start = 0;\n  \t\tk2end = 0;\n  \t\tfor (d = 0; d < maxD; d++) {\n\n  \t\t\t// Bail out if deadline is reached.\n  \t\t\tif (new Date().getTime() > deadline) {\n  \t\t\t\tbreak;\n  \t\t\t}\n\n  \t\t\t// Walk the front path one step.\n  \t\t\tfor (k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n  \t\t\t\tk1Offset = vOffset + k1;\n  \t\t\t\tif (k1 === -d || k1 !== d && v1[k1Offset - 1] < v1[k1Offset + 1]) {\n  \t\t\t\t\tx1 = v1[k1Offset + 1];\n  \t\t\t\t} else {\n  \t\t\t\t\tx1 = v1[k1Offset - 1] + 1;\n  \t\t\t\t}\n  \t\t\t\ty1 = x1 - k1;\n  \t\t\t\twhile (x1 < text1Length && y1 < text2Length && text1.charAt(x1) === text2.charAt(y1)) {\n  \t\t\t\t\tx1++;\n  \t\t\t\t\ty1++;\n  \t\t\t\t}\n  \t\t\t\tv1[k1Offset] = x1;\n  \t\t\t\tif (x1 > text1Length) {\n\n  \t\t\t\t\t// Ran off the right of the graph.\n  \t\t\t\t\tk1end += 2;\n  \t\t\t\t} else if (y1 > text2Length) {\n\n  \t\t\t\t\t// Ran off the bottom of the graph.\n  \t\t\t\t\tk1start += 2;\n  \t\t\t\t} else if (front) {\n  \t\t\t\t\tk2Offset = vOffset + delta - k1;\n  \t\t\t\t\tif (k2Offset >= 0 && k2Offset < vLength && v2[k2Offset] !== -1) {\n\n  \t\t\t\t\t\t// Mirror x2 onto top-left coordinate system.\n  \t\t\t\t\t\tx2 = text1Length - v2[k2Offset];\n  \t\t\t\t\t\tif (x1 >= x2) {\n\n  \t\t\t\t\t\t\t// Overlap detected.\n  \t\t\t\t\t\t\treturn this.diffBisectSplit(text1, text2, x1, y1, deadline);\n  \t\t\t\t\t\t}\n  \t\t\t\t\t}\n  \t\t\t\t}\n  \t\t\t}\n\n  \t\t\t// Walk the reverse path one step.\n  \t\t\tfor (k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n  \t\t\t\tk2Offset = vOffset + k2;\n  \t\t\t\tif (k2 === -d || k2 !== d && v2[k2Offset - 1] < v2[k2Offset + 1]) {\n  \t\t\t\t\tx2 = v2[k2Offset + 1];\n  \t\t\t\t} else {\n  \t\t\t\t\tx2 = v2[k2Offset - 1] + 1;\n  \t\t\t\t}\n  \t\t\t\ty2 = x2 - k2;\n  \t\t\t\twhile (x2 < text1Length && y2 < text2Length && text1.charAt(text1Length - x2 - 1) === text2.charAt(text2Length - y2 - 1)) {\n  \t\t\t\t\tx2++;\n  \t\t\t\t\ty2++;\n  \t\t\t\t}\n  \t\t\t\tv2[k2Offset] = x2;\n  \t\t\t\tif (x2 > text1Length) {\n\n  \t\t\t\t\t// Ran off the left of the graph.\n  \t\t\t\t\tk2end += 2;\n  \t\t\t\t} else if (y2 > text2Length) {\n\n  \t\t\t\t\t// Ran off the top of the graph.\n  \t\t\t\t\tk2start += 2;\n  \t\t\t\t} else if (!front) {\n  \t\t\t\t\tk1Offset = vOffset + delta - k2;\n  \t\t\t\t\tif (k1Offset >= 0 && k1Offset < vLength && v1[k1Offset] !== -1) {\n  \t\t\t\t\t\tx1 = v1[k1Offset];\n  \t\t\t\t\t\ty1 = vOffset + x1 - k1Offset;\n\n  \t\t\t\t\t\t// Mirror x2 onto top-left coordinate system.\n  \t\t\t\t\t\tx2 = text1Length - x2;\n  \t\t\t\t\t\tif (x1 >= x2) {\n\n  \t\t\t\t\t\t\t// Overlap detected.\n  \t\t\t\t\t\t\treturn this.diffBisectSplit(text1, text2, x1, y1, deadline);\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// Diff took too long and hit the deadline or\n  \t\t// number of diffs equals number of characters, no commonality at all.\n  \t\treturn [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];\n  \t};\n\n  \t/**\n    * Given the location of the 'middle snake', split the diff in two parts\n    * and recurse.\n    * @param {string} text1 Old string to be diffed.\n    * @param {string} text2 New string to be diffed.\n    * @param {number} x Index of split point in text1.\n    * @param {number} y Index of split point in text2.\n    * @param {number} deadline Time at which to bail if not yet complete.\n    * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n    * @private\n    */\n  \tDiffMatchPatch.prototype.diffBisectSplit = function (text1, text2, x, y, deadline) {\n  \t\tvar text1a, text1b, text2a, text2b, diffs, diffsb;\n  \t\ttext1a = text1.substring(0, x);\n  \t\ttext2a = text2.substring(0, y);\n  \t\ttext1b = text1.substring(x);\n  \t\ttext2b = text2.substring(y);\n\n  \t\t// Compute both diffs serially.\n  \t\tdiffs = this.DiffMain(text1a, text2a, false, deadline);\n  \t\tdiffsb = this.DiffMain(text1b, text2b, false, deadline);\n\n  \t\treturn diffs.concat(diffsb);\n  \t};\n\n  \t/**\n    * Reduce the number of edits by eliminating semantically trivial equalities.\n    * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n    */\n  \tDiffMatchPatch.prototype.diffCleanupSemantic = function (diffs) {\n  \t\tvar changes, equalities, equalitiesLength, lastequality, pointer, lengthInsertions2, lengthDeletions2, lengthInsertions1, lengthDeletions1, deletion, insertion, overlapLength1, overlapLength2;\n  \t\tchanges = false;\n  \t\tequalities = []; // Stack of indices where equalities are found.\n  \t\tequalitiesLength = 0; // Keeping our own length var is faster in JS.\n  \t\t/** @type {?string} */\n  \t\tlastequality = null;\n\n  \t\t// Always equal to diffs[equalities[equalitiesLength - 1]][1]\n  \t\tpointer = 0; // Index of current position.\n\n  \t\t// Number of characters that changed prior to the equality.\n  \t\tlengthInsertions1 = 0;\n  \t\tlengthDeletions1 = 0;\n\n  \t\t// Number of characters that changed after the equality.\n  \t\tlengthInsertions2 = 0;\n  \t\tlengthDeletions2 = 0;\n  \t\twhile (pointer < diffs.length) {\n  \t\t\tif (diffs[pointer][0] === DIFF_EQUAL) {\n  \t\t\t\t// Equality found.\n  \t\t\t\tequalities[equalitiesLength++] = pointer;\n  \t\t\t\tlengthInsertions1 = lengthInsertions2;\n  \t\t\t\tlengthDeletions1 = lengthDeletions2;\n  \t\t\t\tlengthInsertions2 = 0;\n  \t\t\t\tlengthDeletions2 = 0;\n  \t\t\t\tlastequality = diffs[pointer][1];\n  \t\t\t} else {\n  \t\t\t\t// An insertion or deletion.\n  \t\t\t\tif (diffs[pointer][0] === DIFF_INSERT) {\n  \t\t\t\t\tlengthInsertions2 += diffs[pointer][1].length;\n  \t\t\t\t} else {\n  \t\t\t\t\tlengthDeletions2 += diffs[pointer][1].length;\n  \t\t\t\t}\n\n  \t\t\t\t// Eliminate an equality that is smaller or equal to the edits on both\n  \t\t\t\t// sides of it.\n  \t\t\t\tif (lastequality && lastequality.length <= Math.max(lengthInsertions1, lengthDeletions1) && lastequality.length <= Math.max(lengthInsertions2, lengthDeletions2)) {\n\n  \t\t\t\t\t// Duplicate record.\n  \t\t\t\t\tdiffs.splice(equalities[equalitiesLength - 1], 0, [DIFF_DELETE, lastequality]);\n\n  \t\t\t\t\t// Change second copy to insert.\n  \t\t\t\t\tdiffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n\n  \t\t\t\t\t// Throw away the equality we just deleted.\n  \t\t\t\t\tequalitiesLength--;\n\n  \t\t\t\t\t// Throw away the previous equality (it needs to be reevaluated).\n  \t\t\t\t\tequalitiesLength--;\n  \t\t\t\t\tpointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n\n  \t\t\t\t\t// Reset the counters.\n  \t\t\t\t\tlengthInsertions1 = 0;\n  \t\t\t\t\tlengthDeletions1 = 0;\n  \t\t\t\t\tlengthInsertions2 = 0;\n  \t\t\t\t\tlengthDeletions2 = 0;\n  \t\t\t\t\tlastequality = null;\n  \t\t\t\t\tchanges = true;\n  \t\t\t\t}\n  \t\t\t}\n  \t\t\tpointer++;\n  \t\t}\n\n  \t\t// Normalize the diff.\n  \t\tif (changes) {\n  \t\t\tthis.diffCleanupMerge(diffs);\n  \t\t}\n\n  \t\t// Find any overlaps between deletions and insertions.\n  \t\t// e.g: <del>abcxxx</del><ins>xxxdef</ins>\n  \t\t//   -> <del>abc</del>xxx<ins>def</ins>\n  \t\t// e.g: <del>xxxabc</del><ins>defxxx</ins>\n  \t\t//   -> <ins>def</ins>xxx<del>abc</del>\n  \t\t// Only extract an overlap if it is as big as the edit ahead or behind it.\n  \t\tpointer = 1;\n  \t\twhile (pointer < diffs.length) {\n  \t\t\tif (diffs[pointer - 1][0] === DIFF_DELETE && diffs[pointer][0] === DIFF_INSERT) {\n  \t\t\t\tdeletion = diffs[pointer - 1][1];\n  \t\t\t\tinsertion = diffs[pointer][1];\n  \t\t\t\toverlapLength1 = this.diffCommonOverlap(deletion, insertion);\n  \t\t\t\toverlapLength2 = this.diffCommonOverlap(insertion, deletion);\n  \t\t\t\tif (overlapLength1 >= overlapLength2) {\n  \t\t\t\t\tif (overlapLength1 >= deletion.length / 2 || overlapLength1 >= insertion.length / 2) {\n\n  \t\t\t\t\t\t// Overlap found.  Insert an equality and trim the surrounding edits.\n  \t\t\t\t\t\tdiffs.splice(pointer, 0, [DIFF_EQUAL, insertion.substring(0, overlapLength1)]);\n  \t\t\t\t\t\tdiffs[pointer - 1][1] = deletion.substring(0, deletion.length - overlapLength1);\n  \t\t\t\t\t\tdiffs[pointer + 1][1] = insertion.substring(overlapLength1);\n  \t\t\t\t\t\tpointer++;\n  \t\t\t\t\t}\n  \t\t\t\t} else {\n  \t\t\t\t\tif (overlapLength2 >= deletion.length / 2 || overlapLength2 >= insertion.length / 2) {\n\n  \t\t\t\t\t\t// Reverse overlap found.\n  \t\t\t\t\t\t// Insert an equality and swap and trim the surrounding edits.\n  \t\t\t\t\t\tdiffs.splice(pointer, 0, [DIFF_EQUAL, deletion.substring(0, overlapLength2)]);\n\n  \t\t\t\t\t\tdiffs[pointer - 1][0] = DIFF_INSERT;\n  \t\t\t\t\t\tdiffs[pointer - 1][1] = insertion.substring(0, insertion.length - overlapLength2);\n  \t\t\t\t\t\tdiffs[pointer + 1][0] = DIFF_DELETE;\n  \t\t\t\t\t\tdiffs[pointer + 1][1] = deletion.substring(overlapLength2);\n  \t\t\t\t\t\tpointer++;\n  \t\t\t\t\t}\n  \t\t\t\t}\n  \t\t\t\tpointer++;\n  \t\t\t}\n  \t\t\tpointer++;\n  \t\t}\n  \t};\n\n  \t/**\n    * Determine if the suffix of one string is the prefix of another.\n    * @param {string} text1 First string.\n    * @param {string} text2 Second string.\n    * @return {number} The number of characters common to the end of the first\n    *     string and the start of the second string.\n    * @private\n    */\n  \tDiffMatchPatch.prototype.diffCommonOverlap = function (text1, text2) {\n  \t\tvar text1Length, text2Length, textLength, best, length, pattern, found;\n\n  \t\t// Cache the text lengths to prevent multiple calls.\n  \t\ttext1Length = text1.length;\n  \t\ttext2Length = text2.length;\n\n  \t\t// Eliminate the null case.\n  \t\tif (text1Length === 0 || text2Length === 0) {\n  \t\t\treturn 0;\n  \t\t}\n\n  \t\t// Truncate the longer string.\n  \t\tif (text1Length > text2Length) {\n  \t\t\ttext1 = text1.substring(text1Length - text2Length);\n  \t\t} else if (text1Length < text2Length) {\n  \t\t\ttext2 = text2.substring(0, text1Length);\n  \t\t}\n  \t\ttextLength = Math.min(text1Length, text2Length);\n\n  \t\t// Quick check for the worst case.\n  \t\tif (text1 === text2) {\n  \t\t\treturn textLength;\n  \t\t}\n\n  \t\t// Start by looking for a single character match\n  \t\t// and increase length until no match is found.\n  \t\t// Performance analysis: https://neil.fraser.name/news/2010/11/04/\n  \t\tbest = 0;\n  \t\tlength = 1;\n  \t\twhile (true) {\n  \t\t\tpattern = text1.substring(textLength - length);\n  \t\t\tfound = text2.indexOf(pattern);\n  \t\t\tif (found === -1) {\n  \t\t\t\treturn best;\n  \t\t\t}\n  \t\t\tlength += found;\n  \t\t\tif (found === 0 || text1.substring(textLength - length) === text2.substring(0, length)) {\n  \t\t\t\tbest = length;\n  \t\t\t\tlength++;\n  \t\t\t}\n  \t\t}\n  \t};\n\n  \t/**\n    * Split two texts into an array of strings.  Reduce the texts to a string of\n    * hashes where each Unicode character represents one line.\n    * @param {string} text1 First string.\n    * @param {string} text2 Second string.\n    * @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}\n    *     An object containing the encoded text1, the encoded text2 and\n    *     the array of unique strings.\n    *     The zeroth element of the array of unique strings is intentionally blank.\n    * @private\n    */\n  \tDiffMatchPatch.prototype.diffLinesToChars = function (text1, text2) {\n  \t\tvar lineArray, lineHash, chars1, chars2;\n  \t\tlineArray = []; // E.g. lineArray[4] === 'Hello\\n'\n  \t\tlineHash = {}; // E.g. lineHash['Hello\\n'] === 4\n\n  \t\t// '\\x00' is a valid character, but various debuggers don't like it.\n  \t\t// So we'll insert a junk entry to avoid generating a null character.\n  \t\tlineArray[0] = \"\";\n\n  \t\t/**\n     * Split a text into an array of strings.  Reduce the texts to a string of\n     * hashes where each Unicode character represents one line.\n     * Modifies linearray and linehash through being a closure.\n     * @param {string} text String to encode.\n     * @return {string} Encoded string.\n     * @private\n     */\n  \t\tfunction diffLinesToCharsMunge(text) {\n  \t\t\tvar chars, lineStart, lineEnd, lineArrayLength, line;\n  \t\t\tchars = \"\";\n\n  \t\t\t// Walk the text, pulling out a substring for each line.\n  \t\t\t// text.split('\\n') would would temporarily double our memory footprint.\n  \t\t\t// Modifying text would create many large strings to garbage collect.\n  \t\t\tlineStart = 0;\n  \t\t\tlineEnd = -1;\n\n  \t\t\t// Keeping our own length variable is faster than looking it up.\n  \t\t\tlineArrayLength = lineArray.length;\n  \t\t\twhile (lineEnd < text.length - 1) {\n  \t\t\t\tlineEnd = text.indexOf(\"\\n\", lineStart);\n  \t\t\t\tif (lineEnd === -1) {\n  \t\t\t\t\tlineEnd = text.length - 1;\n  \t\t\t\t}\n  \t\t\t\tline = text.substring(lineStart, lineEnd + 1);\n  \t\t\t\tlineStart = lineEnd + 1;\n\n  \t\t\t\tif (lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) : lineHash[line] !== undefined) {\n  \t\t\t\t\tchars += String.fromCharCode(lineHash[line]);\n  \t\t\t\t} else {\n  \t\t\t\t\tchars += String.fromCharCode(lineArrayLength);\n  \t\t\t\t\tlineHash[line] = lineArrayLength;\n  \t\t\t\t\tlineArray[lineArrayLength++] = line;\n  \t\t\t\t}\n  \t\t\t}\n  \t\t\treturn chars;\n  \t\t}\n\n  \t\tchars1 = diffLinesToCharsMunge(text1);\n  \t\tchars2 = diffLinesToCharsMunge(text2);\n  \t\treturn {\n  \t\t\tchars1: chars1,\n  \t\t\tchars2: chars2,\n  \t\t\tlineArray: lineArray\n  \t\t};\n  \t};\n\n  \t/**\n    * Rehydrate the text in a diff from a string of line hashes to real lines of\n    * text.\n    * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n    * @param {!Array.<string>} lineArray Array of unique strings.\n    * @private\n    */\n  \tDiffMatchPatch.prototype.diffCharsToLines = function (diffs, lineArray) {\n  \t\tvar x, chars, text, y;\n  \t\tfor (x = 0; x < diffs.length; x++) {\n  \t\t\tchars = diffs[x][1];\n  \t\t\ttext = [];\n  \t\t\tfor (y = 0; y < chars.length; y++) {\n  \t\t\t\ttext[y] = lineArray[chars.charCodeAt(y)];\n  \t\t\t}\n  \t\t\tdiffs[x][1] = text.join(\"\");\n  \t\t}\n  \t};\n\n  \t/**\n    * Reorder and merge like edit sections.  Merge equalities.\n    * Any edit section can move as long as it doesn't cross an equality.\n    * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n    */\n  \tDiffMatchPatch.prototype.diffCleanupMerge = function (diffs) {\n  \t\tvar pointer, countDelete, countInsert, textInsert, textDelete, commonlength, changes, diffPointer, position;\n  \t\tdiffs.push([DIFF_EQUAL, \"\"]); // Add a dummy entry at the end.\n  \t\tpointer = 0;\n  \t\tcountDelete = 0;\n  \t\tcountInsert = 0;\n  \t\ttextDelete = \"\";\n  \t\ttextInsert = \"\";\n\n  \t\twhile (pointer < diffs.length) {\n  \t\t\tswitch (diffs[pointer][0]) {\n  \t\t\t\tcase DIFF_INSERT:\n  \t\t\t\t\tcountInsert++;\n  \t\t\t\t\ttextInsert += diffs[pointer][1];\n  \t\t\t\t\tpointer++;\n  \t\t\t\t\tbreak;\n  \t\t\t\tcase DIFF_DELETE:\n  \t\t\t\t\tcountDelete++;\n  \t\t\t\t\ttextDelete += diffs[pointer][1];\n  \t\t\t\t\tpointer++;\n  \t\t\t\t\tbreak;\n  \t\t\t\tcase DIFF_EQUAL:\n\n  \t\t\t\t\t// Upon reaching an equality, check for prior redundancies.\n  \t\t\t\t\tif (countDelete + countInsert > 1) {\n  \t\t\t\t\t\tif (countDelete !== 0 && countInsert !== 0) {\n\n  \t\t\t\t\t\t\t// Factor out any common prefixes.\n  \t\t\t\t\t\t\tcommonlength = this.diffCommonPrefix(textInsert, textDelete);\n  \t\t\t\t\t\t\tif (commonlength !== 0) {\n  \t\t\t\t\t\t\t\tif (pointer - countDelete - countInsert > 0 && diffs[pointer - countDelete - countInsert - 1][0] === DIFF_EQUAL) {\n  \t\t\t\t\t\t\t\t\tdiffs[pointer - countDelete - countInsert - 1][1] += textInsert.substring(0, commonlength);\n  \t\t\t\t\t\t\t\t} else {\n  \t\t\t\t\t\t\t\t\tdiffs.splice(0, 0, [DIFF_EQUAL, textInsert.substring(0, commonlength)]);\n  \t\t\t\t\t\t\t\t\tpointer++;\n  \t\t\t\t\t\t\t\t}\n  \t\t\t\t\t\t\t\ttextInsert = textInsert.substring(commonlength);\n  \t\t\t\t\t\t\t\ttextDelete = textDelete.substring(commonlength);\n  \t\t\t\t\t\t\t}\n\n  \t\t\t\t\t\t\t// Factor out any common suffixies.\n  \t\t\t\t\t\t\tcommonlength = this.diffCommonSuffix(textInsert, textDelete);\n  \t\t\t\t\t\t\tif (commonlength !== 0) {\n  \t\t\t\t\t\t\t\tdiffs[pointer][1] = textInsert.substring(textInsert.length - commonlength) + diffs[pointer][1];\n  \t\t\t\t\t\t\t\ttextInsert = textInsert.substring(0, textInsert.length - commonlength);\n  \t\t\t\t\t\t\t\ttextDelete = textDelete.substring(0, textDelete.length - commonlength);\n  \t\t\t\t\t\t\t}\n  \t\t\t\t\t\t}\n\n  \t\t\t\t\t\t// Delete the offending records and add the merged ones.\n  \t\t\t\t\t\tif (countDelete === 0) {\n  \t\t\t\t\t\t\tdiffs.splice(pointer - countInsert, countDelete + countInsert, [DIFF_INSERT, textInsert]);\n  \t\t\t\t\t\t} else if (countInsert === 0) {\n  \t\t\t\t\t\t\tdiffs.splice(pointer - countDelete, countDelete + countInsert, [DIFF_DELETE, textDelete]);\n  \t\t\t\t\t\t} else {\n  \t\t\t\t\t\t\tdiffs.splice(pointer - countDelete - countInsert, countDelete + countInsert, [DIFF_DELETE, textDelete], [DIFF_INSERT, textInsert]);\n  \t\t\t\t\t\t}\n  \t\t\t\t\t\tpointer = pointer - countDelete - countInsert + (countDelete ? 1 : 0) + (countInsert ? 1 : 0) + 1;\n  \t\t\t\t\t} else if (pointer !== 0 && diffs[pointer - 1][0] === DIFF_EQUAL) {\n\n  \t\t\t\t\t\t// Merge this equality with the previous one.\n  \t\t\t\t\t\tdiffs[pointer - 1][1] += diffs[pointer][1];\n  \t\t\t\t\t\tdiffs.splice(pointer, 1);\n  \t\t\t\t\t} else {\n  \t\t\t\t\t\tpointer++;\n  \t\t\t\t\t}\n  \t\t\t\t\tcountInsert = 0;\n  \t\t\t\t\tcountDelete = 0;\n  \t\t\t\t\ttextDelete = \"\";\n  \t\t\t\t\ttextInsert = \"\";\n  \t\t\t\t\tbreak;\n  \t\t\t}\n  \t\t}\n  \t\tif (diffs[diffs.length - 1][1] === \"\") {\n  \t\t\tdiffs.pop(); // Remove the dummy entry at the end.\n  \t\t}\n\n  \t\t// Second pass: look for single edits surrounded on both sides by equalities\n  \t\t// which can be shifted sideways to eliminate an equality.\n  \t\t// e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC\n  \t\tchanges = false;\n  \t\tpointer = 1;\n\n  \t\t// Intentionally ignore the first and last element (don't need checking).\n  \t\twhile (pointer < diffs.length - 1) {\n  \t\t\tif (diffs[pointer - 1][0] === DIFF_EQUAL && diffs[pointer + 1][0] === DIFF_EQUAL) {\n\n  \t\t\t\tdiffPointer = diffs[pointer][1];\n  \t\t\t\tposition = diffPointer.substring(diffPointer.length - diffs[pointer - 1][1].length);\n\n  \t\t\t\t// This is a single edit surrounded by equalities.\n  \t\t\t\tif (position === diffs[pointer - 1][1]) {\n\n  \t\t\t\t\t// Shift the edit over the previous equality.\n  \t\t\t\t\tdiffs[pointer][1] = diffs[pointer - 1][1] + diffs[pointer][1].substring(0, diffs[pointer][1].length - diffs[pointer - 1][1].length);\n  \t\t\t\t\tdiffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n  \t\t\t\t\tdiffs.splice(pointer - 1, 1);\n  \t\t\t\t\tchanges = true;\n  \t\t\t\t} else if (diffPointer.substring(0, diffs[pointer + 1][1].length) === diffs[pointer + 1][1]) {\n\n  \t\t\t\t\t// Shift the edit over the next equality.\n  \t\t\t\t\tdiffs[pointer - 1][1] += diffs[pointer + 1][1];\n  \t\t\t\t\tdiffs[pointer][1] = diffs[pointer][1].substring(diffs[pointer + 1][1].length) + diffs[pointer + 1][1];\n  \t\t\t\t\tdiffs.splice(pointer + 1, 1);\n  \t\t\t\t\tchanges = true;\n  \t\t\t\t}\n  \t\t\t}\n  \t\t\tpointer++;\n  \t\t}\n\n  \t\t// If shifts were made, the diff needs reordering and another shift sweep.\n  \t\tif (changes) {\n  \t\t\tthis.diffCleanupMerge(diffs);\n  \t\t}\n  \t};\n\n  \treturn function (o, n) {\n  \t\tvar diff, output, text;\n  \t\tdiff = new DiffMatchPatch();\n  \t\toutput = diff.DiffMain(o, n);\n  \t\tdiff.diffCleanupEfficiency(output);\n  \t\ttext = diff.diffPrettyHtml(output);\n\n  \t\treturn text;\n  \t};\n  }();\n\n}((function() { return this; }())));\n"
  },
  {
    "path": "webpack.config.js",
    "content": "/* global __dirname, require, module */\n'use strict'\n\nconst webpack = require('webpack')\nconst path = require('path')\nconst env = require('yargs').argv.env\nconst ExtractTextPlugin = require('extract-text-webpack-plugin')\nconst extractSass = new ExtractTextPlugin({filename: 'noty.css'})\nconst UglifyJsPlugin = webpack.optimize.UglifyJsPlugin\nconst BrowserSyncPlugin = require('browser-sync-webpack-plugin')\n\nlet libraryName = 'Noty'\nlet plugins = []\nlet outputFile\n\nplugins.push(extractSass)\nplugins.push(new webpack.DefinePlugin({\n  VERSION: JSON.stringify(require('./package.json').version)\n}))\n\nif (env === 'build') {\n  plugins.push(new UglifyJsPlugin({minimize: true, sourceMap: true}))\n  outputFile = libraryName.toLowerCase() + '.min.js'\n} else {\n  outputFile = libraryName.toLowerCase() + '.js'\n  plugins.push(new BrowserSyncPlugin({\n    ui: false,\n    host: 'localhost',\n    port: 3000,\n    server: {\n      baseDir: ['./'],\n      index: 'demo/index.html'\n    }\n  }))\n}\n\nconst config = {\n  entry: path.join(__dirname, '/src/index.js'),\n  devtool: 'source-map',\n  output: {\n    path: path.join(__dirname, '/lib'),\n    filename: outputFile,\n    library: libraryName,\n    libraryTarget: 'umd',\n    umdNamedDefine: true\n  },\n  module: {\n    rules: [\n      {\n        // standard-loader as a preloader\n        enforce: 'pre',\n        test: /\\.js?$/,\n        loader: 'standard-loader',\n        exclude: /(node_modules|bower_components)/,\n        options: {\n          error: false,\n          snazzy: true,\n          parser: 'babel-eslint'\n        }\n      },\n      {\n        test: /\\.js$/,\n        loader: 'babel-loader',\n        exclude: /(node_modules|bower_components)/\n      },\n      {\n        test: /\\.scss$/,\n        use: extractSass.extract(['css-loader', 'postcss-loader', 'sass-loader']),\n        exclude: /(node_modules|bower_components)/\n      }\n    ]\n  },\n  resolve: {\n    modules: [path.resolve('./src'), path.resolve('./node_modules')],\n    extensions: ['.js', '.scss']\n  },\n  plugins: plugins\n}\n\nmodule.exports = config\n"
  }
]